github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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  	jc "github.com/juju/testing/checkers"
    10  	"github.com/juju/utils/clock"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/core/lease"
    14  	"github.com/juju/juju/state"
    15  	coretesting "github.com/juju/juju/testing"
    16  )
    17  
    18  type SingularSuite struct {
    19  	clock *coretesting.Clock
    20  	ConnSuite
    21  }
    22  
    23  var _ = gc.Suite(&SingularSuite{})
    24  
    25  func (s *SingularSuite) SetUpSuite(c *gc.C) {
    26  	s.ConnSuite.SetUpSuite(c)
    27  	s.PatchValue(&state.GetClock, func() clock.Clock {
    28  		return s.clock
    29  	})
    30  }
    31  
    32  func (s *SingularSuite) SetUpTest(c *gc.C) {
    33  	s.clock = coretesting.NewClock(time.Now())
    34  	s.ConnSuite.SetUpTest(c)
    35  }
    36  
    37  func (s *SingularSuite) TestClaimBadLease(c *gc.C) {
    38  	claimer := s.State.SingularClaimer()
    39  	err := claimer.Claim("xxx", "machine-123", time.Minute)
    40  	c.Check(err, gc.ErrorMatches, `cannot claim lease "xxx": expected environ UUID`)
    41  }
    42  
    43  func (s *SingularSuite) TestClaimBadHolder(c *gc.C) {
    44  	claimer := s.State.SingularClaimer()
    45  	err := claimer.Claim(s.modelTag.Id(), "unit-foo-1", time.Minute)
    46  	c.Check(err, gc.ErrorMatches, `cannot claim lease for holder "unit-foo-1": expected machine tag`)
    47  }
    48  
    49  func (s *SingularSuite) TestClaimBadDuration(c *gc.C) {
    50  	claimer := s.State.SingularClaimer()
    51  	err := claimer.Claim(s.modelTag.Id(), "machine-123", 0)
    52  	c.Check(err, gc.ErrorMatches, `cannot claim lease for 0: non-positive`)
    53  }
    54  
    55  func (s *SingularSuite) TestClaim(c *gc.C) {
    56  	claimer := s.State.SingularClaimer()
    57  	err := claimer.Claim(s.modelTag.Id(), "machine-123", time.Minute)
    58  	c.Assert(err, jc.ErrorIsNil)
    59  
    60  	err = claimer.Claim(s.modelTag.Id(), "machine-123", time.Minute)
    61  	c.Assert(err, jc.ErrorIsNil)
    62  
    63  	err = claimer.Claim(s.modelTag.Id(), "machine-456", time.Minute)
    64  	c.Assert(err, gc.Equals, lease.ErrClaimDenied)
    65  }
    66  
    67  func (s *SingularSuite) TestExpire(c *gc.C) {
    68  	claimer := s.State.SingularClaimer()
    69  	err := claimer.Claim(s.modelTag.Id(), "machine-123", time.Minute)
    70  	c.Assert(err, jc.ErrorIsNil)
    71  
    72  	wait := make(chan error)
    73  	go func() {
    74  		wait <- claimer.WaitUntilExpired(s.modelTag.Id())
    75  	}()
    76  	select {
    77  	case err := <-wait:
    78  		c.Fatalf("expired early with %v", err)
    79  	case <-time.After(coretesting.ShortWait):
    80  	}
    81  
    82  	s.clock.Advance(time.Hour)
    83  	select {
    84  	case err := <-wait:
    85  		c.Check(err, jc.ErrorIsNil)
    86  	case <-time.After(coretesting.LongWait):
    87  		c.Fatalf("never expired")
    88  	}
    89  
    90  	err = claimer.Claim(s.modelTag.Id(), "machine-456", time.Minute)
    91  	c.Assert(err, jc.ErrorIsNil)
    92  }