github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/containerbroker/manifold_test.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package containerbroker_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 worker "github.com/juju/worker/v3" 10 "go.uber.org/mock/gomock" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/container/broker" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/worker/containerbroker" 16 "github.com/juju/juju/worker/containerbroker/mocks" 17 ) 18 19 type manifoldConfigSuite struct { 20 testing.IsolationSuite 21 } 22 23 var _ = gc.Suite(&manifoldConfigSuite{}) 24 25 func (s *manifoldConfigSuite) TestInvalidConfigValidate(c *gc.C) { 26 ctrl := gomock.NewController(c) 27 defer ctrl.Finish() 28 29 testcases := []struct { 30 description string 31 config containerbroker.ManifoldConfig 32 err string 33 }{ 34 { 35 description: "Test empty configuration", 36 config: containerbroker.ManifoldConfig{}, 37 err: "empty AgentName not valid", 38 }, 39 { 40 description: "Test no agent name", 41 config: containerbroker.ManifoldConfig{}, 42 err: "empty AgentName not valid", 43 }, 44 { 45 description: "Test no api caller name", 46 config: containerbroker.ManifoldConfig{ 47 AgentName: "agent-name", 48 }, 49 err: "empty APICallerName not valid", 50 }, 51 { 52 description: "Test no machine lock", 53 config: containerbroker.ManifoldConfig{ 54 AgentName: "agent-name", 55 APICallerName: "api-caller-name", 56 }, 57 err: "nil MachineLock not valid", 58 }, 59 { 60 description: "Test no broker func", 61 config: containerbroker.ManifoldConfig{ 62 AgentName: "agent-name", 63 APICallerName: "api-caller-name", 64 MachineLock: mocks.NewMockLock(ctrl), 65 }, 66 err: "nil NewBrokerFunc not valid", 67 }, 68 { 69 description: "Test no tracker func", 70 config: containerbroker.ManifoldConfig{ 71 AgentName: "agent-name", 72 APICallerName: "api-caller-name", 73 MachineLock: mocks.NewMockLock(ctrl), 74 NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) { 75 return mocks.NewMockInstanceBroker(ctrl), nil 76 }, 77 }, 78 err: "nil NewTracker not valid", 79 }, 80 } 81 for i, test := range testcases { 82 c.Logf("%d %s", i, test.description) 83 err := test.config.Validate() 84 c.Assert(err, gc.ErrorMatches, test.err) 85 } 86 } 87 88 func (s *manifoldConfigSuite) TestValidConfigValidate(c *gc.C) { 89 ctrl := gomock.NewController(c) 90 defer ctrl.Finish() 91 92 config := containerbroker.ManifoldConfig{ 93 AgentName: "agent", 94 APICallerName: "api-caller", 95 MachineLock: mocks.NewMockLock(ctrl), 96 NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) { 97 return mocks.NewMockInstanceBroker(ctrl), nil 98 }, 99 NewTracker: func(containerbroker.Config) (worker.Worker, error) { 100 return mocks.NewMockWorker(ctrl), nil 101 }, 102 } 103 err := config.Validate() 104 c.Assert(err, gc.IsNil) 105 } 106 107 type manifoldSuite struct { 108 testing.IsolationSuite 109 110 context *mocks.MockContext 111 agent *mocks.MockAgent 112 agentConfig *mocks.MockConfig 113 broker *mocks.MockInstanceBroker 114 apiCaller *mocks.MockAPICaller 115 worker *mocks.MockWorker 116 machineLock *mocks.MockLock 117 } 118 119 var _ = gc.Suite(&manifoldSuite{}) 120 121 func (s *manifoldSuite) setup(c *gc.C) *gomock.Controller { 122 ctrl := gomock.NewController(c) 123 124 s.context = mocks.NewMockContext(ctrl) 125 s.agent = mocks.NewMockAgent(ctrl) 126 s.agentConfig = mocks.NewMockConfig(ctrl) 127 s.broker = mocks.NewMockInstanceBroker(ctrl) 128 s.apiCaller = mocks.NewMockAPICaller(ctrl) 129 s.worker = mocks.NewMockWorker(ctrl) 130 s.machineLock = mocks.NewMockLock(ctrl) 131 132 return ctrl 133 } 134 135 func (s *manifoldSuite) TestNewTrackerIsCalled(c *gc.C) { 136 defer s.setup(c).Finish() 137 138 s.behaviourContext() 139 s.behaviourAgent() 140 141 config := containerbroker.ManifoldConfig{ 142 APICallerName: "baz", 143 AgentName: "moon", 144 MachineLock: s.machineLock, 145 NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) { 146 return s.broker, nil 147 }, 148 NewTracker: func(cfg containerbroker.Config) (worker.Worker, error) { 149 return s.worker, nil 150 }, 151 } 152 manifold := containerbroker.Manifold(config) 153 result, err := manifold.Start(s.context) 154 c.Assert(err, gc.IsNil) 155 c.Assert(result, gc.Equals, s.worker) 156 } 157 158 func (s *manifoldSuite) TestNewTrackerReturnsError(c *gc.C) { 159 defer s.setup(c).Finish() 160 161 s.behaviourContext() 162 s.behaviourAgent() 163 164 config := containerbroker.ManifoldConfig{ 165 AgentName: "moon", 166 APICallerName: "baz", 167 MachineLock: s.machineLock, 168 NewBrokerFunc: func(broker.Config) (environs.InstanceBroker, error) { 169 return s.broker, nil 170 }, 171 NewTracker: func(cfg containerbroker.Config) (worker.Worker, error) { 172 return nil, errors.New("errored") 173 }, 174 } 175 manifold := containerbroker.Manifold(config) 176 _, err := manifold.Start(s.context) 177 c.Assert(err, gc.ErrorMatches, "errored") 178 } 179 180 func (s *manifoldSuite) behaviourContext() { 181 cExp := s.context.EXPECT() 182 cExp.Get("moon", gomock.Any()).SetArg(1, s.agent).Return(nil) 183 cExp.Get("baz", gomock.Any()).SetArg(1, s.apiCaller).Return(nil) 184 } 185 186 func (s *manifoldSuite) behaviourAgent() { 187 aExp := s.agent.EXPECT() 188 aExp.CurrentConfig().Return(s.agentConfig) 189 }