github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/worker/gate/manifold_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package gate_test 5 6 import ( 7 "github.com/juju/testing" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/worker" 12 "github.com/juju/juju/worker/dependency" 13 "github.com/juju/juju/worker/gate" 14 ) 15 16 type ManifoldSuite struct { 17 testing.IsolationSuite 18 manifold dependency.Manifold 19 worker worker.Worker 20 } 21 22 var _ = gc.Suite(&ManifoldSuite{}) 23 24 func (s *ManifoldSuite) SetUpTest(c *gc.C) { 25 s.IsolationSuite.SetUpTest(c) 26 s.manifold = gate.Manifold() 27 w, err := s.manifold.Start(nil) 28 c.Assert(err, jc.ErrorIsNil) 29 s.worker = w 30 } 31 32 func (s *ManifoldSuite) TearDownTest(c *gc.C) { 33 if s.worker != nil { 34 checkStop(c, s.worker) 35 } 36 s.IsolationSuite.TearDownTest(c) 37 } 38 39 func (s *ManifoldSuite) TestLocked(c *gc.C) { 40 w := waiter(c, s.manifold, s.worker) 41 assertLocked(c, w) 42 } 43 44 func (s *ManifoldSuite) TestUnlock(c *gc.C) { 45 u := unlocker(c, s.manifold, s.worker) 46 w := waiter(c, s.manifold, s.worker) 47 48 u.Unlock() 49 assertUnlocked(c, w) 50 } 51 52 func (s *ManifoldSuite) TestUnlockAgain(c *gc.C) { 53 u := unlocker(c, s.manifold, s.worker) 54 w := waiter(c, s.manifold, s.worker) 55 56 u.Unlock() 57 u.Unlock() 58 assertUnlocked(c, w) 59 } 60 61 func (s *ManifoldSuite) TestSameManifoldWorkersConnected(c *gc.C) { 62 worker2, err := s.manifold.Start(nil) 63 c.Assert(err, jc.ErrorIsNil) 64 defer checkStop(c, worker2) 65 66 u := unlocker(c, s.manifold, s.worker) 67 w := waiter(c, s.manifold, worker2) 68 69 u.Unlock() 70 assertUnlocked(c, w) 71 } 72 73 func (s *ManifoldSuite) TestDifferentManifoldWorkersUnconnected(c *gc.C) { 74 manifold2 := gate.Manifold() 75 worker2, err := manifold2.Start(nil) 76 c.Assert(err, jc.ErrorIsNil) 77 defer checkStop(c, worker2) 78 79 u := unlocker(c, s.manifold, s.worker) 80 w := waiter(c, manifold2, worker2) 81 82 u.Unlock() 83 assertLocked(c, w) 84 } 85 86 func (s *ManifoldSuite) TestAlreadyUnlockedIsUnlocked(c *gc.C) { 87 w := gate.AlreadyUnlocked{} 88 assertUnlocked(c, w) 89 } 90 91 func unlocker(c *gc.C, m dependency.Manifold, w worker.Worker) gate.Unlocker { 92 var unlocker gate.Unlocker 93 err := m.Output(w, &unlocker) 94 c.Assert(err, jc.ErrorIsNil) 95 c.Assert(unlocker, gc.NotNil) 96 return unlocker 97 } 98 99 func waiter(c *gc.C, m dependency.Manifold, w worker.Worker) gate.Waiter { 100 var waiter gate.Waiter 101 err := m.Output(w, &waiter) 102 c.Assert(err, jc.ErrorIsNil) 103 c.Assert(waiter, gc.NotNil) 104 return waiter 105 } 106 107 func assertLocked(c *gc.C, waiter gate.Waiter) { 108 select { 109 case <-waiter.Unlocked(): 110 c.Fatalf("expected gate to be locked") 111 default: 112 } 113 } 114 115 func assertUnlocked(c *gc.C, waiter gate.Waiter) { 116 select { 117 case <-waiter.Unlocked(): 118 default: 119 c.Fatalf("expected gate to be unlocked") 120 } 121 } 122 123 func checkStop(c *gc.C, w worker.Worker) { 124 err := worker.Stop(w) 125 c.Check(err, jc.ErrorIsNil) 126 }