diff --git a/tests/e2e/runners_test.go b/tests/e2e/runners_test.go index 28cd99c..d606f13 100644 --- a/tests/e2e/runners_test.go +++ b/tests/e2e/runners_test.go @@ -12,6 +12,7 @@ import ( "io" "net/http" "strings" + "time" ) func (s *E2ETestSuite) TestProvideRunnerRoute() { @@ -210,6 +211,35 @@ func (s *E2ETestSuite) TestCopyFilesRoute() { }) } +func (s *E2ETestSuite) TestRunnerGetsDestroyedAfterInactivityTimeout() { + inactivityTimeout := 5 // seconds + runnerID, err := ProvideRunner(&dto.RunnerRequest{ + ExecutionEnvironmentId: tests.DefaultEnvironmentIDAsInteger, + InactivityTimeout: inactivityTimeout, + }) + s.Require().NoError(err) + + executionTerminated := make(chan bool) + var lastMessage *dto.WebSocketMessage + go func() { + webSocketURL, err := ProvideWebSocketURL(&s.Suite, runnerID, &dto.ExecutionRequest{Command: "sleep infinity"}) + s.Require().NoError(err) + connection, err := ConnectToWebSocket(webSocketURL) + s.Require().NoError(err) + + messages, err := helpers.ReceiveAllWebSocketMessages(connection) + if !s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err) { + s.Fail("websocket abnormal closure") + } + controlMessages := helpers.WebSocketControlMessages(messages) + s.Require().NotEmpty(controlMessages) + lastMessage = controlMessages[len(controlMessages)-1] + executionTerminated <- true + }() + s.Require().True(tests.ChannelReceivesSomething(executionTerminated, time.Duration(inactivityTimeout+5)*time.Second)) + s.Equal(dto.WebSocketMetaTimeout, lastMessage.Type) +} + func (s *E2ETestSuite) assertFileContent(runnerID, fileName string, expectedContent string) { stdout, stderr := s.PrintContentOfFileOnRunner(runnerID, fileName) s.Equal(expectedContent, stdout)