github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/state/lease/store_assert_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" // Only used for time types.
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/mgo.v2/txn"
    12  
    13  	"github.com/juju/juju/core/lease"
    14  )
    15  
    16  // StoreAssertSuite tests that AssertOp does what it should.
    17  type StoreAssertSuite struct {
    18  	FixtureSuite
    19  	fix  *Fixture
    20  	info lease.Info
    21  }
    22  
    23  var _ = gc.Suite(&StoreAssertSuite{})
    24  
    25  func key(name string) lease.Key {
    26  	return lease.Key{
    27  		Namespace: "default-namespace",
    28  		ModelUUID: "model-uuid",
    29  		Lease:     name,
    30  	}
    31  }
    32  
    33  func (s *StoreAssertSuite) SetUpTest(c *gc.C) {
    34  	s.FixtureSuite.SetUpTest(c)
    35  	s.fix = s.EasyFixture(c)
    36  	key := lease.Key{"default-namespace", "model-uuid", "name"}
    37  	err := s.fix.Store.ClaimLease(key, lease.Request{"holder", time.Minute})
    38  	c.Assert(err, jc.ErrorIsNil)
    39  	c.Assert(key, s.fix.Holder(), "holder")
    40  }
    41  
    42  func (s *StoreAssertSuite) TestPassesWhenLeaseHeld(c *gc.C) {
    43  	info := s.fix.Store.Leases()[key("name")]
    44  
    45  	var ops []txn.Op
    46  	err := info.Trapdoor(0, &ops)
    47  	c.Check(err, jc.ErrorIsNil)
    48  	err = s.fix.Runner.RunTransaction(ops)
    49  	c.Check(err, jc.ErrorIsNil)
    50  }
    51  
    52  func (s *StoreAssertSuite) TestPassesWhenLeaseStillHeldDespiteWriterChange(c *gc.C) {
    53  	info := s.fix.Store.Leases()[key("name")]
    54  
    55  	fix2 := s.NewFixture(c, FixtureParams{Id: "other-store"})
    56  	err := fix2.Store.ExtendLease(key("name"), lease.Request{"holder", time.Hour})
    57  	c.Assert(err, jc.ErrorIsNil)
    58  
    59  	var ops []txn.Op
    60  	err = info.Trapdoor(0, &ops)
    61  	c.Check(err, jc.ErrorIsNil)
    62  	err = s.fix.Runner.RunTransaction(ops)
    63  	c.Check(err, gc.IsNil)
    64  }
    65  
    66  func (s *StoreAssertSuite) TestPassesWhenLeaseStillHeldDespitePassingExpiry(c *gc.C) {
    67  	info := s.fix.Store.Leases()[key("name")]
    68  
    69  	s.fix.GlobalClock.Advance(time.Hour)
    70  	err := s.fix.Store.Refresh()
    71  	c.Assert(err, jc.ErrorIsNil)
    72  
    73  	var ops []txn.Op
    74  	err = info.Trapdoor(0, &ops)
    75  	c.Check(err, jc.ErrorIsNil)
    76  	err = s.fix.Runner.RunTransaction(ops)
    77  	c.Check(err, gc.IsNil)
    78  }
    79  
    80  func (s *StoreAssertSuite) TestAbortsWhenLeaseVacant(c *gc.C) {
    81  	info := s.fix.Store.Leases()[key("name")]
    82  
    83  	s.fix.GlobalClock.Advance(time.Hour)
    84  	err := s.fix.Store.ExpireLease(key("name"))
    85  	c.Assert(err, jc.ErrorIsNil)
    86  
    87  	var ops []txn.Op
    88  	err = info.Trapdoor(0, &ops)
    89  	c.Check(err, jc.ErrorIsNil)
    90  	err = s.fix.Runner.RunTransaction(ops)
    91  	c.Check(err, gc.Equals, txn.ErrAborted)
    92  }