github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/lease/client_remote_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package lease_test 5 6 import ( 7 "time" 8 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/core/lease" 13 ) 14 15 // ClientRemoteSuite checks that clients do not break one another's promises. 16 type ClientRemoteSuite struct { 17 FixtureSuite 18 lease time.Duration 19 offset time.Duration 20 readTime time.Duration 21 baseline *Fixture 22 skewed *Fixture 23 } 24 25 var _ = gc.Suite(&ClientRemoteSuite{}) 26 27 func (s *ClientRemoteSuite) SetUpTest(c *gc.C) { 28 s.FixtureSuite.SetUpTest(c) 29 30 s.lease = time.Minute 31 s.offset = time.Second 32 s.readTime = 100 * time.Millisecond 33 34 s.baseline = s.EasyFixture(c) 35 err := s.baseline.Client.ClaimLease("name", lease.Request{"holder", s.lease}) 36 c.Assert(err, jc.ErrorIsNil) 37 38 // Remote client, possibly reading in the future and possibly just ahead 39 // by a second, taking 100ms to read the clock doc; sees same lease with 40 // suitable uncertainty. 41 s.skewed = s.NewFixture(c, FixtureParams{ 42 Id: "remote-client", 43 ClockStart: s.baseline.Zero.Add(s.offset), 44 ClockStep: s.readTime, 45 }) 46 // We don't really want the clock to keep going outside our control here. 47 s.skewed.Clock.step = 0 48 } 49 50 func (s *ClientRemoteSuite) guaranteedUntil() time.Time { 51 return s.baseline.Zero.Add(s.lease + s.offset) 52 } 53 54 func (s *ClientRemoteSuite) latestValid() time.Time { 55 return s.guaranteedUntil().Add(s.readTime) 56 } 57 58 func (s *ClientRemoteSuite) TestReadSkew(c *gc.C) { 59 c.Check("name", s.skewed.Holder(), "holder") 60 c.Check("name", s.skewed.Expiry(), s.latestValid()) 61 } 62 63 func (s *ClientRemoteSuite) TestExtendRemoteLeaseNoop(c *gc.C) { 64 err := s.skewed.Client.ExtendLease("name", lease.Request{"holder", 10 * time.Second}) 65 c.Check(err, jc.ErrorIsNil) 66 67 c.Check("name", s.skewed.Holder(), "holder") 68 c.Check("name", s.skewed.Expiry(), s.latestValid()) 69 } 70 71 func (s *ClientRemoteSuite) TestExtendRemoteLeaseSimpleExtend(c *gc.C) { 72 leaseDuration := 10 * time.Minute 73 err := s.skewed.Client.ExtendLease("name", lease.Request{"holder", leaseDuration}) 74 c.Check(err, jc.ErrorIsNil) 75 76 c.Check("name", s.skewed.Holder(), "holder") 77 expectExpiry := s.skewed.Clock.Now().Add(leaseDuration) 78 c.Check("name", s.skewed.Expiry(), expectExpiry) 79 } 80 81 func (s *ClientRemoteSuite) TestExtendRemoteLeasePaddedExtend(c *gc.C) { 82 needsPadding := s.lease - s.readTime 83 err := s.skewed.Client.ExtendLease("name", lease.Request{"holder", needsPadding}) 84 c.Check(err, jc.ErrorIsNil) 85 86 c.Check("name", s.skewed.Holder(), "holder") 87 c.Check("name", s.skewed.Expiry(), s.latestValid()) 88 } 89 90 func (s *ClientRemoteSuite) TestCannotExpireRemoteLeaseEarly(c *gc.C) { 91 s.skewed.Clock.Reset(s.latestValid(), 0) 92 err := s.skewed.Client.ExpireLease("name") 93 c.Check(err, gc.Equals, lease.ErrInvalid) 94 } 95 96 func (s *ClientRemoteSuite) TestCanExpireRemoteLease(c *gc.C) { 97 s.skewed.Clock.Reset(s.latestValid().Add(time.Nanosecond), 0) 98 err := s.skewed.Client.ExpireLease("name") 99 c.Check(err, jc.ErrorIsNil) 100 } 101 102 // ------------------------------------