github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/state/leadership/manager_claim_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package leadership_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	coreleadership "github.com/juju/juju/leadership"
    15  	"github.com/juju/juju/state/leadership"
    16  	"github.com/juju/juju/state/lease"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  type ClaimLeadershipSuite struct {
    21  	testing.IsolationSuite
    22  }
    23  
    24  var _ = gc.Suite(&ClaimLeadershipSuite{})
    25  
    26  func (s *ClaimLeadershipSuite) TestClaimLease_Success(c *gc.C) {
    27  	fix := &Fixture{
    28  		expectCalls: []call{{
    29  			method: "ClaimLease",
    30  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
    31  		}},
    32  	}
    33  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
    34  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
    35  		c.Check(err, jc.ErrorIsNil)
    36  	})
    37  }
    38  
    39  func (s *ClaimLeadershipSuite) TestClaimLease_Success_SameHolder(c *gc.C) {
    40  	fix := &Fixture{
    41  		expectCalls: []call{{
    42  			method: "ClaimLease",
    43  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
    44  			err:    lease.ErrInvalid,
    45  			callback: func(leases map[string]lease.Info) {
    46  				leases["redis"] = lease.Info{
    47  					Holder: "redis/0",
    48  					Expiry: offset(time.Second),
    49  				}
    50  			},
    51  		}, {
    52  			method: "ExtendLease",
    53  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
    54  		}},
    55  	}
    56  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
    57  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
    58  		c.Check(err, jc.ErrorIsNil)
    59  	})
    60  }
    61  
    62  func (s *ClaimLeadershipSuite) TestClaimLease_Failure_OtherHolder(c *gc.C) {
    63  	fix := &Fixture{
    64  		expectCalls: []call{{
    65  			method: "ClaimLease",
    66  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
    67  			err:    lease.ErrInvalid,
    68  			callback: func(leases map[string]lease.Info) {
    69  				leases["redis"] = lease.Info{
    70  					Holder: "redis/1",
    71  					Expiry: offset(time.Second),
    72  				}
    73  			},
    74  		}},
    75  	}
    76  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
    77  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
    78  		c.Check(err, gc.Equals, coreleadership.ErrClaimDenied)
    79  	})
    80  }
    81  
    82  func (s *ClaimLeadershipSuite) TestClaimLease_Failure_Error(c *gc.C) {
    83  	fix := &Fixture{
    84  		expectCalls: []call{{
    85  			method: "ClaimLease",
    86  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
    87  			err:    errors.New("lol borken"),
    88  		}},
    89  		expectDirty: true,
    90  	}
    91  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
    92  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
    93  		c.Check(err, gc.ErrorMatches, "leadership manager stopped")
    94  		err = manager.Wait()
    95  		c.Check(err, gc.ErrorMatches, "lol borken")
    96  	})
    97  }
    98  
    99  func (s *ClaimLeadershipSuite) TestExtendLease_Success(c *gc.C) {
   100  	fix := &Fixture{
   101  		leases: map[string]lease.Info{
   102  			"redis": lease.Info{
   103  				Holder: "redis/0",
   104  				Expiry: offset(time.Second),
   105  			},
   106  		},
   107  		expectCalls: []call{{
   108  			method: "ExtendLease",
   109  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
   110  		}},
   111  	}
   112  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
   113  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
   114  		c.Check(err, jc.ErrorIsNil)
   115  	})
   116  }
   117  
   118  func (s *ClaimLeadershipSuite) TestExtendLease_Success_Expired(c *gc.C) {
   119  	fix := &Fixture{
   120  		leases: map[string]lease.Info{
   121  			"redis": lease.Info{
   122  				Holder: "redis/0",
   123  				Expiry: offset(time.Second),
   124  			},
   125  		},
   126  		expectCalls: []call{{
   127  			method: "ExtendLease",
   128  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
   129  			err:    lease.ErrInvalid,
   130  			callback: func(leases map[string]lease.Info) {
   131  				delete(leases, "redis")
   132  			},
   133  		}, {
   134  			method: "ClaimLease",
   135  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
   136  		}},
   137  	}
   138  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
   139  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
   140  		c.Check(err, jc.ErrorIsNil)
   141  	})
   142  }
   143  
   144  func (s *ClaimLeadershipSuite) TestExtendLease_Failure_OtherHolder(c *gc.C) {
   145  	fix := &Fixture{
   146  		leases: map[string]lease.Info{
   147  			"redis": lease.Info{
   148  				Holder: "redis/0",
   149  				Expiry: offset(time.Second),
   150  			},
   151  		},
   152  		expectCalls: []call{{
   153  			method: "ExtendLease",
   154  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
   155  			err:    lease.ErrInvalid,
   156  			callback: func(leases map[string]lease.Info) {
   157  				leases["redis"] = lease.Info{
   158  					Holder: "redis/1",
   159  					Expiry: offset(time.Second),
   160  				}
   161  			},
   162  		}},
   163  	}
   164  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
   165  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
   166  		c.Check(err, gc.Equals, coreleadership.ErrClaimDenied)
   167  	})
   168  }
   169  
   170  func (s *ClaimLeadershipSuite) TestExtendLease_Failure_Error(c *gc.C) {
   171  	fix := &Fixture{
   172  		leases: map[string]lease.Info{
   173  			"redis": lease.Info{
   174  				Holder: "redis/0",
   175  				Expiry: offset(time.Second),
   176  			},
   177  		},
   178  		expectCalls: []call{{
   179  			method: "ExtendLease",
   180  			args:   []interface{}{"redis", lease.Request{"redis/0", time.Minute}},
   181  			err:    errors.New("boom splat"),
   182  		}},
   183  		expectDirty: true,
   184  	}
   185  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
   186  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
   187  		c.Check(err, gc.ErrorMatches, "leadership manager stopped")
   188  		err = manager.Wait()
   189  		c.Check(err, gc.ErrorMatches, "boom splat")
   190  	})
   191  }
   192  
   193  func (s *ClaimLeadershipSuite) TestOtherHolder_Failure(c *gc.C) {
   194  	fix := &Fixture{
   195  		leases: map[string]lease.Info{
   196  			"redis": lease.Info{
   197  				Holder: "redis/1",
   198  				Expiry: offset(time.Second),
   199  			},
   200  		},
   201  	}
   202  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *coretesting.Clock) {
   203  		err := manager.ClaimLeadership("redis", "redis/0", time.Minute)
   204  		c.Check(err, gc.Equals, coreleadership.ErrClaimDenied)
   205  	})
   206  }