github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/state/leadership/manager_check_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  	"gopkg.in/mgo.v2/txn"
    14  
    15  	"github.com/juju/juju/state/leadership"
    16  	"github.com/juju/juju/state/lease"
    17  )
    18  
    19  type CheckLeadershipSuite struct {
    20  	testing.IsolationSuite
    21  }
    22  
    23  var _ = gc.Suite(&CheckLeadershipSuite{})
    24  
    25  func (s *CheckLeadershipSuite) TestSuccess(c *gc.C) {
    26  	fix := &Fixture{
    27  		leases: map[string]lease.Info{
    28  			"redis": lease.Info{
    29  				Holder:   "redis/0",
    30  				Expiry:   offset(time.Second),
    31  				AssertOp: txn.Op{C: "fake", Id: "fake"},
    32  			},
    33  		},
    34  	}
    35  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) {
    36  		token, err := manager.CheckLeadership("redis", "redis/0")
    37  		c.Assert(err, jc.ErrorIsNil)
    38  		c.Check(token.AssertOps(), jc.DeepEquals, []txn.Op{{
    39  			C: "fake", Id: "fake",
    40  		}})
    41  	})
    42  }
    43  
    44  func (s *CheckLeadershipSuite) TestMissingRefresh_Success(c *gc.C) {
    45  	fix := &Fixture{
    46  		expectCalls: []call{{
    47  			method: "Refresh",
    48  			callback: func(leases map[string]lease.Info) {
    49  				leases["redis"] = lease.Info{
    50  					Holder:   "redis/0",
    51  					Expiry:   offset(time.Second),
    52  					AssertOp: txn.Op{C: "fake", Id: "fake"},
    53  				}
    54  			},
    55  		}},
    56  	}
    57  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) {
    58  		token, err := manager.CheckLeadership("redis", "redis/0")
    59  		c.Assert(err, jc.ErrorIsNil)
    60  		c.Check(token.AssertOps(), jc.DeepEquals, []txn.Op{{
    61  			C: "fake", Id: "fake",
    62  		}})
    63  	})
    64  }
    65  
    66  func (s *CheckLeadershipSuite) TestOtherHolderRefresh_Success(c *gc.C) {
    67  	fix := &Fixture{
    68  		expectCalls: []call{{
    69  			method: "Refresh",
    70  			callback: func(leases map[string]lease.Info) {
    71  				leases["redis"] = lease.Info{
    72  					Holder:   "redis/0",
    73  					Expiry:   offset(time.Second),
    74  					AssertOp: txn.Op{C: "fake", Id: "fake"},
    75  				}
    76  			},
    77  		}},
    78  	}
    79  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) {
    80  		token, err := manager.CheckLeadership("redis", "redis/0")
    81  		c.Assert(err, jc.ErrorIsNil)
    82  		c.Check(token.AssertOps(), jc.DeepEquals, []txn.Op{{
    83  			C: "fake", Id: "fake",
    84  		}})
    85  	})
    86  }
    87  
    88  func (s *CheckLeadershipSuite) TestRefresh_Failure_Missing(c *gc.C) {
    89  	fix := &Fixture{
    90  		expectCalls: []call{{
    91  			method: "Refresh",
    92  		}},
    93  	}
    94  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) {
    95  		token, err := manager.CheckLeadership("redis", "redis/0")
    96  		c.Check(err, gc.ErrorMatches, `"redis/0" is not leader of "redis"`)
    97  		c.Check(token, gc.IsNil)
    98  	})
    99  }
   100  
   101  func (s *CheckLeadershipSuite) TestRefresh_Failure_OtherHolder(c *gc.C) {
   102  	fix := &Fixture{
   103  		expectCalls: []call{{
   104  			method: "Refresh",
   105  			callback: func(leases map[string]lease.Info) {
   106  				leases["redis"] = lease.Info{
   107  					Holder:   "redis/1",
   108  					Expiry:   offset(time.Second),
   109  					AssertOp: txn.Op{C: "fake", Id: "fake"},
   110  				}
   111  			},
   112  		}},
   113  	}
   114  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) {
   115  		token, err := manager.CheckLeadership("redis", "redis/0")
   116  		c.Check(err, gc.ErrorMatches, `"redis/0" is not leader of "redis"`)
   117  		c.Check(token, gc.IsNil)
   118  	})
   119  }
   120  
   121  func (s *CheckLeadershipSuite) TestRefresh_Error(c *gc.C) {
   122  	fix := &Fixture{
   123  		expectCalls: []call{{
   124  			method: "Refresh",
   125  			err:    errors.New("crunch squish"),
   126  		}},
   127  		expectDirty: true,
   128  	}
   129  	fix.RunTest(c, func(manager leadership.ManagerWorker, _ *Clock) {
   130  		token, err := manager.CheckLeadership("redis", "redis/0")
   131  		c.Check(err, gc.ErrorMatches, "leadership manager stopped")
   132  		c.Check(token, gc.IsNil)
   133  		err = manager.Wait()
   134  		c.Check(err, gc.ErrorMatches, "crunch squish")
   135  	})
   136  }