github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/clock/testclock" 10 "github.com/juju/errors" 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 "gopkg.in/juju/names.v2" 15 "gopkg.in/juju/worker.v1" 16 "gopkg.in/juju/worker.v1/dependency" 17 dt "gopkg.in/juju/worker.v1/dependency/testing" 18 19 "github.com/juju/juju/api/base" 20 "github.com/juju/juju/cmd/jujud/agent/engine" 21 coretesting "github.com/juju/juju/testing" 22 "github.com/juju/juju/worker/singular" 23 ) 24 25 type ManifoldSuite struct { 26 testing.IsolationSuite 27 } 28 29 var _ = gc.Suite(&ManifoldSuite{}) 30 31 func (s *ManifoldSuite) TestInputs(c *gc.C) { 32 manifold := singular.Manifold(singular.ManifoldConfig{ 33 ClockName: "harriet", 34 APICallerName: "kim", 35 }) 36 expectInputs := []string{"harriet", "kim"} 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 engine.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, _ *testclock.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, _ *testclock.Clock, _ func()) { 63 var out engine.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 }) 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) TestStartMissingAPICaller(c *gc.C) { 85 manifold := singular.Manifold(singular.ManifoldConfig{ 86 ClockName: "clock", 87 APICallerName: "api-caller", 88 }) 89 context := dt.StubContext(nil, map[string]interface{}{ 90 "clock": &fakeClock{}, 91 "api-caller": dependency.ErrMissing, 92 }) 93 94 worker, err := manifold.Start(context) 95 c.Check(errors.Cause(err), gc.Equals, dependency.ErrMissing) 96 c.Check(worker, gc.IsNil) 97 } 98 99 func (s *ManifoldSuite) TestStartNewFacadeError(c *gc.C) { 100 expectAPICaller := &fakeAPICaller{} 101 manifold := singular.Manifold(singular.ManifoldConfig{ 102 ClockName: "clock", 103 APICallerName: "api-caller", 104 Claimant: names.NewMachineTag("123"), 105 Entity: coretesting.ModelTag, 106 NewFacade: func(apiCaller base.APICaller, claimant names.MachineTag, entity names.Tag) (singular.Facade, error) { 107 c.Check(apiCaller, gc.Equals, expectAPICaller) 108 c.Check(claimant.String(), gc.Equals, "machine-123") 109 c.Check(entity, gc.Equals, coretesting.ModelTag) 110 return nil, errors.New("grark plop") 111 }, 112 }) 113 context := dt.StubContext(nil, map[string]interface{}{ 114 "clock": &fakeClock{}, 115 "api-caller": expectAPICaller, 116 }) 117 118 worker, err := manifold.Start(context) 119 c.Check(err, gc.ErrorMatches, "grark plop") 120 c.Check(worker, gc.IsNil) 121 } 122 123 func (s *ManifoldSuite) TestStartNewWorkerError(c *gc.C) { 124 expectFacade := &fakeFacade{} 125 manifold := singular.Manifold(singular.ManifoldConfig{ 126 ClockName: "clock", 127 APICallerName: "api-caller", 128 Duration: time.Minute, 129 NewFacade: func(base.APICaller, names.MachineTag, names.Tag) (singular.Facade, error) { 130 return expectFacade, nil 131 }, 132 NewWorker: func(config singular.FlagConfig) (worker.Worker, error) { 133 c.Check(config.Facade, gc.Equals, expectFacade) 134 err := config.Validate() 135 c.Check(err, jc.ErrorIsNil) 136 return nil, errors.New("blomp tik") 137 }, 138 }) 139 context := dt.StubContext(nil, map[string]interface{}{ 140 "clock": &fakeClock{}, 141 "api-caller": &fakeAPICaller{}, 142 }) 143 144 worker, err := manifold.Start(context) 145 c.Check(err, gc.ErrorMatches, "blomp tik") 146 c.Check(worker, gc.IsNil) 147 } 148 149 func (s *ManifoldSuite) TestStartSuccess(c *gc.C) { 150 var stub testing.Stub 151 expectWorker := newStubWorker(&stub) 152 manifold := singular.Manifold(singular.ManifoldConfig{ 153 ClockName: "clock", 154 APICallerName: "api-caller", 155 NewFacade: func(base.APICaller, names.MachineTag, names.Tag) (singular.Facade, error) { 156 return &fakeFacade{}, nil 157 }, 158 NewWorker: func(_ singular.FlagConfig) (worker.Worker, error) { 159 return expectWorker, nil 160 }, 161 }) 162 context := dt.StubContext(nil, map[string]interface{}{ 163 "clock": &fakeClock{}, 164 "api-caller": &fakeAPICaller{}, 165 }) 166 167 worker, err := manifold.Start(context) 168 c.Check(err, jc.ErrorIsNil) 169 170 var out engine.Flag 171 err = manifold.Output(worker, &out) 172 c.Check(err, jc.ErrorIsNil) 173 c.Check(out.Check(), jc.IsTrue) 174 175 c.Check(worker.Wait(), jc.ErrorIsNil) 176 stub.CheckCallNames(c, "Check", "Wait") 177 } 178 179 func (s *ManifoldSuite) TestWorkerBouncesOnRefresh(c *gc.C) { 180 var stub testing.Stub 181 stub.SetErrors(singular.ErrRefresh) 182 errWorker := newStubWorker(&stub) 183 184 manifold := singular.Manifold(singular.ManifoldConfig{ 185 ClockName: "clock", 186 APICallerName: "api-caller", 187 NewFacade: func(base.APICaller, names.MachineTag, names.Tag) (singular.Facade, error) { 188 return &fakeFacade{}, nil 189 }, 190 NewWorker: func(_ singular.FlagConfig) (worker.Worker, error) { 191 return errWorker, nil 192 }, 193 }) 194 context := dt.StubContext(nil, map[string]interface{}{ 195 "clock": &fakeClock{}, 196 "api-caller": &fakeAPICaller{}, 197 }) 198 199 worker, err := manifold.Start(context) 200 c.Check(err, jc.ErrorIsNil) 201 c.Check(worker.Wait(), gc.Equals, dependency.ErrBounce) 202 }