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 }