153 lines
4.5 KiB
Go
153 lines
4.5 KiB
Go
package nomad
|
|
|
|
import (
|
|
"errors"
|
|
nomadApi "github.com/hashicorp/nomad/api"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/mock"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/stretchr/testify/suite"
|
|
"net/url"
|
|
"testing"
|
|
)
|
|
|
|
func TestLoadRunnersTestSuite(t *testing.T) {
|
|
suite.Run(t, new(LoadRunnersTestSuite))
|
|
}
|
|
|
|
type LoadRunnersTestSuite struct {
|
|
suite.Suite
|
|
jobId string
|
|
mock *apiQuerierMock
|
|
nomadApiClient ApiClient
|
|
availableRunner *nomadApi.AllocationListStub
|
|
anotherAvailableRunner *nomadApi.AllocationListStub
|
|
stoppedRunner *nomadApi.AllocationListStub
|
|
stoppingRunner *nomadApi.AllocationListStub
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) SetupTest() {
|
|
suite.jobId = "1d-0f-v3ry-sp3c14l-j0b"
|
|
|
|
suite.mock = &apiQuerierMock{}
|
|
suite.nomadApiClient = ApiClient{apiQuerier: suite.mock}
|
|
|
|
suite.availableRunner = &nomadApi.AllocationListStub{
|
|
ID: "s0m3-r4nd0m-1d",
|
|
ClientStatus: nomadApi.AllocClientStatusRunning,
|
|
DesiredStatus: nomadApi.AllocDesiredStatusRun,
|
|
}
|
|
|
|
suite.anotherAvailableRunner = &nomadApi.AllocationListStub{
|
|
ID: "s0m3-s1m1l4r-1d",
|
|
ClientStatus: nomadApi.AllocClientStatusRunning,
|
|
DesiredStatus: nomadApi.AllocDesiredStatusRun,
|
|
}
|
|
|
|
suite.stoppedRunner = &nomadApi.AllocationListStub{
|
|
ID: "4n0th3r-1d",
|
|
ClientStatus: nomadApi.AllocClientStatusComplete,
|
|
DesiredStatus: nomadApi.AllocDesiredStatusRun,
|
|
}
|
|
|
|
suite.stoppingRunner = &nomadApi.AllocationListStub{
|
|
ID: "th1rd-1d",
|
|
ClientStatus: nomadApi.AllocClientStatusRunning,
|
|
DesiredStatus: nomadApi.AllocDesiredStatusStop,
|
|
}
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) TestErrorOfUnderlyingApiCallIsPropagated() {
|
|
errorString := "api errored"
|
|
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
|
|
Return(nil, errors.New(errorString))
|
|
|
|
returnedIds, err := suite.nomadApiClient.LoadRunners(suite.jobId)
|
|
suite.Nil(returnedIds)
|
|
suite.Error(err)
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) TestThrowsNoErrorWhenUnderlyingApiCallDoesNot() {
|
|
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
|
|
Return([]*nomadApi.AllocationListStub{}, nil)
|
|
|
|
_, err := suite.nomadApiClient.LoadRunners(suite.jobId)
|
|
suite.NoError(err)
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) TestAvailableRunnerIsReturned() {
|
|
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
|
|
Return([]*nomadApi.AllocationListStub{suite.availableRunner}, nil)
|
|
|
|
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
|
|
suite.Len(returnedIds, 1)
|
|
suite.Equal(suite.availableRunner.ID, returnedIds[0])
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) TestStoppedRunnerIsNotReturned() {
|
|
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
|
|
Return([]*nomadApi.AllocationListStub{suite.stoppedRunner}, nil)
|
|
|
|
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
|
|
suite.Empty(returnedIds)
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) TestStoppingRunnerIsNotReturned() {
|
|
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
|
|
Return([]*nomadApi.AllocationListStub{suite.stoppingRunner}, nil)
|
|
|
|
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
|
|
suite.Empty(returnedIds)
|
|
}
|
|
|
|
func (suite *LoadRunnersTestSuite) TestReturnsAllAvailableRunners() {
|
|
runnersList := []*nomadApi.AllocationListStub{
|
|
suite.availableRunner,
|
|
suite.anotherAvailableRunner,
|
|
suite.stoppedRunner,
|
|
suite.stoppingRunner,
|
|
}
|
|
suite.mock.On("loadRunners", mock.AnythingOfType("string")).
|
|
Return(runnersList, nil)
|
|
|
|
returnedIds, _ := suite.nomadApiClient.LoadRunners(suite.jobId)
|
|
suite.Len(returnedIds, 2)
|
|
suite.Contains(returnedIds, suite.availableRunner.ID)
|
|
suite.Contains(returnedIds, suite.anotherAvailableRunner.ID)
|
|
}
|
|
|
|
var (
|
|
TestURL = url.URL{
|
|
Scheme: "http",
|
|
Host: "127.0.0.1:4646",
|
|
}
|
|
)
|
|
|
|
const TestNamespace = "unit-tests"
|
|
|
|
func TestApiClient_init(t *testing.T) {
|
|
client := &ApiClient{apiQuerier: &nomadApiClient{}}
|
|
defaultJob := parseJob(defaultJobHCL)
|
|
err := client.init(&TestURL, TestNamespace)
|
|
require.Nil(t, err)
|
|
assert.Equal(t, *defaultJob, client.defaultJob)
|
|
}
|
|
|
|
func TestApiClientCanNotBeInitializedWithInvalidUrl(t *testing.T) {
|
|
client := &ApiClient{apiQuerier: &nomadApiClient{}}
|
|
err := client.init(&url.URL{
|
|
Scheme: "http",
|
|
Host: "http://127.0.0.1:4646",
|
|
}, TestNamespace)
|
|
assert.NotNil(t, err)
|
|
}
|
|
|
|
func TestNewExecutorApiCanBeCreatedWithoutError(t *testing.T) {
|
|
expectedClient := &ApiClient{apiQuerier: &nomadApiClient{}}
|
|
err := expectedClient.init(&TestURL, TestNamespace)
|
|
require.Nil(t, err)
|
|
|
|
_, err = NewExecutorApi(&TestURL, TestNamespace)
|
|
require.Nil(t, err)
|
|
}
|