github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/singular/manifold_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package singular_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 "gopkg.in/juju/names.v2" 14 15 "github.com/juju/juju/api/base" 16 "github.com/juju/juju/cmd/jujud/agent/engine" 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/singular" 21 ) 22 23 type ManifoldSuite struct { 24 testing.IsolationSuite 25 } 26 27 var _ = gc.Suite(&ManifoldSuite{}) 28 29 func (s *ManifoldSuite) TestInputs(c *gc.C) { 30 manifold := singular.Manifold(singular.ManifoldConfig{ 31 ClockName: "harriet", 32 APICallerName: "kim", 33 AgentName: "jenny", 34 }) 35 expectInputs := []string{"harriet", "kim", "jenny"} 36 c.Check(manifold.Inputs, jc.DeepEquals, expectInputs) 37 } 38 39 func (s *ManifoldSuite) TestOutputBadWorker(c *gc.C) { 40 manifold := singular.Manifold(singular.ManifoldConfig{}) 41 var out engine.Flag 42 err := manifold.Output(&fakeWorker{}, &out) 43 c.Check(err, gc.ErrorMatches, `expected in to implement Flag; got a .*`) 44 c.Check(out, gc.IsNil) 45 } 46 47 func (s *ManifoldSuite) TestOutputBadResult(c *gc.C) { 48 manifold := singular.Manifold(singular.ManifoldConfig{}) 49 fix := newFixture(c) 50 fix.Run(c, func(flag *singular.FlagWorker, _ *testing.Clock, _ func()) { 51 var out interface{} 52 err := manifold.Output(flag, &out) 53 c.Check(err, gc.ErrorMatches, `expected out to be a \*Flag; got a .*`) 54 c.Check(out, gc.IsNil) 55 }) 56 } 57 58 func (s *ManifoldSuite) TestOutputSuccess(c *gc.C) { 59 manifold := singular.Manifold(singular.ManifoldConfig{}) 60 fix := newFixture(c) 61 fix.Run(c, func(flag *singular.FlagWorker, _ *testing.Clock, _ func()) { 62 var out engine.Flag 63 err := manifold.Output(flag, &out) 64 c.Check(err, jc.ErrorIsNil) 65 c.Check(out, gc.Equals, flag) 66 }) 67 } 68 69 func (s *ManifoldSuite) TestStartMissingClock(c *gc.C) { 70 manifold := singular.Manifold(singular.ManifoldConfig{ 71 ClockName: "clock", 72 APICallerName: "api-caller", 73 AgentName: "agent", 74 }) 75 context := dt.StubContext(nil, map[string]interface{}{ 76 "clock": dependency.ErrMissing, 77 }) 78 79 worker, err := manifold.Start(context) 80 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 81 c.Check(worker, gc.IsNil) 82 } 83 84 func (s *ManifoldSuite) TestStartMissingAgent(c *gc.C) { 85 manifold := singular.Manifold(singular.ManifoldConfig{ 86 ClockName: "clock", 87 APICallerName: "api-caller", 88 AgentName: "agent", 89 }) 90 context := dt.StubContext(nil, map[string]interface{}{ 91 "clock": &fakeClock{}, 92 "api-caller": dependency.ErrMissing, 93 }) 94 95 worker, err := manifold.Start(context) 96 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 97 c.Check(worker, gc.IsNil) 98 } 99 100 func (s *ManifoldSuite) TestStartMissingAPICaller(c *gc.C) { 101 manifold := singular.Manifold(singular.ManifoldConfig{ 102 ClockName: "clock", 103 APICallerName: "api-caller", 104 AgentName: "agent", 105 }) 106 context := dt.StubContext(nil, map[string]interface{}{ 107 "clock": &fakeClock{}, 108 "api-caller": &fakeAPICaller{}, 109 "agent": dependency.ErrMissing, 110 }) 111 112 worker, err := manifold.Start(context) 113 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 114 c.Check(worker, gc.IsNil) 115 } 116 117 func (s *ManifoldSuite) TestStartWrongAgent(c *gc.C) { 118 manifold := singular.Manifold(singular.ManifoldConfig{ 119 ClockName: "clock", 120 APICallerName: "api-caller", 121 AgentName: "agent", 122 }) 123 context := dt.StubContext(nil, map[string]interface{}{ 124 "clock": &fakeClock{}, 125 "api-caller": &fakeAPICaller{}, 126 "agent": &mockAgent{wrongKind: true}, 127 }) 128 129 worker, err := manifold.Start(context) 130 c.Check(err, gc.ErrorMatches, "singular flag expected a machine agent") 131 c.Check(worker, gc.IsNil) 132 } 133 134 func (s *ManifoldSuite) TestStartNewFacadeError(c *gc.C) { 135 expectAPICaller := &fakeAPICaller{} 136 manifold := singular.Manifold(singular.ManifoldConfig{ 137 ClockName: "clock", 138 APICallerName: "api-caller", 139 AgentName: "agent", 140 NewFacade: func(apiCaller base.APICaller, tag names.MachineTag) (singular.Facade, error) { 141 c.Check(apiCaller, gc.Equals, expectAPICaller) 142 c.Check(tag.String(), gc.Equals, "machine-123") 143 return nil, errors.New("grark plop") 144 }, 145 }) 146 context := dt.StubContext(nil, map[string]interface{}{ 147 "clock": &fakeClock{}, 148 "api-caller": expectAPICaller, 149 "agent": &mockAgent{}, 150 }) 151 152 worker, err := manifold.Start(context) 153 c.Check(err, gc.ErrorMatches, "grark plop") 154 c.Check(worker, gc.IsNil) 155 } 156 157 func (s *ManifoldSuite) TestStartNewWorkerError(c *gc.C) { 158 expectFacade := &fakeFacade{} 159 manifold := singular.Manifold(singular.ManifoldConfig{ 160 ClockName: "clock", 161 APICallerName: "api-caller", 162 AgentName: "agent", 163 Duration: time.Minute, 164 NewFacade: func(_ base.APICaller, _ names.MachineTag) (singular.Facade, error) { 165 return expectFacade, nil 166 }, 167 NewWorker: func(config singular.FlagConfig) (worker.Worker, error) { 168 c.Check(config.Facade, gc.Equals, expectFacade) 169 err := config.Validate() 170 c.Check(err, jc.ErrorIsNil) 171 return nil, errors.New("blomp tik") 172 }, 173 }) 174 context := dt.StubContext(nil, map[string]interface{}{ 175 "clock": &fakeClock{}, 176 "api-caller": &fakeAPICaller{}, 177 "agent": &mockAgent{}, 178 }) 179 180 worker, err := manifold.Start(context) 181 c.Check(err, gc.ErrorMatches, "blomp tik") 182 c.Check(worker, gc.IsNil) 183 } 184 185 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 186 expectWorker := &fakeWorker{} 187 manifold := singular.Manifold(singular.ManifoldConfig{ 188 ClockName: "clock", 189 APICallerName: "api-caller", 190 AgentName: "agent", 191 NewFacade: func(_ base.APICaller, _ names.MachineTag) (singular.Facade, error) { 192 return &fakeFacade{}, nil 193 }, 194 NewWorker: func(_ singular.FlagConfig) (worker.Worker, error) { 195 return expectWorker, nil 196 }, 197 }) 198 context := dt.StubContext(nil, map[string]interface{}{ 199 "clock": &fakeClock{}, 200 "api-caller": &fakeAPICaller{}, 201 "agent": &mockAgent{}, 202 }) 203 204 worker, err := manifold.Start(context) 205 c.Check(err, jc.ErrorIsNil) 206 c.Check(worker, gc.Equals, expectWorker) 207 }