github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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 "github.com/juju/juju/worker" 17 "github.com/juju/juju/worker/dependency" 18 dt "github.com/juju/juju/worker/dependency/testing" 19 "github.com/juju/juju/worker/leadership" 20 ) 21 22 type ManifoldSuite struct { 23 testing.IsolationSuite 24 testing.Stub 25 manifold dependency.Manifold 26 } 27 28 var _ = gc.Suite(&ManifoldSuite{}) 29 30 func (s *ManifoldSuite) SetUpTest(c *gc.C) { 31 s.IsolationSuite.SetUpTest(c) 32 s.Stub = testing.Stub{} 33 s.manifold = leadership.Manifold(leadership.ManifoldConfig{ 34 AgentName: "agent-name", 35 APICallerName: "api-caller-name", 36 LeadershipGuarantee: 123456 * time.Millisecond, 37 }) 38 } 39 40 func (s *ManifoldSuite) TestInputs(c *gc.C) { 41 c.Check(s.manifold.Inputs, jc.DeepEquals, []string{"agent-name", "api-caller-name"}) 42 } 43 44 func (s *ManifoldSuite) TestStartAgentMissing(c *gc.C) { 45 getResource := dt.StubGetResource(dt.StubResources{ 46 "agent-name": dt.StubResource{Error: dependency.ErrMissing}, 47 "api-caller-name": dt.StubResource{Output: &dummyApiCaller{}}, 48 }) 49 50 worker, err := s.manifold.Start(getResource) 51 c.Check(worker, gc.IsNil) 52 c.Check(err, gc.Equals, dependency.ErrMissing) 53 } 54 55 func (s *ManifoldSuite) TestStartApiCallerMissing(c *gc.C) { 56 getResource := dt.StubGetResource(dt.StubResources{ 57 "agent-name": dt.StubResource{Output: &dummyAgent{}}, 58 "api-caller-name": dt.StubResource{Error: dependency.ErrMissing}, 59 }) 60 61 worker, err := s.manifold.Start(getResource) 62 c.Check(worker, gc.IsNil) 63 c.Check(err, gc.Equals, dependency.ErrMissing) 64 } 65 66 func (s *ManifoldSuite) TestStartError(c *gc.C) { 67 dummyAgent := &dummyAgent{} 68 dummyApiCaller := &dummyApiCaller{} 69 getResource := dt.StubGetResource(dt.StubResources{ 70 "agent-name": dt.StubResource{Output: dummyAgent}, 71 "api-caller-name": dt.StubResource{Output: dummyApiCaller}, 72 }) 73 s.PatchValue(leadership.NewManifoldWorker, func(a agent.Agent, apiCaller base.APICaller, guarantee time.Duration) (worker.Worker, error) { 74 s.AddCall("newManifoldWorker", a, apiCaller, guarantee) 75 return nil, errors.New("blammo") 76 }) 77 78 worker, err := s.manifold.Start(getResource) 79 c.Check(worker, gc.IsNil) 80 c.Check(err, gc.ErrorMatches, "blammo") 81 s.CheckCalls(c, []testing.StubCall{{ 82 FuncName: "newManifoldWorker", 83 Args: []interface{}{dummyAgent, dummyApiCaller, 123456 * time.Millisecond}, 84 }}) 85 } 86 87 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 88 dummyAgent := &dummyAgent{} 89 dummyApiCaller := &dummyApiCaller{} 90 getResource := dt.StubGetResource(dt.StubResources{ 91 "agent-name": dt.StubResource{Output: dummyAgent}, 92 "api-caller-name": dt.StubResource{Output: dummyApiCaller}, 93 }) 94 dummyWorker := &dummyWorker{} 95 s.PatchValue(leadership.NewManifoldWorker, func(a agent.Agent, apiCaller base.APICaller, guarantee time.Duration) (worker.Worker, error) { 96 s.AddCall("newManifoldWorker", a, apiCaller, guarantee) 97 return dummyWorker, nil 98 }) 99 100 worker, err := s.manifold.Start(getResource) 101 c.Check(err, jc.ErrorIsNil) 102 c.Check(worker, gc.Equals, dummyWorker) 103 s.CheckCalls(c, []testing.StubCall{{ 104 FuncName: "newManifoldWorker", 105 Args: []interface{}{dummyAgent, dummyApiCaller, 123456 * time.Millisecond}, 106 }}) 107 } 108 109 func (s *ManifoldSuite) TestOutputBadTarget(c *gc.C) { 110 var target interface{} 111 err := s.manifold.Output(leadership.DummyTrackerWorker(), &target) 112 c.Check(target, gc.IsNil) 113 c.Check(err.Error(), gc.Equals, "expected *leadership.tracker->*leadership.Tracker; got *leadership.tracker->*interface {}") 114 } 115 116 func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) { 117 var target leadership.Tracker 118 err := s.manifold.Output(&dummyWorker{}, &target) 119 c.Check(target, gc.IsNil) 120 c.Check(err.Error(), gc.Equals, "expected *leadership.tracker->*leadership.Tracker; got *leadership_test.dummyWorker->*leadership.Tracker") 121 } 122 123 func (s *ManifoldSuite) TestOutputSuccess(c *gc.C) { 124 source := leadership.DummyTrackerWorker() 125 var target leadership.Tracker 126 err := s.manifold.Output(source, &target) 127 c.Check(err, jc.ErrorIsNil) 128 c.Check(target, gc.Equals, source) 129 } 130 131 type dummyAgent struct { 132 agent.Agent 133 } 134 135 type dummyApiCaller struct { 136 base.APICaller 137 } 138 139 type dummyWorker struct { 140 worker.Worker 141 }