Parametrize e2e tests to also check AWS environments.
- Fix destroy runner after timeout. - Add file deletion
This commit is contained in:
@@ -18,81 +18,95 @@ import (
|
||||
)
|
||||
|
||||
func (s *E2ETestSuite) TestExecuteCommandRoute() {
|
||||
runnerID, err := ProvideRunner(&dto.RunnerRequest{
|
||||
ExecutionEnvironmentID: tests.DefaultEnvironmentIDAsInteger,
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
for _, environmentID := range environmentIDs {
|
||||
s.Run(environmentID.ToString(), func() {
|
||||
runnerID, err := ProvideRunner(&dto.RunnerRequest{ExecutionEnvironmentID: int(environmentID)})
|
||||
s.Require().NoError(err)
|
||||
|
||||
webSocketURL, err := ProvideWebSocketURL(&s.Suite, runnerID, &dto.ExecutionRequest{Command: "true"})
|
||||
s.Require().NoError(err)
|
||||
s.NotEqual("", webSocketURL)
|
||||
webSocketURL, err := ProvideWebSocketURL(&s.Suite, runnerID, &dto.ExecutionRequest{Command: "true"})
|
||||
s.Require().NoError(err)
|
||||
s.NotEqual("", webSocketURL)
|
||||
|
||||
var connection *websocket.Conn
|
||||
var connectionClosed bool
|
||||
var connection *websocket.Conn
|
||||
var connectionClosed bool
|
||||
|
||||
connection, err = ConnectToWebSocket(webSocketURL)
|
||||
s.Require().NoError(err, "websocket connects")
|
||||
closeHandler := connection.CloseHandler()
|
||||
connection.SetCloseHandler(func(code int, text string) error {
|
||||
connectionClosed = true
|
||||
return closeHandler(code, text)
|
||||
})
|
||||
connection, err = ConnectToWebSocket(webSocketURL)
|
||||
s.Require().NoError(err, "websocket connects")
|
||||
closeHandler := connection.CloseHandler()
|
||||
connection.SetCloseHandler(func(code int, text string) error {
|
||||
connectionClosed = true
|
||||
return closeHandler(code, text)
|
||||
})
|
||||
|
||||
startMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
s.Require().NoError(err)
|
||||
s.Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaStart}, startMessage)
|
||||
startMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
s.Require().NoError(err)
|
||||
s.Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaStart}, startMessage)
|
||||
|
||||
exitMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
s.Require().NoError(err)
|
||||
s.Equal(&dto.WebSocketMessage{Type: dto.WebSocketExit}, exitMessage)
|
||||
exitMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
s.Require().NoError(err)
|
||||
s.Equal(&dto.WebSocketMessage{Type: dto.WebSocketExit}, exitMessage)
|
||||
|
||||
_, err = helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err)
|
||||
_, err = helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err)
|
||||
|
||||
_, _, err = connection.ReadMessage()
|
||||
s.True(websocket.IsCloseError(err, websocket.CloseNormalClosure))
|
||||
s.True(connectionClosed, "connection should be closed")
|
||||
_, _, err = connection.ReadMessage()
|
||||
s.True(websocket.IsCloseError(err, websocket.CloseNormalClosure))
|
||||
s.True(connectionClosed, "connection should be closed")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestOutputToStdout() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, &dto.ExecutionRequest{Command: "echo Hello World"})
|
||||
s.Require().NoError(err)
|
||||
for _, environmentID := range environmentIDs {
|
||||
s.Run(environmentID.ToString(), func() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, environmentID,
|
||||
&dto.ExecutionRequest{Command: "echo -n Hello World"})
|
||||
s.Require().NoError(err)
|
||||
|
||||
messages, err := helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err)
|
||||
messages, err := helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err)
|
||||
|
||||
controlMessages := helpers.WebSocketControlMessages(messages)
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaStart}, controlMessages[0])
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketExit}, controlMessages[1])
|
||||
controlMessages := helpers.WebSocketControlMessages(messages)
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaStart}, controlMessages[0])
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketExit}, controlMessages[1])
|
||||
|
||||
stdout, _, _ := helpers.WebSocketOutputMessages(messages)
|
||||
s.Require().Equal("Hello World\r\n", stdout)
|
||||
stdout, _, _ := helpers.WebSocketOutputMessages(messages)
|
||||
s.Require().Equal("Hello World", stdout)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestOutputToStderr() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, &dto.ExecutionRequest{Command: "cat -invalid"})
|
||||
s.Require().NoError(err)
|
||||
for _, environmentID := range environmentIDs {
|
||||
s.Run(environmentID.ToString(), func() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, environmentID,
|
||||
&dto.ExecutionRequest{Command: "cat -invalid"})
|
||||
s.Require().NoError(err)
|
||||
|
||||
messages, err := helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err)
|
||||
messages, err := helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err)
|
||||
|
||||
controlMessages := helpers.WebSocketControlMessages(messages)
|
||||
s.Require().Equal(2, len(controlMessages))
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaStart}, controlMessages[0])
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketExit, ExitCode: 1}, controlMessages[1])
|
||||
controlMessages := helpers.WebSocketControlMessages(messages)
|
||||
s.Require().Equal(2, len(controlMessages))
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaStart}, controlMessages[0])
|
||||
s.Require().Equal(&dto.WebSocketMessage{Type: dto.WebSocketExit, ExitCode: 1}, controlMessages[1])
|
||||
|
||||
stdout, stderr, errors := helpers.WebSocketOutputMessages(messages)
|
||||
s.NotContains(stdout, "cat: invalid option", "Stdout should not contain the error")
|
||||
s.Contains(stderr, "cat: invalid option", "Stderr should contain the error")
|
||||
s.Empty(errors)
|
||||
stdout, stderr, errors := helpers.WebSocketOutputMessages(messages)
|
||||
s.NotContains(stdout, "cat: invalid option", "Stdout should not contain the error")
|
||||
s.Contains(stderr, "cat: invalid option", "Stderr should contain the error")
|
||||
s.Empty(errors)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// AWS environments do not support stdin at this moment therefore they cannot take this test.
|
||||
func (s *E2ETestSuite) TestCommandHead() {
|
||||
hello := "Hello World!"
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, &dto.ExecutionRequest{Command: "head -n 1"})
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, tests.DefaultEnvironmentIDAsInteger,
|
||||
&dto.ExecutionRequest{Command: "head -n 1"})
|
||||
s.Require().NoError(err)
|
||||
|
||||
startMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
@@ -110,49 +124,58 @@ func (s *E2ETestSuite) TestCommandHead() {
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestCommandReturnsAfterTimeout() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, &dto.ExecutionRequest{Command: "sleep 4", TimeLimit: 1})
|
||||
s.Require().NoError(err)
|
||||
for _, environmentID := range environmentIDs {
|
||||
s.Run(environmentID.ToString(), func() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, environmentID,
|
||||
&dto.ExecutionRequest{Command: "sleep 4", TimeLimit: 1})
|
||||
s.Require().NoError(err)
|
||||
|
||||
c := make(chan bool)
|
||||
var messages []*dto.WebSocketMessage
|
||||
go func() {
|
||||
messages, err = helpers.ReceiveAllWebSocketMessages(connection)
|
||||
if !s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err) {
|
||||
c := make(chan bool)
|
||||
var messages []*dto.WebSocketMessage
|
||||
go func() {
|
||||
messages, err = helpers.ReceiveAllWebSocketMessages(connection)
|
||||
if !s.Equal(&websocket.CloseError{Code: websocket.CloseNormalClosure}, err) {
|
||||
s.T().Fail()
|
||||
}
|
||||
close(c)
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-time.After(2 * time.Second):
|
||||
s.T().Fatal("The execution should have returned by now")
|
||||
case <-c:
|
||||
if s.Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaTimeout}, messages[len(messages)-1]) {
|
||||
return
|
||||
}
|
||||
}
|
||||
s.T().Fail()
|
||||
}
|
||||
close(c)
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-time.After(2 * time.Second):
|
||||
s.T().Fatal("The execution should have returned by now")
|
||||
case <-c:
|
||||
if s.Equal(&dto.WebSocketMessage{Type: dto.WebSocketMetaTimeout}, messages[len(messages)-1]) {
|
||||
return
|
||||
}
|
||||
})
|
||||
}
|
||||
s.T().Fail()
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestEchoEnvironment() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, &dto.ExecutionRequest{
|
||||
Command: "echo $hello",
|
||||
Environment: map[string]string{"hello": "world"},
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
for _, environmentID := range environmentIDs {
|
||||
s.Run(environmentID.ToString(), func() {
|
||||
connection, err := ProvideWebSocketConnection(&s.Suite, environmentID, &dto.ExecutionRequest{
|
||||
Command: "echo -n $hello",
|
||||
Environment: map[string]string{"hello": "world"},
|
||||
})
|
||||
s.Require().NoError(err)
|
||||
|
||||
startMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
s.Require().NoError(err)
|
||||
s.Equal(dto.WebSocketMetaStart, startMessage.Type)
|
||||
startMessage, err := helpers.ReceiveNextWebSocketMessage(connection)
|
||||
s.Require().NoError(err)
|
||||
s.Equal(dto.WebSocketMetaStart, startMessage.Type)
|
||||
|
||||
messages, err := helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(err, &websocket.CloseError{Code: websocket.CloseNormalClosure})
|
||||
stdout, _, _ := helpers.WebSocketOutputMessages(messages)
|
||||
s.Equal("world\r\n", stdout)
|
||||
messages, err := helpers.ReceiveAllWebSocketMessages(connection)
|
||||
s.Require().Error(err)
|
||||
s.Equal(err, &websocket.CloseError{Code: websocket.CloseNormalClosure})
|
||||
stdout, _, _ := helpers.WebSocketOutputMessages(messages)
|
||||
s.Equal("world", stdout)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (s *E2ETestSuite) TestStderrFifoIsRemoved() {
|
||||
func (s *E2ETestSuite) TestNomadStderrFifoIsRemoved() {
|
||||
runnerID, err := ProvideRunner(&dto.RunnerRequest{
|
||||
ExecutionEnvironmentID: tests.DefaultEnvironmentIDAsInteger,
|
||||
})
|
||||
@@ -191,11 +214,9 @@ func (s *E2ETestSuite) ListTempDirectory(runnerID string) string {
|
||||
}
|
||||
|
||||
// ProvideWebSocketConnection establishes a client WebSocket connection to run the passed ExecutionRequest.
|
||||
// It requires a running Poseidon instance.
|
||||
func ProvideWebSocketConnection(s *suite.Suite, request *dto.ExecutionRequest) (*websocket.Conn, error) {
|
||||
runnerID, err := ProvideRunner(&dto.RunnerRequest{
|
||||
ExecutionEnvironmentID: tests.DefaultEnvironmentIDAsInteger,
|
||||
})
|
||||
func ProvideWebSocketConnection(
|
||||
s *suite.Suite, environmentID dto.EnvironmentID, request *dto.ExecutionRequest) (*websocket.Conn, error) {
|
||||
runnerID, err := ProvideRunner(&dto.RunnerRequest{ExecutionEnvironmentID: int(environmentID)})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error providing runner: %w", err)
|
||||
}
|
||||
|
Reference in New Issue
Block a user