github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/worker/leadership/manifold_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package leadership_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/agent" 15 "github.com/juju/juju/api/base" 16 coreleadership "github.com/juju/juju/core/leadership" 17 "github.com/juju/juju/worker" 18 "github.com/juju/juju/worker/dependency" 19 dt "github.com/juju/juju/worker/dependency/testing" 20 "github.com/juju/juju/worker/leadership" 21 ) 22 23 type ManifoldSuite struct { 24 testing.IsolationSuite 25 testing.Stub 26 manifold dependency.Manifold 27 } 28 29 var _ = gc.Suite(&ManifoldSuite{}) 30 31 func (s *ManifoldSuite) SetUpTest(c *gc.C) { 32 s.IsolationSuite.SetUpTest(c) 33 s.Stub = testing.Stub{} 34 s.manifold = leadership.Manifold(leadership.ManifoldConfig{ 35 AgentName: "agent-name", 36 APICallerName: "api-caller-name", 37 LeadershipGuarantee: 123456 * time.Millisecond, 38 }) 39 } 40 41 func (s *ManifoldSuite) TestInputs(c *gc.C) { 42 c.Check(s.manifold.Inputs, jc.DeepEquals, []string{"agent-name", "api-caller-name"}) 43 } 44 45 func (s *ManifoldSuite) TestStartAgentMissing(c *gc.C) { 46 context := dt.StubContext(nil, map[string]interface{}{ 47 "agent-name": dependency.ErrMissing, 48 "api-caller-name": &dummyApiCaller{}, 49 }) 50 51 worker, err := s.manifold.Start(context) 52 c.Check(worker, gc.IsNil) 53 c.Check(err, gc.Equals, dependency.ErrMissing) 54 } 55 56 func (s *ManifoldSuite) TestStartApiCallerMissing(c *gc.C) { 57 context := dt.StubContext(nil, map[string]interface{}{ 58 "agent-name": &dummyAgent{}, 59 "api-caller-name": dependency.ErrMissing, 60 }) 61 62 worker, err := s.manifold.Start(context) 63 c.Check(worker, gc.IsNil) 64 c.Check(err, gc.Equals, dependency.ErrMissing) 65 } 66 67 func (s *ManifoldSuite) TestStartError(c *gc.C) { 68 dummyAgent := &dummyAgent{} 69 dummyApiCaller := &dummyApiCaller{} 70 context := dt.StubContext(nil, map[string]interface{}{ 71 "agent-name": dummyAgent, 72 "api-caller-name": dummyApiCaller, 73 }) 74 s.PatchValue(&leadership.NewManifoldWorker, func(a agent.Agent, apiCaller base.APICaller, guarantee time.Duration) (worker.Worker, error) { 75 s.AddCall("newManifoldWorker", a, apiCaller, guarantee) 76 return nil, errors.New("blammo") 77 }) 78 79 worker, err := s.manifold.Start(context) 80 c.Check(worker, gc.IsNil) 81 c.Check(err, gc.ErrorMatches, "blammo") 82 s.CheckCalls(c, []testing.StubCall{{ 83 FuncName: "newManifoldWorker", 84 Args: []interface{}{dummyAgent, dummyApiCaller, 123456 * time.Millisecond}, 85 }}) 86 } 87 88 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 89 dummyAgent := &dummyAgent{} 90 dummyApiCaller := &dummyApiCaller{} 91 context := dt.StubContext(nil, map[string]interface{}{ 92 "agent-name": dummyAgent, 93 "api-caller-name": dummyApiCaller, 94 }) 95 dummyWorker := &dummyWorker{} 96 s.PatchValue(&leadership.NewManifoldWorker, func(a agent.Agent, apiCaller base.APICaller, guarantee time.Duration) (worker.Worker, error) { 97 s.AddCall("newManifoldWorker", a, apiCaller, guarantee) 98 return dummyWorker, nil 99 }) 100 101 worker, err := s.manifold.Start(context) 102 c.Check(err, jc.ErrorIsNil) 103 c.Check(worker, gc.Equals, dummyWorker) 104 s.CheckCalls(c, []testing.StubCall{{ 105 FuncName: "newManifoldWorker", 106 Args: []interface{}{dummyAgent, dummyApiCaller, 123456 * time.Millisecond}, 107 }}) 108 } 109 110 func (s *ManifoldSuite) TestOutputBadTarget(c *gc.C) { 111 var target interface{} 112 err := s.manifold.Output(&leadership.Tracker{}, &target) 113 c.Check(target, gc.IsNil) 114 c.Check(err.Error(), gc.Equals, "expected *leadership.Tracker output; got *interface {}") 115 } 116 117 func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) { 118 var target coreleadership.Tracker 119 err := s.manifold.Output(&dummyWorker{}, &target) 120 c.Check(target, gc.IsNil) 121 c.Check(err.Error(), gc.Equals, "expected *Tracker input; got *leadership_test.dummyWorker") 122 } 123 124 func (s *ManifoldSuite) TestOutputSuccess(c *gc.C) { 125 source := &leadership.Tracker{} 126 var target coreleadership.Tracker 127 err := s.manifold.Output(source, &target) 128 c.Check(err, jc.ErrorIsNil) 129 c.Check(target, gc.Equals, source) 130 } 131 132 type dummyAgent struct { 133 agent.Agent 134 } 135 136 type dummyApiCaller struct { 137 base.APICaller 138 } 139 140 type dummyWorker struct { 141 worker.Worker 142 }