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  // ------------------------------------