github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/presence/manifold_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package presence_test 5 6 import ( 7 "time" 8 9 "github.com/juju/clock/testclock" 10 "github.com/juju/errors" 11 "github.com/juju/loggo" 12 "github.com/juju/names/v5" 13 "github.com/juju/pubsub/v2" 14 "github.com/juju/testing" 15 jc "github.com/juju/testing/checkers" 16 "github.com/juju/worker/v3" 17 "github.com/juju/worker/v3/dependency" 18 dt "github.com/juju/worker/v3/dependency/testing" 19 gc "gopkg.in/check.v1" 20 21 "github.com/juju/juju/agent" 22 corepresence "github.com/juju/juju/core/presence" 23 "github.com/juju/juju/worker/presence" 24 ) 25 26 type ManifoldSuite struct { 27 testing.IsolationSuite 28 config presence.ManifoldConfig 29 } 30 31 var _ = gc.Suite(&ManifoldSuite{}) 32 33 func (s *ManifoldSuite) SetUpTest(c *gc.C) { 34 s.IsolationSuite.SetUpTest(c) 35 s.config = presence.ManifoldConfig{ 36 AgentName: "agent", 37 CentralHubName: "central-hub", 38 Recorder: corepresence.New(testclock.NewClock(time.Now())), 39 Logger: loggo.GetLogger("test"), 40 NewWorker: func(presence.WorkerConfig) (worker.Worker, error) { 41 return nil, errors.New("boom") 42 }, 43 } 44 } 45 46 func (s *ManifoldSuite) manifold() dependency.Manifold { 47 return presence.Manifold(s.config) 48 } 49 50 func (s *ManifoldSuite) TestInputs(c *gc.C) { 51 c.Check(s.manifold().Inputs, jc.DeepEquals, []string{"agent", "central-hub"}) 52 } 53 54 func (s *ManifoldSuite) TestConfigValidation(c *gc.C) { 55 err := s.config.Validate() 56 c.Assert(err, jc.ErrorIsNil) 57 } 58 59 func (s *ManifoldSuite) TestConfigValidationMissingAgentName(c *gc.C) { 60 s.config.AgentName = "" 61 err := s.config.Validate() 62 c.Check(err, jc.Satisfies, errors.IsNotValid) 63 c.Check(err, gc.ErrorMatches, "missing AgentName not valid") 64 } 65 66 func (s *ManifoldSuite) TestConfigValidationMissingCentralHubName(c *gc.C) { 67 s.config.CentralHubName = "" 68 err := s.config.Validate() 69 c.Check(err, jc.Satisfies, errors.IsNotValid) 70 c.Check(err, gc.ErrorMatches, "missing CentralHubName not valid") 71 } 72 73 func (s *ManifoldSuite) TestConfigValidationMissingRecorder(c *gc.C) { 74 s.config.Recorder = nil 75 err := s.config.Validate() 76 c.Check(err, jc.Satisfies, errors.IsNotValid) 77 c.Check(err, gc.ErrorMatches, "missing Recorder not valid") 78 } 79 80 func (s *ManifoldSuite) TestConfigValidationMissingLogger(c *gc.C) { 81 s.config.Logger = nil 82 err := s.config.Validate() 83 c.Check(err, jc.Satisfies, errors.IsNotValid) 84 c.Check(err, gc.ErrorMatches, "missing Logger not valid") 85 } 86 87 func (s *ManifoldSuite) TestConfigValidationMissingNewWorker(c *gc.C) { 88 s.config.NewWorker = nil 89 err := s.config.Validate() 90 c.Check(err, jc.Satisfies, errors.IsNotValid) 91 c.Check(err, gc.ErrorMatches, "missing NewWorker not valid") 92 } 93 94 func (s *ManifoldSuite) TestConfigNewWorker(c *gc.C) { 95 // This test will fail at compile time if the presence.NewWorker function 96 // has a different signature to the NewWorker config attribute for ManifoldConfig. 97 s.config.NewWorker = presence.NewWorker 98 } 99 100 func (s *ManifoldSuite) TestManifoldCallsValidate(c *gc.C) { 101 context := dt.StubContext(nil, map[string]interface{}{}) 102 s.config.Recorder = nil 103 worker, err := s.manifold().Start(context) 104 c.Check(worker, gc.IsNil) 105 c.Check(err, jc.Satisfies, errors.IsNotValid) 106 c.Check(err, gc.ErrorMatches, `missing Recorder not valid`) 107 } 108 109 func (s *ManifoldSuite) TestAgentMissing(c *gc.C) { 110 context := dt.StubContext(nil, map[string]interface{}{ 111 "agent": dependency.ErrMissing, 112 }) 113 114 worker, err := s.manifold().Start(context) 115 c.Check(worker, gc.IsNil) 116 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 117 } 118 119 func (s *ManifoldSuite) TestCentralHubMissing(c *gc.C) { 120 context := dt.StubContext(nil, map[string]interface{}{ 121 "agent": &fakeAgent{tag: names.NewMachineTag("42")}, 122 "central-hub": dependency.ErrMissing, 123 }) 124 125 worker, err := s.manifold().Start(context) 126 c.Check(worker, gc.IsNil) 127 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 128 } 129 130 func (s *ManifoldSuite) TestNewWorkerArgs(c *gc.C) { 131 hub := pubsub.NewStructuredHub(nil) 132 var config presence.WorkerConfig 133 s.config.NewWorker = func(c presence.WorkerConfig) (worker.Worker, error) { 134 config = c 135 return &fakeWorker{}, nil 136 } 137 138 context := dt.StubContext(nil, map[string]interface{}{ 139 "agent": &fakeAgent{tag: names.NewMachineTag("42")}, 140 "central-hub": hub, 141 }) 142 143 worker, err := s.manifold().Start(context) 144 c.Check(err, jc.ErrorIsNil) 145 c.Check(worker, gc.NotNil) 146 147 c.Check(config.Origin, gc.Equals, "machine-42") 148 c.Check(config.Hub, gc.Equals, hub) 149 c.Check(config.Recorder, gc.Equals, s.config.Recorder) 150 } 151 152 type fakeWorker struct { 153 worker.Worker 154 } 155 156 type fakeAgent struct { 157 agent.Agent 158 agent.Config 159 160 tag names.Tag 161 } 162 163 // The fake is its own config. 164 func (f *fakeAgent) CurrentConfig() agent.Config { 165 return f 166 } 167 168 func (f *fakeAgent) Tag() names.Tag { 169 return f.tag 170 }