github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/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 "github.com/juju/juju/state/leadership" 16 "github.com/juju/juju/state/lease" 17 ) 18 19 type CheckLeadershipSuite struct { 20 testing.IsolationSuite 21 } 22 23 var _ = gc.Suite(&CheckLeadershipSuite{}) 24 25 func (s *CheckLeadershipSuite) TestSuccess(c *gc.C) { 26 fix := &Fixture{ 27 leases: map[string]lease.Info{ 28 "redis": lease.Info{ 29 Holder: "redis/0", 30 Expiry: offset(time.Second), 31 AssertOp: txn.Op{C: "fake", Id: "fake"}, 32 }, 33 }, 34 } 35 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) { 36 token, err := manager.CheckLeadership("redis", "redis/0") 37 c.Assert(err, jc.ErrorIsNil) 38 c.Check(token.AssertOps(), jc.DeepEquals, []txn.Op{{ 39 C: "fake", Id: "fake", 40 }}) 41 }) 42 } 43 44 func (s *CheckLeadershipSuite) TestMissingRefresh_Success(c *gc.C) { 45 fix := &Fixture{ 46 expectCalls: []call{{ 47 method: "Refresh", 48 callback: func(leases map[string]lease.Info) { 49 leases["redis"] = lease.Info{ 50 Holder: "redis/0", 51 Expiry: offset(time.Second), 52 AssertOp: txn.Op{C: "fake", Id: "fake"}, 53 } 54 }, 55 }}, 56 } 57 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) { 58 token, err := manager.CheckLeadership("redis", "redis/0") 59 c.Assert(err, jc.ErrorIsNil) 60 c.Check(token.AssertOps(), jc.DeepEquals, []txn.Op{{ 61 C: "fake", Id: "fake", 62 }}) 63 }) 64 } 65 66 func (s *CheckLeadershipSuite) 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, _ *Clock) { 80 token, err := manager.CheckLeadership("redis", "redis/0") 81 c.Assert(err, jc.ErrorIsNil) 82 c.Check(token.AssertOps(), jc.DeepEquals, []txn.Op{{ 83 C: "fake", Id: "fake", 84 }}) 85 }) 86 } 87 88 func (s *CheckLeadershipSuite) TestRefresh_Failure_Missing(c *gc.C) { 89 fix := &Fixture{ 90 expectCalls: []call{{ 91 method: "Refresh", 92 }}, 93 } 94 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) { 95 token, err := manager.CheckLeadership("redis", "redis/0") 96 c.Check(err, gc.ErrorMatches, `"redis/0" is not leader of "redis"`) 97 c.Check(token, gc.IsNil) 98 }) 99 } 100 101 func (s *CheckLeadershipSuite) TestRefresh_Failure_OtherHolder(c *gc.C) { 102 fix := &Fixture{ 103 expectCalls: []call{{ 104 method: "Refresh", 105 callback: func(leases map[string]lease.Info) { 106 leases["redis"] = lease.Info{ 107 Holder: "redis/1", 108 Expiry: offset(time.Second), 109 AssertOp: txn.Op{C: "fake", Id: "fake"}, 110 } 111 }, 112 }}, 113 } 114 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) { 115 token, err := manager.CheckLeadership("redis", "redis/0") 116 c.Check(err, gc.ErrorMatches, `"redis/0" is not leader of "redis"`) 117 c.Check(token, gc.IsNil) 118 }) 119 } 120 121 func (s *CheckLeadershipSuite) TestRefresh_Error(c *gc.C) { 122 fix := &Fixture{ 123 expectCalls: []call{{ 124 method: "Refresh", 125 err: errors.New("crunch squish"), 126 }}, 127 expectDirty: true, 128 } 129 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) { 130 token, err := manager.CheckLeadership("redis", "redis/0") 131 c.Check(err, gc.ErrorMatches, "leadership manager stopped") 132 c.Check(token, gc.IsNil) 133 err = manager.Wait() 134 c.Check(err, gc.ErrorMatches, "crunch squish") 135 }) 136 }