Refactor all tests to use the MemoryLeakTestSuite.
This commit is contained in:
@ -6,33 +6,40 @@ import (
|
||||
"github.com/openHPI/poseidon/internal/runner"
|
||||
"github.com/openHPI/poseidon/pkg/dto"
|
||||
"github.com/openHPI/poseidon/tests"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAWSEnvironmentManager_CreateOrUpdate(t *testing.T) {
|
||||
type MainTestSuite struct {
|
||||
tests.MemoryLeakTestSuite
|
||||
}
|
||||
|
||||
func TestMainTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(MainTestSuite))
|
||||
}
|
||||
|
||||
func (s *MainTestSuite) TestAWSEnvironmentManager_CreateOrUpdate() {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
runnerManager := runner.NewAWSRunnerManager(ctx)
|
||||
m := NewAWSEnvironmentManager(runnerManager)
|
||||
uniqueImage := "java11Exec"
|
||||
|
||||
t.Run("can create default Java environment", func(t *testing.T) {
|
||||
s.Run("can create default Java environment", func() {
|
||||
config.Config.AWS.Functions = []string{uniqueImage}
|
||||
_, err := m.CreateOrUpdate(
|
||||
tests.AnotherEnvironmentIDAsInteger, dto.ExecutionEnvironmentRequest{Image: uniqueImage}, context.Background())
|
||||
assert.NoError(t, err)
|
||||
s.NoError(err)
|
||||
})
|
||||
|
||||
t.Run("can retrieve added environment", func(t *testing.T) {
|
||||
s.Run("can retrieve added environment", func() {
|
||||
environment, err := m.Get(tests.AnotherEnvironmentIDAsInteger, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, environment.Image(), uniqueImage)
|
||||
s.NoError(err)
|
||||
s.Equal(environment.Image(), uniqueImage)
|
||||
})
|
||||
|
||||
t.Run("non-handleable requests are forwarded to the next manager", func(t *testing.T) {
|
||||
s.Run("non-handleable requests are forwarded to the next manager", func() {
|
||||
nextHandler := &ManagerHandlerMock{}
|
||||
nextHandler.On("CreateOrUpdate", mock.AnythingOfType("dto.EnvironmentID"),
|
||||
mock.AnythingOfType("dto.ExecutionEnvironmentRequest"), mock.Anything).Return(true, nil)
|
||||
@ -40,55 +47,55 @@ func TestAWSEnvironmentManager_CreateOrUpdate(t *testing.T) {
|
||||
|
||||
request := dto.ExecutionEnvironmentRequest{}
|
||||
_, err := m.CreateOrUpdate(tests.DefaultEnvironmentIDAsInteger, request, context.Background())
|
||||
assert.NoError(t, err)
|
||||
nextHandler.AssertCalled(t, "CreateOrUpdate",
|
||||
s.NoError(err)
|
||||
nextHandler.AssertCalled(s.T(), "CreateOrUpdate",
|
||||
dto.EnvironmentID(tests.DefaultEnvironmentIDAsInteger), request, mock.Anything)
|
||||
})
|
||||
}
|
||||
|
||||
func TestAWSEnvironmentManager_Get(t *testing.T) {
|
||||
func (s *MainTestSuite) TestAWSEnvironmentManager_Get() {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
runnerManager := runner.NewAWSRunnerManager(ctx)
|
||||
m := NewAWSEnvironmentManager(runnerManager)
|
||||
|
||||
t.Run("Calls next handler when not found", func(t *testing.T) {
|
||||
s.Run("Calls next handler when not found", func() {
|
||||
nextHandler := &ManagerHandlerMock{}
|
||||
nextHandler.On("Get", mock.AnythingOfType("dto.EnvironmentID"), mock.AnythingOfType("bool")).
|
||||
Return(nil, nil)
|
||||
m.SetNextHandler(nextHandler)
|
||||
|
||||
_, err := m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.NoError(t, err)
|
||||
nextHandler.AssertCalled(t, "Get", dto.EnvironmentID(tests.DefaultEnvironmentIDAsInteger), false)
|
||||
s.NoError(err)
|
||||
nextHandler.AssertCalled(s.T(), "Get", dto.EnvironmentID(tests.DefaultEnvironmentIDAsInteger), false)
|
||||
})
|
||||
|
||||
t.Run("Returns error when not found", func(t *testing.T) {
|
||||
s.Run("Returns error when not found", func() {
|
||||
nextHandler := &AbstractManager{nil, nil}
|
||||
m.SetNextHandler(nextHandler)
|
||||
|
||||
_, err := m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.ErrorIs(t, err, runner.ErrRunnerNotFound)
|
||||
s.ErrorIs(err, runner.ErrRunnerNotFound)
|
||||
})
|
||||
|
||||
t.Run("Returns environment when it was added before", func(t *testing.T) {
|
||||
s.Run("Returns environment when it was added before", func() {
|
||||
expectedEnvironment := NewAWSEnvironment(nil)
|
||||
expectedEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
runnerManager.StoreEnvironment(expectedEnvironment)
|
||||
|
||||
environment, err := m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, expectedEnvironment, environment)
|
||||
s.NoError(err)
|
||||
s.Equal(expectedEnvironment, environment)
|
||||
})
|
||||
}
|
||||
|
||||
func TestAWSEnvironmentManager_List(t *testing.T) {
|
||||
func (s *MainTestSuite) TestAWSEnvironmentManager_List() {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
runnerManager := runner.NewAWSRunnerManager(ctx)
|
||||
m := NewAWSEnvironmentManager(runnerManager)
|
||||
|
||||
t.Run("also returns environments of the rest of the manager chain", func(t *testing.T) {
|
||||
s.Run("also returns environments of the rest of the manager chain", func() {
|
||||
nextHandler := &ManagerHandlerMock{}
|
||||
existingEnvironment := NewAWSEnvironment(nil)
|
||||
nextHandler.On("List", mock.AnythingOfType("bool")).
|
||||
@ -96,20 +103,20 @@ func TestAWSEnvironmentManager_List(t *testing.T) {
|
||||
m.SetNextHandler(nextHandler)
|
||||
|
||||
environments, err := m.List(false)
|
||||
assert.NoError(t, err)
|
||||
require.Len(t, environments, 1)
|
||||
assert.Contains(t, environments, existingEnvironment)
|
||||
s.NoError(err)
|
||||
s.Require().Len(environments, 1)
|
||||
s.Contains(environments, existingEnvironment)
|
||||
})
|
||||
m.SetNextHandler(nil)
|
||||
|
||||
t.Run("Returns added environment", func(t *testing.T) {
|
||||
s.Run("Returns added environment", func() {
|
||||
localEnvironment := NewAWSEnvironment(nil)
|
||||
localEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
runnerManager.StoreEnvironment(localEnvironment)
|
||||
|
||||
environments, err := m.List(false)
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, environments, 1)
|
||||
assert.Contains(t, environments, localEnvironment)
|
||||
s.NoError(err)
|
||||
s.Len(environments, 1)
|
||||
s.Contains(environments, localEnvironment)
|
||||
})
|
||||
}
|
||||
|
@ -11,24 +11,23 @@ import (
|
||||
"github.com/openHPI/poseidon/tests/helpers"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestConfigureNetworkCreatesNewNetworkWhenNoNetworkExists(t *testing.T) {
|
||||
func (s *MainTestSuite) TestConfigureNetworkCreatesNewNetworkWhenNoNetworkExists() {
|
||||
_, job := helpers.CreateTemplateJob()
|
||||
defaultTaskGroup := nomad.FindAndValidateDefaultTaskGroup(job)
|
||||
environment := &NomadEnvironment{nil, "", job, nil, context.Background(), nil}
|
||||
|
||||
if assert.Equal(t, 0, len(defaultTaskGroup.Networks)) {
|
||||
if s.Equal(0, len(defaultTaskGroup.Networks)) {
|
||||
environment.SetNetworkAccess(true, []uint16{})
|
||||
|
||||
assert.Equal(t, 1, len(defaultTaskGroup.Networks))
|
||||
s.Equal(1, len(defaultTaskGroup.Networks))
|
||||
}
|
||||
}
|
||||
|
||||
func TestConfigureNetworkDoesNotCreateNewNetworkWhenNetworkExists(t *testing.T) {
|
||||
func (s *MainTestSuite) TestConfigureNetworkDoesNotCreateNewNetworkWhenNetworkExists() {
|
||||
_, job := helpers.CreateTemplateJob()
|
||||
defaultTaskGroup := nomad.FindAndValidateDefaultTaskGroup(job)
|
||||
environment := &NomadEnvironment{nil, "", job, nil, context.Background(), nil}
|
||||
@ -36,26 +35,26 @@ func TestConfigureNetworkDoesNotCreateNewNetworkWhenNetworkExists(t *testing.T)
|
||||
networkResource := &nomadApi.NetworkResource{Mode: "cni/secure-bridge"}
|
||||
defaultTaskGroup.Networks = []*nomadApi.NetworkResource{networkResource}
|
||||
|
||||
if assert.Equal(t, 1, len(defaultTaskGroup.Networks)) {
|
||||
if s.Equal(1, len(defaultTaskGroup.Networks)) {
|
||||
environment.SetNetworkAccess(true, []uint16{})
|
||||
|
||||
assert.Equal(t, 1, len(defaultTaskGroup.Networks))
|
||||
assert.Equal(t, networkResource, defaultTaskGroup.Networks[0])
|
||||
s.Equal(1, len(defaultTaskGroup.Networks))
|
||||
s.Equal(networkResource, defaultTaskGroup.Networks[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestConfigureNetworkSetsCorrectValues(t *testing.T) {
|
||||
func (s *MainTestSuite) TestConfigureNetworkSetsCorrectValues() {
|
||||
_, job := helpers.CreateTemplateJob()
|
||||
defaultTaskGroup := nomad.FindAndValidateDefaultTaskGroup(job)
|
||||
defaultTask := nomad.FindAndValidateDefaultTask(defaultTaskGroup)
|
||||
|
||||
mode, ok := defaultTask.Config["network_mode"]
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, "none", mode)
|
||||
assert.Equal(t, 0, len(defaultTaskGroup.Networks))
|
||||
s.True(ok)
|
||||
s.Equal("none", mode)
|
||||
s.Equal(0, len(defaultTaskGroup.Networks))
|
||||
|
||||
exposedPortsTests := [][]uint16{{}, {1337}, {42, 1337}}
|
||||
t.Run("with no network access", func(t *testing.T) {
|
||||
s.Run("with no network access", func() {
|
||||
for _, ports := range exposedPortsTests {
|
||||
_, testJob := helpers.CreateTemplateJob()
|
||||
testTaskGroup := nomad.FindAndValidateDefaultTaskGroup(testJob)
|
||||
@ -64,13 +63,13 @@ func TestConfigureNetworkSetsCorrectValues(t *testing.T) {
|
||||
|
||||
testEnvironment.SetNetworkAccess(false, ports)
|
||||
mode, ok := testTask.Config["network_mode"]
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, "none", mode)
|
||||
assert.Equal(t, 0, len(testTaskGroup.Networks))
|
||||
s.True(ok)
|
||||
s.Equal("none", mode)
|
||||
s.Equal(0, len(testTaskGroup.Networks))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("with network access", func(t *testing.T) {
|
||||
s.Run("with network access", func() {
|
||||
for _, ports := range exposedPortsTests {
|
||||
_, testJob := helpers.CreateTemplateJob()
|
||||
testTaskGroup := nomad.FindAndValidateDefaultTaskGroup(testJob)
|
||||
@ -78,17 +77,17 @@ func TestConfigureNetworkSetsCorrectValues(t *testing.T) {
|
||||
testEnvironment := &NomadEnvironment{nil, "", testJob, nil, context.Background(), nil}
|
||||
|
||||
testEnvironment.SetNetworkAccess(true, ports)
|
||||
require.Equal(t, 1, len(testTaskGroup.Networks))
|
||||
s.Require().Equal(1, len(testTaskGroup.Networks))
|
||||
|
||||
networkResource := testTaskGroup.Networks[0]
|
||||
assert.Equal(t, "cni/secure-bridge", networkResource.Mode)
|
||||
require.Equal(t, len(ports), len(networkResource.DynamicPorts))
|
||||
s.Equal("cni/secure-bridge", networkResource.Mode)
|
||||
s.Require().Equal(len(ports), len(networkResource.DynamicPorts))
|
||||
|
||||
assertExpectedPorts(t, ports, networkResource)
|
||||
assertExpectedPorts(s.T(), ports, networkResource)
|
||||
|
||||
mode, ok := testTask.Config["network_mode"]
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, mode, "")
|
||||
s.True(ok)
|
||||
s.Equal(mode, "")
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -107,7 +106,7 @@ func assertExpectedPorts(t *testing.T, expectedPorts []uint16, networkResource *
|
||||
}
|
||||
}
|
||||
|
||||
func TestRegisterFailsWhenNomadJobRegistrationFails(t *testing.T) {
|
||||
func (s *MainTestSuite) TestRegisterFailsWhenNomadJobRegistrationFails() {
|
||||
apiClientMock := &nomad.ExecutorAPIMock{}
|
||||
expectedErr := tests.ErrDefault
|
||||
|
||||
@ -120,11 +119,11 @@ func TestRegisterFailsWhenNomadJobRegistrationFails(t *testing.T) {
|
||||
environment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
err := environment.Register()
|
||||
|
||||
assert.ErrorIs(t, err, expectedErr)
|
||||
apiClientMock.AssertNotCalled(t, "MonitorEvaluation")
|
||||
s.ErrorIs(err, expectedErr)
|
||||
apiClientMock.AssertNotCalled(s.T(), "MonitorEvaluation")
|
||||
}
|
||||
|
||||
func TestRegisterTemplateJobSucceedsWhenMonitoringEvaluationSucceeds(t *testing.T) {
|
||||
func (s *MainTestSuite) TestRegisterTemplateJobSucceedsWhenMonitoringEvaluationSucceeds() {
|
||||
apiClientMock := &nomad.ExecutorAPIMock{}
|
||||
evaluationID := "id"
|
||||
|
||||
@ -138,10 +137,10 @@ func TestRegisterTemplateJobSucceedsWhenMonitoringEvaluationSucceeds(t *testing.
|
||||
environment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
err := environment.Register()
|
||||
|
||||
assert.NoError(t, err)
|
||||
s.NoError(err)
|
||||
}
|
||||
|
||||
func TestRegisterTemplateJobReturnsErrorWhenMonitoringEvaluationFails(t *testing.T) {
|
||||
func (s *MainTestSuite) TestRegisterTemplateJobReturnsErrorWhenMonitoringEvaluationFails() {
|
||||
apiClientMock := &nomad.ExecutorAPIMock{}
|
||||
evaluationID := "id"
|
||||
|
||||
@ -155,24 +154,28 @@ func TestRegisterTemplateJobReturnsErrorWhenMonitoringEvaluationFails(t *testing
|
||||
environment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
err := environment.Register()
|
||||
|
||||
assert.ErrorIs(t, err, tests.ErrDefault)
|
||||
s.ErrorIs(err, tests.ErrDefault)
|
||||
}
|
||||
|
||||
func TestParseJob(t *testing.T) {
|
||||
t.Run("parses the given default job", func(t *testing.T) {
|
||||
environment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, templateEnvironmentJobHCL)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, environment.job)
|
||||
func (s *MainTestSuite) TestParseJob() {
|
||||
apiMock := &nomad.ExecutorAPIMock{}
|
||||
apiMock.On("LoadRunnerIDs", mock.AnythingOfType("string")).Return([]string{}, nil)
|
||||
apiMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
s.Run("parses the given default job", func() {
|
||||
environment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
s.NoError(err)
|
||||
s.NotNil(environment.job)
|
||||
s.NoError(environment.Delete())
|
||||
})
|
||||
|
||||
t.Run("returns error when given wrong job", func(t *testing.T) {
|
||||
s.Run("returns error when given wrong job", func() {
|
||||
environment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, "")
|
||||
assert.Error(t, err)
|
||||
assert.Nil(t, environment)
|
||||
s.Error(err)
|
||||
s.Nil(environment)
|
||||
})
|
||||
}
|
||||
|
||||
func TestTwoSampleAddExactlyTwoRunners(t *testing.T) {
|
||||
func (s *MainTestSuite) TestTwoSampleAddExactlyTwoRunners() {
|
||||
apiMock := &nomad.ExecutorAPIMock{}
|
||||
apiMock.On("RegisterRunnerJob", mock.AnythingOfType("*api.Job")).Return(nil)
|
||||
|
||||
@ -189,24 +192,24 @@ func TestTwoSampleAddExactlyTwoRunners(t *testing.T) {
|
||||
environment.AddRunner(runner2)
|
||||
|
||||
_, ok := environment.Sample()
|
||||
require.True(t, ok)
|
||||
s.Require().True(ok)
|
||||
_, ok = environment.Sample()
|
||||
require.True(t, ok)
|
||||
s.Require().True(ok)
|
||||
|
||||
<-time.After(tests.ShortTimeout) // New Runners are requested asynchronously
|
||||
apiMock.AssertNumberOfCalls(t, "RegisterRunnerJob", 2)
|
||||
apiMock.AssertNumberOfCalls(s.T(), "RegisterRunnerJob", 2)
|
||||
}
|
||||
|
||||
func TestSampleDoesNotSetForcePullFlag(t *testing.T) {
|
||||
func (s *MainTestSuite) TestSampleDoesNotSetForcePullFlag() {
|
||||
apiMock := &nomad.ExecutorAPIMock{}
|
||||
call := apiMock.On("RegisterRunnerJob", mock.AnythingOfType("*api.Job"))
|
||||
call.Run(func(args mock.Arguments) {
|
||||
job, ok := args.Get(0).(*nomadApi.Job)
|
||||
assert.True(t, ok)
|
||||
s.True(ok)
|
||||
|
||||
taskGroup := nomad.FindAndValidateDefaultTaskGroup(job)
|
||||
task := nomad.FindAndValidateDefaultTask(taskGroup)
|
||||
assert.False(t, task.Config["force_pull"].(bool))
|
||||
s.False(task.Config["force_pull"].(bool))
|
||||
|
||||
call.ReturnArguments = mock.Arguments{nil}
|
||||
})
|
||||
@ -219,6 +222,6 @@ func TestSampleDoesNotSetForcePullFlag(t *testing.T) {
|
||||
environment.AddRunner(runner1)
|
||||
|
||||
_, ok := environment.Sample()
|
||||
require.True(t, ok)
|
||||
s.Require().True(ok)
|
||||
<-time.After(tests.ShortTimeout) // New Runners are requested asynchronously
|
||||
}
|
||||
|
@ -9,17 +9,15 @@ import (
|
||||
"github.com/openHPI/poseidon/pkg/dto"
|
||||
"github.com/openHPI/poseidon/tests"
|
||||
"github.com/openHPI/poseidon/tests/helpers"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/stretchr/testify/suite"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type CreateOrUpdateTestSuite struct {
|
||||
suite.Suite
|
||||
tests.MemoryLeakTestSuite
|
||||
runnerManagerMock runner.ManagerMock
|
||||
apiMock nomad.ExecutorAPIMock
|
||||
request dto.ExecutionEnvironmentRequest
|
||||
@ -32,6 +30,7 @@ func TestCreateOrUpdateTestSuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (s *CreateOrUpdateTestSuite) SetupTest() {
|
||||
s.MemoryLeakTestSuite.SetupTest()
|
||||
s.runnerManagerMock = runner.ManagerMock{}
|
||||
|
||||
s.apiMock = nomad.ExecutorAPIMock{}
|
||||
@ -59,6 +58,7 @@ func (s *CreateOrUpdateTestSuite) TestReturnsErrorIfCreatesOrUpdateEnvironmentRe
|
||||
s.apiMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
s.runnerManagerMock.On("GetEnvironment", mock.AnythingOfType("dto.EnvironmentID")).Return(nil, false)
|
||||
s.runnerManagerMock.On("StoreEnvironment", mock.AnythingOfType("*environment.NomadEnvironment")).Return(true)
|
||||
s.ExpectedGoroutingIncrease++ // We don't care about removing the created environment.
|
||||
_, err := s.manager.CreateOrUpdate(
|
||||
dto.EnvironmentID(tests.DefaultEnvironmentIDAsInteger), s.request, context.Background())
|
||||
s.ErrorIs(err, tests.ErrDefault)
|
||||
@ -88,62 +88,70 @@ func (s *CreateOrUpdateTestSuite) TestCreateOrUpdatesSetsForcePullFlag() {
|
||||
|
||||
call.ReturnArguments = mock.Arguments{nil}
|
||||
})
|
||||
s.ExpectedGoroutingIncrease++ // We dont care about removing the created environment at this point.
|
||||
_, err := s.manager.CreateOrUpdate(
|
||||
dto.EnvironmentID(tests.DefaultEnvironmentIDAsInteger), s.request, context.Background())
|
||||
s.NoError(err)
|
||||
s.True(count > 1)
|
||||
}
|
||||
|
||||
func TestNewNomadEnvironmentManager(t *testing.T) {
|
||||
func (s *MainTestSuite) TestNewNomadEnvironmentManager() {
|
||||
disableRecovery, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
executorAPIMock := &nomad.ExecutorAPIMock{}
|
||||
executorAPIMock.On("LoadEnvironmentJobs").Return([]*nomadApi.Job{}, nil)
|
||||
executorAPIMock.On("LoadRunnerIDs", mock.AnythingOfType("string")).Return([]string{}, nil)
|
||||
executorAPIMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
|
||||
runnerManagerMock := &runner.ManagerMock{}
|
||||
runnerManagerMock.On("Load").Return()
|
||||
|
||||
previousTemplateEnvironmentJobHCL := templateEnvironmentJobHCL
|
||||
|
||||
t.Run("returns error if template file does not exist", func(t *testing.T) {
|
||||
s.Run("returns error if template file does not exist", func() {
|
||||
_, err := NewNomadEnvironmentManager(runnerManagerMock, executorAPIMock, "/non-existent/file", disableRecovery)
|
||||
assert.Error(t, err)
|
||||
s.Error(err)
|
||||
})
|
||||
|
||||
t.Run("loads template environment job from file", func(t *testing.T) {
|
||||
s.Run("loads template environment job from file", func() {
|
||||
templateJobHCL := "job \"" + tests.DefaultTemplateJobID + "\" {}"
|
||||
_, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, templateJobHCL)
|
||||
require.NoError(t, err)
|
||||
f := createTempFile(t, templateJobHCL)
|
||||
|
||||
environment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, executorAPIMock, templateJobHCL)
|
||||
s.Require().NoError(err)
|
||||
f := createTempFile(s.T(), templateJobHCL)
|
||||
defer os.Remove(f.Name())
|
||||
|
||||
m, err := NewNomadEnvironmentManager(runnerManagerMock, executorAPIMock, f.Name(), disableRecovery)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, m)
|
||||
assert.Equal(t, templateJobHCL, m.templateEnvironmentHCL)
|
||||
s.NoError(err)
|
||||
s.NotNil(m)
|
||||
s.Equal(templateJobHCL, m.templateEnvironmentHCL)
|
||||
|
||||
s.NoError(environment.Delete())
|
||||
})
|
||||
|
||||
t.Run("returns error if template file is invalid", func(t *testing.T) {
|
||||
s.Run("returns error if template file is invalid", func() {
|
||||
templateJobHCL := "invalid hcl file"
|
||||
f := createTempFile(t, templateJobHCL)
|
||||
f := createTempFile(s.T(), templateJobHCL)
|
||||
defer os.Remove(f.Name())
|
||||
|
||||
m, err := NewNomadEnvironmentManager(runnerManagerMock, executorAPIMock, f.Name(), disableRecovery)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
_, err = NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, m.templateEnvironmentHCL)
|
||||
assert.Error(t, err)
|
||||
s.Error(err)
|
||||
})
|
||||
|
||||
templateEnvironmentJobHCL = previousTemplateEnvironmentJobHCL
|
||||
}
|
||||
|
||||
func TestNomadEnvironmentManager_Get(t *testing.T) {
|
||||
func (s *MainTestSuite) TestNomadEnvironmentManager_Get() {
|
||||
s.T().Skip("ToDo: Get does not delete the replaced environment") // ToDo
|
||||
|
||||
disableRecovery, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
apiMock := &nomad.ExecutorAPIMock{}
|
||||
mockWatchAllocations(apiMock)
|
||||
mockWatchAllocations(s.TestCtx, apiMock)
|
||||
apiMock.On("LoadRunnerIDs", mock.AnythingOfType("string")).Return([]string{}, nil)
|
||||
apiMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
call := apiMock.On("LoadEnvironmentJobs")
|
||||
@ -151,61 +159,73 @@ func TestNomadEnvironmentManager_Get(t *testing.T) {
|
||||
call.ReturnArguments = mock.Arguments{[]*nomadApi.Job{}, nil}
|
||||
})
|
||||
|
||||
runnerManager := runner.NewNomadRunnerManager(apiMock, context.Background())
|
||||
runnerManager := runner.NewNomadRunnerManager(apiMock, s.TestCtx)
|
||||
m, err := NewNomadEnvironmentManager(runnerManager, apiMock, "", disableRecovery)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
t.Run("Returns error when not found", func(t *testing.T) {
|
||||
s.Run("Returns error when not found", func() {
|
||||
_, err := m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.Error(t, err)
|
||||
s.Error(err)
|
||||
})
|
||||
|
||||
t.Run("Returns environment when it was added before", func(t *testing.T) {
|
||||
s.Run("Returns environment when it was added before", func() {
|
||||
expectedEnvironment, err :=
|
||||
NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
expectedEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
runnerManager.StoreEnvironment(expectedEnvironment)
|
||||
|
||||
environment, err := m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, expectedEnvironment, environment)
|
||||
s.NoError(err)
|
||||
s.Equal(expectedEnvironment, environment)
|
||||
|
||||
err = environment.Delete()
|
||||
s.Require().NoError(err)
|
||||
})
|
||||
|
||||
t.Run("Fetch", func(t *testing.T) {
|
||||
s.Run("Fetch", func() {
|
||||
apiMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
t.Run("Returns error when not found", func(t *testing.T) {
|
||||
s.Run("Returns error when not found", func() {
|
||||
_, err := m.Get(tests.DefaultEnvironmentIDAsInteger, true)
|
||||
assert.Error(t, err)
|
||||
s.Error(err)
|
||||
})
|
||||
|
||||
t.Run("Updates values when environment already known by Poseidon", func(t *testing.T) {
|
||||
fetchedEnvironment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, templateEnvironmentJobHCL)
|
||||
require.NoError(t, err)
|
||||
s.Run("Updates values when environment already known by Poseidon", func() {
|
||||
fetchedEnvironment, err := NewNomadEnvironment(
|
||||
tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
s.Require().NoError(err)
|
||||
fetchedEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
fetchedEnvironment.SetImage("random docker image")
|
||||
call.Run(func(args mock.Arguments) {
|
||||
call.ReturnArguments = mock.Arguments{[]*nomadApi.Job{fetchedEnvironment.job}, nil}
|
||||
})
|
||||
|
||||
localEnvironment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, templateEnvironmentJobHCL)
|
||||
require.NoError(t, err)
|
||||
localEnvironment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
s.Require().NoError(err)
|
||||
localEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
runnerManager.StoreEnvironment(localEnvironment)
|
||||
|
||||
environment, err := m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.NoError(t, err)
|
||||
assert.NotEqual(t, fetchedEnvironment.Image(), environment.Image())
|
||||
s.NoError(err)
|
||||
s.NotEqual(fetchedEnvironment.Image(), environment.Image())
|
||||
|
||||
environment, err = m.Get(tests.DefaultEnvironmentIDAsInteger, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, fetchedEnvironment.Image(), environment.Image())
|
||||
s.NoError(err)
|
||||
s.Equal(fetchedEnvironment.Image(), environment.Image())
|
||||
|
||||
err = fetchedEnvironment.Delete()
|
||||
s.Require().NoError(err)
|
||||
err = environment.Delete()
|
||||
s.Require().NoError(err)
|
||||
err = localEnvironment.Delete()
|
||||
s.Require().NoError(err)
|
||||
})
|
||||
runnerManager.DeleteEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
|
||||
t.Run("Adds environment when not already known by Poseidon", func(t *testing.T) {
|
||||
fetchedEnvironment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, nil, templateEnvironmentJobHCL)
|
||||
require.NoError(t, err)
|
||||
s.Run("Adds environment when not already known by Poseidon", func() {
|
||||
fetchedEnvironment, err := NewNomadEnvironment(
|
||||
tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
s.Require().NoError(err)
|
||||
fetchedEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
fetchedEnvironment.SetImage("random docker image")
|
||||
call.Run(func(args mock.Arguments) {
|
||||
@ -213,53 +233,63 @@ func TestNomadEnvironmentManager_Get(t *testing.T) {
|
||||
})
|
||||
|
||||
_, err = m.Get(tests.DefaultEnvironmentIDAsInteger, false)
|
||||
assert.Error(t, err)
|
||||
s.Error(err)
|
||||
|
||||
environment, err := m.Get(tests.DefaultEnvironmentIDAsInteger, true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, fetchedEnvironment.Image(), environment.Image())
|
||||
s.NoError(err)
|
||||
s.Equal(fetchedEnvironment.Image(), environment.Image())
|
||||
|
||||
err = fetchedEnvironment.Delete()
|
||||
s.Require().NoError(err)
|
||||
err = environment.Delete()
|
||||
s.Require().NoError(err)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestNomadEnvironmentManager_List(t *testing.T) {
|
||||
func (s *MainTestSuite) TestNomadEnvironmentManager_List() {
|
||||
disableRecovery, cancel := context.WithCancel(context.Background())
|
||||
cancel()
|
||||
|
||||
apiMock := &nomad.ExecutorAPIMock{}
|
||||
mockWatchAllocations(apiMock)
|
||||
apiMock.On("LoadRunnerIDs", mock.AnythingOfType("string")).Return([]string{}, nil)
|
||||
apiMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
mockWatchAllocations(s.TestCtx, apiMock)
|
||||
call := apiMock.On("LoadEnvironmentJobs")
|
||||
call.Run(func(args mock.Arguments) {
|
||||
call.ReturnArguments = mock.Arguments{[]*nomadApi.Job{}, nil}
|
||||
})
|
||||
|
||||
runnerManager := runner.NewNomadRunnerManager(apiMock, context.Background())
|
||||
runnerManager := runner.NewNomadRunnerManager(apiMock, s.TestCtx)
|
||||
m, err := NewNomadEnvironmentManager(runnerManager, apiMock, "", disableRecovery)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
t.Run("with no environments", func(t *testing.T) {
|
||||
s.Run("with no environments", func() {
|
||||
environments, err := m.List(true)
|
||||
assert.NoError(t, err)
|
||||
assert.Empty(t, environments)
|
||||
s.NoError(err)
|
||||
s.Empty(environments)
|
||||
})
|
||||
|
||||
t.Run("Returns added environment", func(t *testing.T) {
|
||||
s.Run("Returns added environment", func() {
|
||||
localEnvironment, err := NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
localEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
runnerManager.StoreEnvironment(localEnvironment)
|
||||
|
||||
environments, err := m.List(false)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, len(environments))
|
||||
assert.Equal(t, localEnvironment, environments[0])
|
||||
s.NoError(err)
|
||||
s.Equal(1, len(environments))
|
||||
s.Equal(localEnvironment, environments[0])
|
||||
|
||||
err = localEnvironment.Delete()
|
||||
s.Require().NoError(err)
|
||||
})
|
||||
runnerManager.DeleteEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
|
||||
t.Run("Fetches new Runners via the api client", func(t *testing.T) {
|
||||
s.Run("Fetches new Runners via the api client", func() {
|
||||
fetchedEnvironment, err :=
|
||||
NewNomadEnvironment(tests.DefaultEnvironmentIDAsInteger, apiMock, templateEnvironmentJobHCL)
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
fetchedEnvironment.SetID(tests.DefaultEnvironmentIDAsInteger)
|
||||
status := structs.JobStatusRunning
|
||||
fetchedEnvironment.job.Status = &status
|
||||
@ -268,64 +298,74 @@ func TestNomadEnvironmentManager_List(t *testing.T) {
|
||||
})
|
||||
|
||||
environments, err := m.List(false)
|
||||
assert.NoError(t, err)
|
||||
assert.Empty(t, environments)
|
||||
s.NoError(err)
|
||||
s.Empty(environments)
|
||||
|
||||
environments, err = m.List(true)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, len(environments))
|
||||
s.NoError(err)
|
||||
s.Equal(1, len(environments))
|
||||
nomadEnvironment, ok := environments[0].(*NomadEnvironment)
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, fetchedEnvironment.job, nomadEnvironment.job)
|
||||
s.True(ok)
|
||||
s.Equal(fetchedEnvironment.job, nomadEnvironment.job)
|
||||
|
||||
err = fetchedEnvironment.Delete()
|
||||
s.Require().NoError(err)
|
||||
err = nomadEnvironment.Delete()
|
||||
s.Require().NoError(err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestNomadEnvironmentManager_Load(t *testing.T) {
|
||||
func (s *MainTestSuite) TestNomadEnvironmentManager_Load() {
|
||||
apiMock := &nomad.ExecutorAPIMock{}
|
||||
mockWatchAllocations(apiMock)
|
||||
apiMock.On("LoadRunnerIDs", mock.AnythingOfType("string")).Return([]string{}, nil)
|
||||
apiMock.On("DeleteJob", mock.AnythingOfType("string")).Return(nil)
|
||||
mockWatchAllocations(s.TestCtx, apiMock)
|
||||
call := apiMock.On("LoadEnvironmentJobs")
|
||||
apiMock.On("LoadRunnerJobs", mock.AnythingOfType("dto.EnvironmentID")).
|
||||
Return([]*nomadApi.Job{}, nil)
|
||||
|
||||
runnerManager := runner.NewNomadRunnerManager(apiMock, context.Background())
|
||||
runnerManager := runner.NewNomadRunnerManager(apiMock, s.TestCtx)
|
||||
|
||||
t.Run("Stores fetched environments", func(t *testing.T) {
|
||||
s.Run("Stores fetched environments", func() {
|
||||
_, job := helpers.CreateTemplateJob()
|
||||
call.Return([]*nomadApi.Job{job}, nil)
|
||||
|
||||
_, ok := runnerManager.GetEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
require.False(t, ok)
|
||||
s.Require().False(ok)
|
||||
|
||||
_, err := NewNomadEnvironmentManager(runnerManager, apiMock, "", context.Background())
|
||||
require.NoError(t, err)
|
||||
_, err := NewNomadEnvironmentManager(runnerManager, apiMock, "", s.TestCtx)
|
||||
s.Require().NoError(err)
|
||||
|
||||
environment, ok := runnerManager.GetEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, "python:latest", environment.Image())
|
||||
s.Require().True(ok)
|
||||
s.Equal("python:latest", environment.Image())
|
||||
|
||||
err = environment.Delete()
|
||||
s.Require().NoError(err)
|
||||
})
|
||||
|
||||
runnerManager.DeleteEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
t.Run("Processes only running environments", func(t *testing.T) {
|
||||
s.Run("Processes only running environments", func() {
|
||||
_, job := helpers.CreateTemplateJob()
|
||||
jobStatus := structs.JobStatusDead
|
||||
job.Status = &jobStatus
|
||||
call.Return([]*nomadApi.Job{job}, nil)
|
||||
|
||||
_, ok := runnerManager.GetEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
require.False(t, ok)
|
||||
s.Require().False(ok)
|
||||
|
||||
_, err := NewNomadEnvironmentManager(runnerManager, apiMock, "", context.Background())
|
||||
require.NoError(t, err)
|
||||
s.Require().NoError(err)
|
||||
|
||||
_, ok = runnerManager.GetEnvironment(tests.DefaultEnvironmentIDAsInteger)
|
||||
require.False(t, ok)
|
||||
s.Require().False(ok)
|
||||
})
|
||||
}
|
||||
|
||||
func mockWatchAllocations(apiMock *nomad.ExecutorAPIMock) {
|
||||
func mockWatchAllocations(ctx context.Context, apiMock *nomad.ExecutorAPIMock) {
|
||||
call := apiMock.On("WatchEventStream", mock.Anything, mock.Anything, mock.Anything)
|
||||
call.Run(func(args mock.Arguments) {
|
||||
<-time.After(tests.DefaultTestTimeout)
|
||||
<-ctx.Done()
|
||||
call.ReturnArguments = mock.Arguments{nil}
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user