github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/state/leadership/manager_check_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package leadership_test 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/mgo.v2/txn" 14 15 coreleadership "github.com/juju/juju/leadership" 16 "github.com/juju/juju/state/leadership" 17 "github.com/juju/juju/state/lease" 18 coretesting "github.com/juju/juju/testing" 19 ) 20 21 type LeadershipCheckSuite struct { 22 testing.IsolationSuite 23 } 24 25 var _ = gc.Suite(&LeadershipCheckSuite{}) 26 27 func (s *LeadershipCheckSuite) TestSuccess(c *gc.C) { 28 fix := &Fixture{ 29 leases: map[string]lease.Info{ 30 "redis": lease.Info{ 31 Holder: "redis/0", 32 Expiry: offset(time.Second), 33 AssertOp: txn.Op{C: "fake", Id: "fake"}, 34 }, 35 }, 36 } 37 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 38 token := manager.LeadershipCheck("redis", "redis/0") 39 c.Check(assertOps(c, token), jc.DeepEquals, []txn.Op{{ 40 C: "fake", Id: "fake", 41 }}) 42 }) 43 } 44 45 func (s *LeadershipCheckSuite) TestMissingRefresh_Success(c *gc.C) { 46 fix := &Fixture{ 47 expectCalls: []call{{ 48 method: "Refresh", 49 callback: func(leases map[string]lease.Info) { 50 leases["redis"] = lease.Info{ 51 Holder: "redis/0", 52 Expiry: offset(time.Second), 53 AssertOp: txn.Op{C: "fake", Id: "fake"}, 54 } 55 }, 56 }}, 57 } 58 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 59 token := manager.LeadershipCheck("redis", "redis/0") 60 c.Check(assertOps(c, token), jc.DeepEquals, []txn.Op{{ 61 C: "fake", Id: "fake", 62 }}) 63 }) 64 } 65 66 func (s *LeadershipCheckSuite) TestOtherHolderRefresh_Success(c *gc.C) { 67 fix := &Fixture{ 68 expectCalls: []call{{ 69 method: "Refresh", 70 callback: func(leases map[string]lease.Info) { 71 leases["redis"] = lease.Info{ 72 Holder: "redis/0", 73 Expiry: offset(time.Second), 74 AssertOp: txn.Op{C: "fake", Id: "fake"}, 75 } 76 }, 77 }}, 78 } 79 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 80 token := manager.LeadershipCheck("redis", "redis/0") 81 c.Check(assertOps(c, token), jc.DeepEquals, []txn.Op{{ 82 C: "fake", Id: "fake", 83 }}) 84 }) 85 } 86 87 func (s *LeadershipCheckSuite) TestRefresh_Failure_Missing(c *gc.C) { 88 fix := &Fixture{ 89 expectCalls: []call{{ 90 method: "Refresh", 91 }}, 92 } 93 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 94 token := manager.LeadershipCheck("redis", "redis/0") 95 c.Check(token.Check(nil), gc.ErrorMatches, `"redis/0" is not leader of "redis"`) 96 }) 97 } 98 99 func (s *LeadershipCheckSuite) TestRefresh_Failure_OtherHolder(c *gc.C) { 100 fix := &Fixture{ 101 expectCalls: []call{{ 102 method: "Refresh", 103 callback: func(leases map[string]lease.Info) { 104 leases["redis"] = lease.Info{ 105 Holder: "redis/1", 106 Expiry: offset(time.Second), 107 AssertOp: txn.Op{C: "fake", Id: "fake"}, 108 } 109 }, 110 }}, 111 } 112 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 113 token := manager.LeadershipCheck("redis", "redis/0") 114 c.Check(token.Check(nil), gc.ErrorMatches, `"redis/0" is not leader of "redis"`) 115 }) 116 } 117 118 func (s *LeadershipCheckSuite) TestRefresh_Error(c *gc.C) { 119 fix := &Fixture{ 120 expectCalls: []call{{ 121 method: "Refresh", 122 err: errors.New("crunch squish"), 123 }}, 124 expectDirty: true, 125 } 126 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 127 token := manager.LeadershipCheck("redis", "redis/0") 128 c.Check(token.Check(nil), gc.ErrorMatches, "leadership manager stopped") 129 err := manager.Wait() 130 c.Check(err, gc.ErrorMatches, "crunch squish") 131 }) 132 } 133 134 func assertOps(c *gc.C, token coreleadership.Token) (out []txn.Op) { 135 err := token.Check(&out) 136 c.Check(err, jc.ErrorIsNil) 137 return out 138 }