github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/singular_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	"time"
     8  
     9  	jujutesting "github.com/juju/testing"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/core/lease"
    14  	coretesting "github.com/juju/juju/testing"
    15  )
    16  
    17  type SingularSuite struct {
    18  	ConnSuite
    19  	clock *jujutesting.Clock
    20  }
    21  
    22  var _ = gc.Suite(&SingularSuite{})
    23  
    24  func (s *SingularSuite) SetUpTest(c *gc.C) {
    25  	s.ConnSuite.SetUpTest(c)
    26  	s.clock = jujutesting.NewClock(time.Now())
    27  	err := s.State.SetClockForTesting(s.clock)
    28  	c.Assert(err, jc.ErrorIsNil)
    29  }
    30  
    31  func (s *SingularSuite) TestClaimBadLease(c *gc.C) {
    32  	claimer := s.State.SingularClaimer()
    33  	err := claimer.Claim("xxx", "machine-123", time.Minute)
    34  	c.Check(err, gc.ErrorMatches, `cannot claim lease "xxx": expected environ UUID`)
    35  }
    36  
    37  func (s *SingularSuite) TestClaimBadHolder(c *gc.C) {
    38  	claimer := s.State.SingularClaimer()
    39  	err := claimer.Claim(s.modelTag.Id(), "unit-foo-1", time.Minute)
    40  	c.Check(err, gc.ErrorMatches, `cannot claim lease for holder "unit-foo-1": expected machine tag`)
    41  }
    42  
    43  func (s *SingularSuite) TestClaimBadDuration(c *gc.C) {
    44  	claimer := s.State.SingularClaimer()
    45  	err := claimer.Claim(s.modelTag.Id(), "machine-123", 0)
    46  	c.Check(err, gc.ErrorMatches, `cannot claim lease for 0s?: non-positive`)
    47  }
    48  
    49  func (s *SingularSuite) TestClaim(c *gc.C) {
    50  	claimer := s.State.SingularClaimer()
    51  	err := claimer.Claim(s.modelTag.Id(), "machine-123", time.Minute)
    52  	c.Assert(err, jc.ErrorIsNil)
    53  
    54  	err = claimer.Claim(s.modelTag.Id(), "machine-123", time.Minute)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  
    57  	err = claimer.Claim(s.modelTag.Id(), "machine-456", time.Minute)
    58  	c.Assert(err, gc.Equals, lease.ErrClaimDenied)
    59  }
    60  
    61  func (s *SingularSuite) TestExpire(c *gc.C) {
    62  	claimer := s.State.SingularClaimer()
    63  	err := claimer.Claim(s.modelTag.Id(), "machine-123", time.Minute)
    64  	c.Assert(err, jc.ErrorIsNil)
    65  
    66  	wait := make(chan error)
    67  	go func() {
    68  		wait <- claimer.WaitUntilExpired(s.modelTag.Id())
    69  	}()
    70  	select {
    71  	case err := <-wait:
    72  		c.Fatalf("expired early with %v", err)
    73  	case <-time.After(coretesting.ShortWait):
    74  	}
    75  
    76  	s.clock.Advance(time.Hour)
    77  	select {
    78  	case err := <-wait:
    79  		c.Check(err, jc.ErrorIsNil)
    80  	case <-time.After(coretesting.LongWait):
    81  		c.Fatalf("never expired")
    82  	}
    83  
    84  	err = claimer.Claim(s.modelTag.Id(), "machine-456", time.Minute)
    85  	c.Assert(err, jc.ErrorIsNil)
    86  }