github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/stateconverter/manifold_test.go (about) 1 // Copyright 2022 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package stateconverter_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/names/v5" 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/worker/v3/workertest" 13 "go.uber.org/mock/gomock" 14 gc "gopkg.in/check.v1" 15 16 "github.com/juju/juju/api/base" 17 "github.com/juju/juju/testing" 18 "github.com/juju/juju/worker/stateconverter" 19 "github.com/juju/juju/worker/stateconverter/mocks" 20 ) 21 22 var _ = gc.Suite(&manifoldConfigSuite{}) 23 24 type manifoldConfigSuite struct { 25 machiner *mocks.MockMachiner 26 agent *mocks.MockAgent 27 config *mocks.MockConfig 28 context *mocks.MockContext 29 } 30 31 func (s *manifoldConfigSuite) TestValidateAgentNameFail(c *gc.C) { 32 cfg := stateconverter.ManifoldConfig{} 33 err := cfg.Validate() 34 c.Assert(err.Error(), gc.Equals, errors.NotValidf("empty AgentName").Error()) 35 } 36 37 func (s *manifoldConfigSuite) TestValidateAPICallerFail(c *gc.C) { 38 cfg := stateconverter.ManifoldConfig{ 39 AgentName: "machine-2", 40 } 41 err := cfg.Validate() 42 c.Assert(err.Error(), gc.Equals, errors.NotValidf("empty APICallerName").Error()) 43 } 44 45 func (s *manifoldConfigSuite) TestValidateLoggerFail(c *gc.C) { 46 cfg := stateconverter.ManifoldConfig{ 47 AgentName: "machine-2", 48 APICallerName: "machiner", 49 } 50 err := cfg.Validate() 51 c.Assert(err.Error(), gc.Equals, errors.NotValidf("nil Logger").Error()) 52 } 53 54 func (s *manifoldConfigSuite) TestValidateSuccess(c *gc.C) { 55 cfg := stateconverter.ManifoldConfig{ 56 AgentName: "machine-2", 57 APICallerName: "machiner", 58 Logger: &fakeLogger{}, 59 } 60 err := cfg.Validate() 61 c.Assert(err, jc.ErrorIsNil) 62 } 63 64 func (s *manifoldConfigSuite) TestManifoldStart(c *gc.C) { 65 defer s.setupMocks(c).Finish() 66 67 done := make(chan any) 68 cfg := stateconverter.ManifoldConfig{ 69 AgentName: "agent-name", 70 APICallerName: "machiner", 71 Logger: &fakeLogger{}, 72 NewMachinerAPI: func(_ base.APICaller) stateconverter.Machiner { 73 return s.machiner 74 }, 75 } 76 gomock.InOrder( 77 s.context.EXPECT().Get(cfg.AgentName, gomock.Any()).SetArg(1, s.agent).Return(nil), 78 s.agent.EXPECT().CurrentConfig().Return(s.config), 79 s.config.EXPECT().Tag().Return(names.NewMachineTag("3")), 80 s.machiner.EXPECT().Machine(names.NewMachineTag("3")).DoAndReturn(func(_ names.MachineTag) (stateconverter.Machine, error) { 81 close(done) 82 return nil, errors.New("nope") 83 }), 84 ) 85 manifold := stateconverter.Manifold(cfg) 86 w, err := manifold.Start(s.context) 87 c.Assert(err, jc.ErrorIsNil) 88 c.Assert(w, gc.NotNil) 89 select { 90 case <-done: 91 case <-time.After(testing.ShortWait): 92 c.Fatal("timed out waiting for calls") 93 } 94 err = workertest.CheckKill(c, w) 95 c.Assert(err, gc.ErrorMatches, `nope`) 96 } 97 98 func (s *manifoldConfigSuite) setupMocks(c *gc.C) *gomock.Controller { 99 ctrl := gomock.NewController(c) 100 s.agent = mocks.NewMockAgent(ctrl) 101 s.config = mocks.NewMockConfig(ctrl) 102 s.context = mocks.NewMockContext(ctrl) 103 s.machiner = mocks.NewMockMachiner(ctrl) 104 return ctrl 105 } 106 107 type fakeLogger struct{} 108 109 func (l *fakeLogger) Debugf(format string, args ...interface{}) {} 110 func (l *fakeLogger) Criticalf(format string, args ...interface{}) {} 111 func (l *fakeLogger) Tracef(format string, args ...interface{}) {}