github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/lease/manager_validation_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lease_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/clock/testclock"
    11  	"github.com/juju/errors"
    12  	"github.com/juju/loggo"
    13  	"github.com/juju/testing"
    14  	jc "github.com/juju/testing/checkers"
    15  	"github.com/prometheus/client_golang/prometheus"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	corelease "github.com/juju/juju/core/lease"
    19  	"github.com/juju/juju/worker/lease"
    20  )
    21  
    22  type ValidationSuite struct {
    23  	testing.IsolationSuite
    24  
    25  	config lease.ManagerConfig
    26  }
    27  
    28  var _ = gc.Suite(&ValidationSuite{})
    29  
    30  func (s *ValidationSuite) SetUpTest(c *gc.C) {
    31  	s.IsolationSuite.SetUpTest(c)
    32  	s.config = lease.ManagerConfig{
    33  		Store: struct{ corelease.Store }{},
    34  		Clock: struct{ clock.Clock }{},
    35  		Secretary: func(string) (lease.Secretary, error) {
    36  			return nil, nil
    37  		},
    38  		MaxSleep:             time.Minute,
    39  		Logger:               loggo.GetLogger("lease_test"),
    40  		PrometheusRegisterer: struct{ prometheus.Registerer }{},
    41  	}
    42  }
    43  
    44  func (s *ValidationSuite) TestConfigValid(c *gc.C) {
    45  	err := s.config.Validate()
    46  	c.Assert(err, jc.ErrorIsNil)
    47  }
    48  
    49  func (s *ValidationSuite) TestMissingStore(c *gc.C) {
    50  	s.config.Store = nil
    51  	manager, err := lease.NewManager(s.config)
    52  	c.Check(err, gc.ErrorMatches, "nil Store not valid")
    53  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    54  	c.Check(manager, gc.IsNil)
    55  }
    56  
    57  func (s *ValidationSuite) TestMissingClock(c *gc.C) {
    58  	s.config.Clock = nil
    59  	manager, err := lease.NewManager(s.config)
    60  	c.Check(err, gc.ErrorMatches, "nil Clock not valid")
    61  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    62  	c.Check(manager, gc.IsNil)
    63  }
    64  
    65  func (s *ValidationSuite) TestMissingLogger(c *gc.C) {
    66  	s.config.Logger = nil
    67  	manager, err := lease.NewManager(s.config)
    68  	c.Check(err, gc.ErrorMatches, "nil Logger not valid")
    69  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    70  	c.Check(manager, gc.IsNil)
    71  }
    72  
    73  func (s *ValidationSuite) TestMissingSecretary(c *gc.C) {
    74  	s.config.Secretary = nil
    75  	manager, err := lease.NewManager(s.config)
    76  	c.Check(err, gc.ErrorMatches, "nil Secretary not valid")
    77  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    78  	c.Check(manager, gc.IsNil)
    79  }
    80  
    81  func (s *ValidationSuite) TestMissingPrometheusRegisterer(c *gc.C) {
    82  	s.config.PrometheusRegisterer = nil
    83  	err := s.config.Validate()
    84  	// Find to miss this out for now.
    85  	c.Assert(err, jc.ErrorIsNil)
    86  }
    87  
    88  func (s *ValidationSuite) TestMissingMaxSleep(c *gc.C) {
    89  	s.config.MaxSleep = 0
    90  	manager, err := lease.NewManager(s.config)
    91  	c.Check(err, gc.ErrorMatches, "non-positive MaxSleep not valid")
    92  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    93  	c.Check(manager, gc.IsNil)
    94  }
    95  
    96  func (s *ValidationSuite) TestNegativeMaxSleep(c *gc.C) {
    97  	s.config.MaxSleep = -time.Nanosecond
    98  	manager, err := lease.NewManager(s.config)
    99  	c.Check(err, gc.ErrorMatches, "non-positive MaxSleep not valid")
   100  	c.Check(err, jc.Satisfies, errors.IsNotValid)
   101  	c.Check(manager, gc.IsNil)
   102  }
   103  
   104  func (s *ValidationSuite) TestClaim_LeaseName(c *gc.C) {
   105  	fix := &Fixture{}
   106  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   107  		err := getClaimer(c, manager).Claim("INVALID", "bar/0", time.Minute)
   108  		c.Check(err, gc.ErrorMatches, `cannot claim lease "INVALID": name not valid`)
   109  		c.Check(err, jc.Satisfies, errors.IsNotValid)
   110  	})
   111  }
   112  
   113  func (s *ValidationSuite) TestClaim_HolderName(c *gc.C) {
   114  	fix := &Fixture{}
   115  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   116  		err := getClaimer(c, manager).Claim("foo", "INVALID", time.Minute)
   117  		c.Check(err, gc.ErrorMatches, `cannot claim lease for holder "INVALID": name not valid`)
   118  		c.Check(err, jc.Satisfies, errors.IsNotValid)
   119  	})
   120  }
   121  
   122  func (s *ValidationSuite) TestClaim_Duration(c *gc.C) {
   123  	fix := &Fixture{}
   124  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   125  		err := getClaimer(c, manager).Claim("foo", "bar/0", time.Second)
   126  		c.Check(err, gc.ErrorMatches, `cannot claim lease for 1s: time not valid`)
   127  		c.Check(err, jc.Satisfies, errors.IsNotValid)
   128  	})
   129  }
   130  
   131  func (s *ValidationSuite) TestToken_LeaseName(c *gc.C) {
   132  	fix := &Fixture{}
   133  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   134  		token := getChecker(c, manager).Token("INVALID", "bar/0")
   135  		err := token.Check(0, nil)
   136  		c.Check(err, gc.ErrorMatches, `cannot check lease "INVALID": name not valid`)
   137  		c.Check(err, jc.Satisfies, errors.IsNotValid)
   138  	})
   139  }
   140  
   141  func (s *ValidationSuite) TestToken_HolderName(c *gc.C) {
   142  	fix := &Fixture{}
   143  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   144  		token := getChecker(c, manager).Token("foo", "INVALID")
   145  		err := token.Check(0, nil)
   146  		c.Check(err, gc.ErrorMatches, `cannot check holder "INVALID": name not valid`)
   147  		c.Check(err, jc.Satisfies, errors.IsNotValid)
   148  	})
   149  }
   150  
   151  func (s *ValidationSuite) TestToken_OutPtr(c *gc.C) {
   152  	expectKey := "bad"
   153  	expectErr := errors.New("bad")
   154  
   155  	fix := &Fixture{
   156  		expectCalls: []call{{
   157  			method: "Refresh",
   158  			callback: func(leases map[corelease.Key]corelease.Info) {
   159  				leases[key("redis")] = corelease.Info{
   160  					Holder: "redis/0",
   161  					Expiry: offset(time.Second),
   162  					Trapdoor: func(attempt int, gotKey interface{}) error {
   163  						c.Check(attempt, gc.Equals, 27)
   164  						c.Check(gotKey, gc.Equals, &expectKey)
   165  						return expectErr
   166  					},
   167  				}
   168  			},
   169  		}},
   170  	}
   171  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   172  		token := getChecker(c, manager).Token("redis", "redis/0")
   173  		err := token.Check(27, &expectKey)
   174  		cause := errors.Cause(err)
   175  		c.Check(cause, gc.Equals, expectErr)
   176  	})
   177  }
   178  
   179  func (s *ValidationSuite) TestWaitUntilExpired_LeaseName(c *gc.C) {
   180  	fix := &Fixture{}
   181  	fix.RunTest(c, func(manager *lease.Manager, _ *testclock.Clock) {
   182  		err := getClaimer(c, manager).WaitUntilExpired("INVALID", nil)
   183  		c.Check(err, gc.ErrorMatches, `cannot wait for lease "INVALID" expiry: name not valid`)
   184  		c.Check(err, jc.Satisfies, errors.IsNotValid)
   185  	})
   186  }