github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/lifeflag/worker_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package lifeflag_test 5 6 import ( 7 "errors" 8 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 "gopkg.in/juju/names.v2" 13 14 apilifeflag "github.com/juju/juju/api/lifeflag" 15 "github.com/juju/juju/core/life" 16 "github.com/juju/juju/worker/lifeflag" 17 "github.com/juju/juju/worker/workertest" 18 ) 19 20 type WorkerSuite struct { 21 testing.IsolationSuite 22 } 23 24 var _ = gc.Suite(&WorkerSuite{}) 25 26 func (*WorkerSuite) TestCreateNotFoundError(c *gc.C) { 27 stub := &testing.Stub{} 28 stub.SetErrors(apilifeflag.ErrNotFound) 29 config := lifeflag.Config{ 30 Facade: newMockFacade(stub), 31 Entity: testEntity, 32 Result: explode, 33 } 34 35 worker, err := lifeflag.New(config) 36 c.Check(worker, gc.IsNil) 37 c.Check(err, gc.Equals, lifeflag.ErrNotFound) 38 checkCalls(c, stub, "Life") 39 } 40 41 func (*WorkerSuite) TestCreateRandomError(c *gc.C) { 42 stub := &testing.Stub{} 43 stub.SetErrors(errors.New("boom splat")) 44 config := lifeflag.Config{ 45 Facade: newMockFacade(stub), 46 Entity: testEntity, 47 Result: explode, 48 } 49 50 worker, err := lifeflag.New(config) 51 c.Check(worker, gc.IsNil) 52 c.Check(err, gc.ErrorMatches, "boom splat") 53 checkCalls(c, stub, "Life") 54 } 55 56 func (*WorkerSuite) TestWatchNotFoundError(c *gc.C) { 57 stub := &testing.Stub{} 58 stub.SetErrors(nil, apilifeflag.ErrNotFound) 59 config := lifeflag.Config{ 60 Facade: newMockFacade(stub, life.Alive), 61 Entity: testEntity, 62 Result: never, 63 } 64 65 worker, err := lifeflag.New(config) 66 c.Check(err, jc.ErrorIsNil) 67 c.Check(worker.Check(), jc.IsFalse) 68 69 err = workertest.CheckKilled(c, worker) 70 c.Check(err, gc.Equals, lifeflag.ErrNotFound) 71 checkCalls(c, stub, "Life", "Watch") 72 } 73 74 func (*WorkerSuite) TestWatchRandomError(c *gc.C) { 75 stub := &testing.Stub{} 76 stub.SetErrors(nil, errors.New("pew pew")) 77 config := lifeflag.Config{ 78 Facade: newMockFacade(stub, life.Alive), 79 Entity: testEntity, 80 Result: never, 81 } 82 83 worker, err := lifeflag.New(config) 84 c.Check(err, jc.ErrorIsNil) 85 c.Check(worker.Check(), jc.IsFalse) 86 87 err = workertest.CheckKilled(c, worker) 88 c.Check(err, gc.ErrorMatches, "pew pew") 89 checkCalls(c, stub, "Life", "Watch") 90 } 91 92 func (*WorkerSuite) TestLifeNotFoundError(c *gc.C) { 93 stub := &testing.Stub{} 94 stub.SetErrors(nil, nil, apilifeflag.ErrNotFound) 95 config := lifeflag.Config{ 96 Facade: newMockFacade(stub, life.Alive), 97 Entity: testEntity, 98 Result: never, 99 } 100 101 worker, err := lifeflag.New(config) 102 c.Check(err, jc.ErrorIsNil) 103 c.Check(worker.Check(), jc.IsFalse) 104 105 err = workertest.CheckKilled(c, worker) 106 c.Check(err, gc.Equals, lifeflag.ErrNotFound) 107 checkCalls(c, stub, "Life", "Watch", "Life") 108 } 109 110 func (*WorkerSuite) TestLifeRandomError(c *gc.C) { 111 stub := &testing.Stub{} 112 stub.SetErrors(nil, nil, errors.New("rawr")) 113 config := lifeflag.Config{ 114 Facade: newMockFacade(stub, life.Alive), 115 Entity: testEntity, 116 Result: never, 117 } 118 119 worker, err := lifeflag.New(config) 120 c.Check(err, jc.ErrorIsNil) 121 c.Check(worker.Check(), jc.IsFalse) 122 123 err = workertest.CheckKilled(c, worker) 124 c.Check(err, gc.ErrorMatches, "rawr") 125 checkCalls(c, stub, "Life", "Watch", "Life") 126 } 127 128 func (*WorkerSuite) TestResultImmediateRealChange(c *gc.C) { 129 stub := &testing.Stub{} 130 config := lifeflag.Config{ 131 Facade: newMockFacade(stub, life.Alive, life.Dead), 132 Entity: testEntity, 133 Result: life.IsNotAlive, 134 } 135 136 worker, err := lifeflag.New(config) 137 c.Check(err, jc.ErrorIsNil) 138 c.Check(worker.Check(), jc.IsFalse) 139 140 err = workertest.CheckKilled(c, worker) 141 c.Check(err, gc.Equals, lifeflag.ErrValueChanged) 142 checkCalls(c, stub, "Life", "Watch", "Life") 143 } 144 145 func (*WorkerSuite) TestResultSubsequentRealChange(c *gc.C) { 146 stub := &testing.Stub{} 147 config := lifeflag.Config{ 148 Facade: newMockFacade(stub, life.Dying, life.Dying, life.Dead), 149 Entity: testEntity, 150 Result: life.IsNotDead, 151 } 152 worker, err := lifeflag.New(config) 153 c.Check(err, jc.ErrorIsNil) 154 c.Check(worker.Check(), jc.IsTrue) 155 156 err = workertest.CheckKilled(c, worker) 157 c.Check(err, gc.Equals, lifeflag.ErrValueChanged) 158 checkCalls(c, stub, "Life", "Watch", "Life", "Life") 159 } 160 161 func (*WorkerSuite) TestResultNoRealChange(c *gc.C) { 162 stub := &testing.Stub{} 163 config := lifeflag.Config{ 164 Facade: newMockFacade(stub, life.Alive, life.Alive, life.Dying), 165 Entity: testEntity, 166 Result: life.IsNotDead, 167 } 168 worker, err := lifeflag.New(config) 169 c.Check(err, jc.ErrorIsNil) 170 c.Check(worker.Check(), jc.IsTrue) 171 172 workertest.CheckAlive(c, worker) 173 workertest.CleanKill(c, worker) 174 checkCalls(c, stub, "Life", "Watch", "Life", "Life") 175 } 176 177 var testEntity = names.NewUnitTag("blah/123") 178 179 func checkCalls(c *gc.C, stub *testing.Stub, names ...string) { 180 stub.CheckCallNames(c, names...) 181 for _, call := range stub.Calls() { 182 c.Check(call.Args, gc.DeepEquals, []interface{}{testEntity}) 183 } 184 } 185 186 func explode(life.Value) bool { panic("unexpected") } 187 func never(life.Value) bool { return false }