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