github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/state/leadership/manager_claim_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 14 coreleadership "github.com/juju/juju/leadership" 15 "github.com/juju/juju/state/leadership" 16 "github.com/juju/juju/state/lease" 17 coretesting "github.com/juju/juju/testing" 18 ) 19 20 type ClaimLeadershipSuite struct { 21 testing.IsolationSuite 22 } 23 24 var _ = gc.Suite(&ClaimLeadershipSuite{}) 25 26 func (s *ClaimLeadershipSuite) TestClaimLease_Success(c *gc.C) { 27 fix := &Fixture{ 28 expectCalls: []call{{ 29 method: "ClaimLease", 30 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 31 }}, 32 } 33 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 34 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 35 c.Check(err, jc.ErrorIsNil) 36 }) 37 } 38 39 func (s *ClaimLeadershipSuite) TestClaimLease_Success_SameHolder(c *gc.C) { 40 fix := &Fixture{ 41 expectCalls: []call{{ 42 method: "ClaimLease", 43 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 44 err: lease.ErrInvalid, 45 callback: func(leases map[string]lease.Info) { 46 leases["redis"] = lease.Info{ 47 Holder: "redis/0", 48 Expiry: offset(time.Second), 49 } 50 }, 51 }, { 52 method: "ExtendLease", 53 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 54 }}, 55 } 56 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 57 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 58 c.Check(err, jc.ErrorIsNil) 59 }) 60 } 61 62 func (s *ClaimLeadershipSuite) TestClaimLease_Failure_OtherHolder(c *gc.C) { 63 fix := &Fixture{ 64 expectCalls: []call{{ 65 method: "ClaimLease", 66 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 67 err: lease.ErrInvalid, 68 callback: func(leases map[string]lease.Info) { 69 leases["redis"] = lease.Info{ 70 Holder: "redis/1", 71 Expiry: offset(time.Second), 72 } 73 }, 74 }}, 75 } 76 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 77 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 78 c.Check(err, gc.Equals, coreleadership.ErrClaimDenied) 79 }) 80 } 81 82 func (s *ClaimLeadershipSuite) TestClaimLease_Failure_Error(c *gc.C) { 83 fix := &Fixture{ 84 expectCalls: []call{{ 85 method: "ClaimLease", 86 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 87 err: errors.New("lol borken"), 88 }}, 89 expectDirty: true, 90 } 91 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 92 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 93 c.Check(err, gc.ErrorMatches, "leadership manager stopped") 94 err = manager.Wait() 95 c.Check(err, gc.ErrorMatches, "lol borken") 96 }) 97 } 98 99 func (s *ClaimLeadershipSuite) TestExtendLease_Success(c *gc.C) { 100 fix := &Fixture{ 101 leases: map[string]lease.Info{ 102 "redis": lease.Info{ 103 Holder: "redis/0", 104 Expiry: offset(time.Second), 105 }, 106 }, 107 expectCalls: []call{{ 108 method: "ExtendLease", 109 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 110 }}, 111 } 112 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 113 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 114 c.Check(err, jc.ErrorIsNil) 115 }) 116 } 117 118 func (s *ClaimLeadershipSuite) TestExtendLease_Success_Expired(c *gc.C) { 119 fix := &Fixture{ 120 leases: map[string]lease.Info{ 121 "redis": lease.Info{ 122 Holder: "redis/0", 123 Expiry: offset(time.Second), 124 }, 125 }, 126 expectCalls: []call{{ 127 method: "ExtendLease", 128 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 129 err: lease.ErrInvalid, 130 callback: func(leases map[string]lease.Info) { 131 delete(leases, "redis") 132 }, 133 }, { 134 method: "ClaimLease", 135 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 136 }}, 137 } 138 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 139 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 140 c.Check(err, jc.ErrorIsNil) 141 }) 142 } 143 144 func (s *ClaimLeadershipSuite) TestExtendLease_Failure_OtherHolder(c *gc.C) { 145 fix := &Fixture{ 146 leases: map[string]lease.Info{ 147 "redis": lease.Info{ 148 Holder: "redis/0", 149 Expiry: offset(time.Second), 150 }, 151 }, 152 expectCalls: []call{{ 153 method: "ExtendLease", 154 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 155 err: lease.ErrInvalid, 156 callback: func(leases map[string]lease.Info) { 157 leases["redis"] = lease.Info{ 158 Holder: "redis/1", 159 Expiry: offset(time.Second), 160 } 161 }, 162 }}, 163 } 164 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 165 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 166 c.Check(err, gc.Equals, coreleadership.ErrClaimDenied) 167 }) 168 } 169 170 func (s *ClaimLeadershipSuite) TestExtendLease_Failure_Error(c *gc.C) { 171 fix := &Fixture{ 172 leases: map[string]lease.Info{ 173 "redis": lease.Info{ 174 Holder: "redis/0", 175 Expiry: offset(time.Second), 176 }, 177 }, 178 expectCalls: []call{{ 179 method: "ExtendLease", 180 args: []interface{}{"redis", lease.Request{"redis/0", time.Minute}}, 181 err: errors.New("boom splat"), 182 }}, 183 expectDirty: true, 184 } 185 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 186 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 187 c.Check(err, gc.ErrorMatches, "leadership manager stopped") 188 err = manager.Wait() 189 c.Check(err, gc.ErrorMatches, "boom splat") 190 }) 191 } 192 193 func (s *ClaimLeadershipSuite) TestOtherHolder_Failure(c *gc.C) { 194 fix := &Fixture{ 195 leases: map[string]lease.Info{ 196 "redis": lease.Info{ 197 Holder: "redis/1", 198 Expiry: offset(time.Second), 199 }, 200 }, 201 } 202 fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) { 203 err := manager.ClaimLeadership("redis", "redis/0", time.Minute) 204 c.Check(err, gc.Equals, coreleadership.ErrClaimDenied) 205 }) 206 }