github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/pubsub" 13 "github.com/juju/testing" 14 jc "github.com/juju/testing/checkers" 15 gc "gopkg.in/check.v1" 16 "gopkg.in/juju/names.v2" 17 "gopkg.in/juju/worker.v1" 18 "gopkg.in/juju/worker.v1/dependency" 19 dt "gopkg.in/juju/worker.v1/dependency/testing" 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 StateConfigWatcherName: "state-config", 39 Recorder: corepresence.New(testclock.NewClock(time.Now())), 40 Logger: loggo.GetLogger("test"), 41 NewWorker: func(presence.WorkerConfig) (worker.Worker, error) { 42 return nil, errors.New("boom") 43 }, 44 } 45 } 46 47 func (s *ManifoldSuite) manifold() dependency.Manifold { 48 return presence.Manifold(s.config) 49 } 50 51 func (s *ManifoldSuite) TestInputs(c *gc.C) { 52 c.Check(s.manifold().Inputs, jc.DeepEquals, []string{"agent", "central-hub", "state-config"}) 53 } 54 55 func (s *ManifoldSuite) TestConfigValidation(c *gc.C) { 56 err := s.config.Validate() 57 c.Assert(err, jc.ErrorIsNil) 58 } 59 60 func (s *ManifoldSuite) TestConfigValidationMissingAgentName(c *gc.C) { 61 s.config.AgentName = "" 62 err := s.config.Validate() 63 c.Check(err, jc.Satisfies, errors.IsNotValid) 64 c.Check(err, gc.ErrorMatches, "missing AgentName not valid") 65 } 66 67 func (s *ManifoldSuite) TestConfigValidationMissingCentralHubName(c *gc.C) { 68 s.config.CentralHubName = "" 69 err := s.config.Validate() 70 c.Check(err, jc.Satisfies, errors.IsNotValid) 71 c.Check(err, gc.ErrorMatches, "missing CentralHubName not valid") 72 } 73 74 func (s *ManifoldSuite) TestConfigValidationMissingStateConfigWatcherName(c *gc.C) { 75 s.config.StateConfigWatcherName = "" 76 err := s.config.Validate() 77 c.Check(err, jc.Satisfies, errors.IsNotValid) 78 c.Check(err, gc.ErrorMatches, "missing StateConfigWatcherName not valid") 79 } 80 81 func (s *ManifoldSuite) TestConfigValidationMissingRecorder(c *gc.C) { 82 s.config.Recorder = nil 83 err := s.config.Validate() 84 c.Check(err, jc.Satisfies, errors.IsNotValid) 85 c.Check(err, gc.ErrorMatches, "missing Recorder not valid") 86 } 87 88 func (s *ManifoldSuite) TestConfigValidationMissingLogger(c *gc.C) { 89 s.config.Logger = nil 90 err := s.config.Validate() 91 c.Check(err, jc.Satisfies, errors.IsNotValid) 92 c.Check(err, gc.ErrorMatches, "missing Logger not valid") 93 } 94 95 func (s *ManifoldSuite) TestConfigValidationMissingNewWorker(c *gc.C) { 96 s.config.NewWorker = nil 97 err := s.config.Validate() 98 c.Check(err, jc.Satisfies, errors.IsNotValid) 99 c.Check(err, gc.ErrorMatches, "missing NewWorker not valid") 100 } 101 102 func (s *ManifoldSuite) TestConfigNewWorker(c *gc.C) { 103 // This test will fail at compile time if the presence.NewWorker function 104 // has a different signature to the NewWorker config attribute for ManifoldConfig. 105 s.config.NewWorker = presence.NewWorker 106 } 107 108 func (s *ManifoldSuite) TestManifoldCallsValidate(c *gc.C) { 109 context := dt.StubContext(nil, map[string]interface{}{}) 110 s.config.Recorder = nil 111 worker, err := s.manifold().Start(context) 112 c.Check(worker, gc.IsNil) 113 c.Check(err, jc.Satisfies, errors.IsNotValid) 114 c.Check(err, gc.ErrorMatches, `missing Recorder not valid`) 115 } 116 117 func (s *ManifoldSuite) TestAgentMissing(c *gc.C) { 118 context := dt.StubContext(nil, map[string]interface{}{ 119 "agent": dependency.ErrMissing, 120 }) 121 122 worker, err := s.manifold().Start(context) 123 c.Check(worker, gc.IsNil) 124 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 125 } 126 127 func (s *ManifoldSuite) TestCentralHubMissing(c *gc.C) { 128 context := dt.StubContext(nil, map[string]interface{}{ 129 "agent": &fakeAgent{tag: names.NewMachineTag("42")}, 130 "central-hub": dependency.ErrMissing, 131 }) 132 133 worker, err := s.manifold().Start(context) 134 c.Check(worker, gc.IsNil) 135 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 136 } 137 138 func (s *ManifoldSuite) TestNotAServer(c *gc.C) { 139 context := dt.StubContext(nil, map[string]interface{}{ 140 "agent": &fakeAgent{tag: names.NewMachineTag("42")}, 141 "central-hub": pubsub.NewStructuredHub(nil), 142 "state-config": false, 143 }) 144 145 worker, err := s.manifold().Start(context) 146 c.Check(worker, gc.IsNil) 147 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 148 } 149 150 func (s *ManifoldSuite) TestNewWorkerArgs(c *gc.C) { 151 hub := pubsub.NewStructuredHub(nil) 152 var config presence.WorkerConfig 153 s.config.NewWorker = func(c presence.WorkerConfig) (worker.Worker, error) { 154 config = c 155 return &fakeWorker{}, nil 156 } 157 158 context := dt.StubContext(nil, map[string]interface{}{ 159 "agent": &fakeAgent{tag: names.NewMachineTag("42")}, 160 "central-hub": hub, 161 "state-config": true, 162 }) 163 164 worker, err := s.manifold().Start(context) 165 c.Check(err, jc.ErrorIsNil) 166 c.Check(worker, gc.NotNil) 167 168 c.Check(config.Origin, gc.Equals, "machine-42") 169 c.Check(config.Hub, gc.Equals, hub) 170 c.Check(config.Recorder, gc.Equals, s.config.Recorder) 171 } 172 173 type fakeWorker struct { 174 worker.Worker 175 } 176 177 type fakeAgent struct { 178 agent.Agent 179 agent.Config 180 181 tag names.Tag 182 } 183 184 // The fake is its own config. 185 func (f *fakeAgent) CurrentConfig() agent.Config { 186 return f 187 } 188 189 func (f *fakeAgent) Tag() names.Tag { 190 return f.tag 191 }