github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/workers/dumb_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package workers_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/loggo" 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/state/workers" 14 "github.com/juju/juju/worker" 15 "github.com/juju/juju/worker/workertest" 16 ) 17 18 type DumbWorkersSuite struct { 19 testing.IsolationSuite 20 } 21 22 var _ = gc.Suite(&DumbWorkersSuite{}) 23 24 func (*DumbWorkersSuite) TestValidateSuccess(c *gc.C) { 25 config := workers.DumbConfig{ 26 Factory: struct{ workers.Factory }{}, 27 Logger: loggo.GetLogger("test"), 28 } 29 err := config.Validate() 30 c.Check(err, jc.ErrorIsNil) 31 } 32 33 func (*DumbWorkersSuite) TestValidateUninitializedLogger(c *gc.C) { 34 config := workers.DumbConfig{ 35 Factory: struct{ workers.Factory }{}, 36 } 37 check := func(err error) { 38 c.Check(err, gc.ErrorMatches, "uninitialized Logger not valid") 39 c.Check(err, jc.Satisfies, errors.IsNotValid) 40 } 41 42 check(config.Validate()) 43 w, err := workers.NewDumbWorkers(config) 44 if !c.Check(w, gc.IsNil) { 45 workertest.CleanKill(c, w) 46 } 47 check(err) 48 } 49 50 func (*DumbWorkersSuite) TestValidateMissingFactory(c *gc.C) { 51 config := workers.DumbConfig{ 52 Logger: loggo.GetLogger("test"), 53 } 54 check := func(err error) { 55 c.Check(err, gc.ErrorMatches, "nil Factory not valid") 56 c.Check(err, jc.Satisfies, errors.IsNotValid) 57 } 58 59 check(config.Validate()) 60 w, err := workers.NewDumbWorkers(config) 61 if !c.Check(w, gc.IsNil) { 62 workertest.CleanKill(c, w) 63 } 64 check(err) 65 } 66 67 func (*DumbWorkersSuite) TestNewLeadershipManagerError(c *gc.C) { 68 fix := Fixture{ 69 LW_errors: []error{ErrFailStart}, 70 } 71 fix.FailDumb(c, "cannot create leadership lease manager: bad start") 72 } 73 74 func (*DumbWorkersSuite) TestNewSingularManagerError(c *gc.C) { 75 fix := Fixture{ 76 LW_errors: []error{nil}, 77 SW_errors: []error{ErrFailStart}, 78 } 79 fix.FailDumb(c, "cannot create singular lease manager: bad start") 80 } 81 82 func (*DumbWorkersSuite) TestNewTxnLogWatcherError(c *gc.C) { 83 fix := Fixture{ 84 LW_errors: []error{nil}, 85 SW_errors: []error{nil}, 86 TLW_errors: []error{ErrFailStart}, 87 } 88 fix.FailDumb(c, "cannot create transaction log watcher: bad start") 89 } 90 91 func (*DumbWorkersSuite) TestNewPresenceWatcherError(c *gc.C) { 92 fix := BasicFixture() 93 fix.PW_errors = []error{ErrFailStart} 94 fix.FailDumb(c, "cannot create presence watcher: bad start") 95 } 96 97 func (*DumbWorkersSuite) TestLeadershipManagerFails(c *gc.C) { 98 fix := BasicFixture() 99 fix.LW_errors = []error{errors.New("zap")} 100 fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) { 101 w := NextWorker(c, ctx.LWs()) 102 c.Assert(w, gc.NotNil) 103 AssertWorker(c, dw.LeadershipManager(), w) 104 105 w.Kill() 106 workertest.CheckAlive(c, dw) 107 AssertWorker(c, dw.LeadershipManager(), w) 108 109 err := workertest.CheckKill(c, dw) 110 c.Check(err, gc.ErrorMatches, "error stopping leadership lease manager: zap") 111 }) 112 } 113 114 func (*DumbWorkersSuite) TestSingularManagerFails(c *gc.C) { 115 fix := BasicFixture() 116 fix.SW_errors = []error{errors.New("zap")} 117 fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) { 118 w := NextWorker(c, ctx.SWs()) 119 c.Assert(w, gc.NotNil) 120 AssertWorker(c, dw.SingularManager(), w) 121 122 w.Kill() 123 workertest.CheckAlive(c, dw) 124 AssertWorker(c, dw.SingularManager(), w) 125 126 err := workertest.CheckKill(c, dw) 127 c.Check(err, gc.ErrorMatches, "error stopping singular lease manager: zap") 128 }) 129 } 130 131 func (*DumbWorkersSuite) TestTxnLogWatcherFails(c *gc.C) { 132 fix := BasicFixture() 133 fix.TLW_errors = []error{errors.New("zap")} 134 fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) { 135 w := NextWorker(c, ctx.TLWs()) 136 c.Assert(w, gc.NotNil) 137 AssertWorker(c, dw.TxnLogWatcher(), w) 138 139 w.Kill() 140 workertest.CheckAlive(c, dw) 141 AssertWorker(c, dw.TxnLogWatcher(), w) 142 143 err := workertest.CheckKill(c, dw) 144 c.Check(err, gc.ErrorMatches, "error stopping transaction log watcher: zap") 145 }) 146 } 147 148 func (*DumbWorkersSuite) TestPresenceWatcherFails(c *gc.C) { 149 fix := BasicFixture() 150 fix.PW_errors = []error{errors.New("zap")} 151 fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) { 152 w := NextWorker(c, ctx.PWs()) 153 c.Assert(w, gc.NotNil) 154 AssertWorker(c, dw.PresenceWatcher(), w) 155 156 w.Kill() 157 workertest.CheckAlive(c, dw) 158 AssertWorker(c, dw.PresenceWatcher(), w) 159 160 err := workertest.CheckKill(c, dw) 161 c.Check(err, gc.ErrorMatches, "error stopping presence watcher: zap") 162 }) 163 } 164 165 func (*DumbWorkersSuite) TestEverythingFails(c *gc.C) { 166 fix := Fixture{ 167 LW_errors: []error{errors.New("zot")}, 168 SW_errors: []error{errors.New("bif")}, 169 TLW_errors: []error{errors.New("pow")}, 170 PW_errors: []error{errors.New("arg")}, 171 } 172 fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) { 173 for _, ch := range []<-chan worker.Worker{ 174 ctx.LWs(), ctx.SWs(), ctx.TLWs(), ctx.PWs(), 175 } { 176 w := NextWorker(c, ch) 177 c.Assert(w, gc.NotNil) 178 w.Kill() 179 } 180 181 workertest.CheckAlive(c, dw) 182 err := workertest.CheckKill(c, dw) 183 c.Check(err, gc.ErrorMatches, "error stopping transaction log watcher: pow") 184 }) 185 } 186 187 func (*DumbWorkersSuite) TestStopsAllWorkers(c *gc.C) { 188 fix := BasicFixture() 189 fix.RunDumb(c, func(ctx Context, dw *workers.DumbWorkers) { 190 workertest.CleanKill(c, dw) 191 for _, ch := range []<-chan worker.Worker{ 192 ctx.LWs(), ctx.SWs(), ctx.TLWs(), ctx.PWs(), 193 } { 194 w := NextWorker(c, ch) 195 workertest.CheckKilled(c, w) 196 } 197 }) 198 }