github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/agent/manifold_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package agent_test 5 6 import ( 7 "github.com/juju/testing" 8 jc "github.com/juju/testing/checkers" 9 "github.com/juju/version" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/juju/names.v2" 12 "gopkg.in/juju/worker.v1" 13 14 coreagent "github.com/juju/juju/agent" 15 jujuversion "github.com/juju/juju/version" 16 "github.com/juju/juju/worker/agent" 17 ) 18 19 type ManifoldSuite struct { 20 testing.IsolationSuite 21 } 22 23 var _ = gc.Suite(&ManifoldSuite{}) 24 25 func (s *ManifoldSuite) TestInputs(c *gc.C) { 26 inputAgent := &dummyAgent{} 27 manifold := agent.Manifold(inputAgent) 28 c.Check(manifold.Inputs, gc.IsNil) 29 } 30 31 func (s *ManifoldSuite) TestOutput(c *gc.C) { 32 inputAgent := &dummyAgent{} 33 manifold := agent.Manifold(inputAgent) 34 35 agentWorker, err := manifold.Start(nil) 36 c.Check(err, jc.ErrorIsNil) 37 defer assertStop(c, agentWorker) 38 39 var outputAgent coreagent.Agent 40 err = manifold.Output(agentWorker, &outputAgent) 41 c.Check(err, jc.ErrorIsNil) 42 c.Check(outputAgent, jc.DeepEquals, inputAgent) 43 } 44 45 func (s *ManifoldSuite) TestOutputStoppedWorker(c *gc.C) { 46 inputAgent := &dummyAgent{} 47 manifold := agent.Manifold(inputAgent) 48 49 agentWorker, err := manifold.Start(nil) 50 c.Check(err, jc.ErrorIsNil) 51 // The lifetime is irrelevant -- the output func will still function 52 // whether the (degenerate) worker is alive or not -- so no defer here. 53 assertStop(c, agentWorker) 54 55 var outputAgent coreagent.Agent 56 err = manifold.Output(agentWorker, &outputAgent) 57 c.Check(err, jc.ErrorIsNil) 58 c.Check(outputAgent, jc.DeepEquals, inputAgent) 59 } 60 61 func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) { 62 inputAgent := &dummyAgent{} 63 manifold := agent.Manifold(inputAgent) 64 65 var badWorker worker.Worker 66 67 var outputAgent coreagent.Agent 68 err := manifold.Output(badWorker, &outputAgent) 69 c.Check(err.Error(), gc.Equals, "expected *agent.agentWorker->*agent.Agent; got <nil>->*agent.Agent") 70 } 71 72 func (s *ManifoldSuite) TestOutputBadTarget(c *gc.C) { 73 inputAgent := &dummyAgent{} 74 manifold := agent.Manifold(inputAgent) 75 76 agentWorker, err := manifold.Start(nil) 77 c.Check(err, jc.ErrorIsNil) 78 defer assertStop(c, agentWorker) 79 80 var outputNonsense interface{} 81 err = manifold.Output(agentWorker, &outputNonsense) 82 c.Check(err.Error(), gc.Equals, "expected *agent.agentWorker->*agent.Agent; got *agent.agentWorker->*interface {}") 83 } 84 85 func (s *ManifoldSuite) TestReport(c *gc.C) { 86 s.PatchValue(&jujuversion.Current, version.MustParse("3.2.1")) 87 88 inputAgent := &dummyAgent{} 89 manifold := agent.Manifold(inputAgent) 90 91 agentWorker, err := manifold.Start(nil) 92 c.Check(err, jc.ErrorIsNil) 93 defer assertStop(c, agentWorker) 94 95 reporter, ok := agentWorker.(worker.Reporter) 96 c.Assert(ok, jc.IsTrue) 97 c.Assert(reporter.Report(), jc.DeepEquals, map[string]interface{}{ 98 "agent": "machine-42", 99 "model-uuid": "model-uuid", 100 "version": "3.2.1", 101 }) 102 } 103 104 type dummyAgent struct { 105 coreagent.Agent 106 } 107 108 func (dummyAgent) CurrentConfig() coreagent.Config { 109 return fakeConfig{} 110 } 111 112 func assertStop(c *gc.C, w worker.Worker) { 113 c.Assert(worker.Stop(w), jc.ErrorIsNil) 114 } 115 116 type fakeConfig struct { 117 coreagent.Config 118 } 119 120 func (fakeConfig) Model() names.ModelTag { 121 return names.NewModelTag("model-uuid") 122 } 123 124 func (fakeConfig) Tag() names.Tag { 125 return names.NewMachineTag("42") 126 }