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