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

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package lease_test
     5  
     6  import (
     7  	"reflect"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/worker/lease"
    13  )
    14  
    15  type deadManagerSuite struct{}
    16  
    17  var _ = gc.Suite(&deadManagerSuite{})
    18  
    19  type deadManagerError struct{}
    20  
    21  const DeadManagerErrorMessage = "DeadManagerError"
    22  
    23  func (*deadManagerError) Error() string {
    24  	return DeadManagerErrorMessage
    25  }
    26  
    27  func (s *deadManagerSuite) TestWait(c *gc.C) {
    28  	deadManagerErr := deadManagerError{}
    29  	deadManager := lease.NewDeadManager(&deadManagerErr)
    30  	c.Assert(deadManager.Wait(), gc.ErrorMatches, DeadManagerErrorMessage)
    31  }
    32  
    33  // This creates a new DeadManager, gets a Claimer, and calls all of
    34  // its exported methods with zero values. All methods should return
    35  // the error indicating that the manager is stopped.
    36  func (s *deadManagerSuite) TestClaimer(c *gc.C) {
    37  	deadManagerErr := deadManagerError{}
    38  	deadManager := lease.NewDeadManager(&deadManagerErr)
    39  
    40  	claimer, err := deadManager.Claimer("namespace", "model")
    41  	c.Assert(err, jc.ErrorIsNil)
    42  	checkMethods(c, claimer)
    43  }
    44  
    45  // And the same for Checker.
    46  func (s *deadManagerSuite) TestChecker(c *gc.C) {
    47  	deadManagerErr := deadManagerError{}
    48  	deadManager := lease.NewDeadManager(&deadManagerErr)
    49  
    50  	checker, err := deadManager.Checker("namespace", "model")
    51  	c.Assert(err, jc.ErrorIsNil)
    52  	checkMethods(c, checker)
    53  }
    54  
    55  // And Pinner.
    56  func (s *deadManagerSuite) TestPinner(c *gc.C) {
    57  	deadManagerErr := deadManagerError{}
    58  	deadManager := lease.NewDeadManager(&deadManagerErr)
    59  
    60  	checker, err := deadManager.Pinner("namespace", "model")
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	checkMethods(c, checker)
    63  }
    64  
    65  func checkMethods(c *gc.C, manager interface{}) {
    66  	managerType := reflect.TypeOf(manager)
    67  	managerValue := reflect.ValueOf(manager)
    68  	errorIface := reflect.TypeOf((*error)(nil)).Elem()
    69  
    70  	for i := 0; i < managerType.NumMethod(); i++ {
    71  		method := managerType.Method(i)
    72  		methodV := managerValue.MethodByName(method.Name)
    73  
    74  		var args []reflect.Value
    75  		for n := 0; n < methodV.Type().NumIn(); n++ {
    76  			argType := methodV.Type().In(n)
    77  			args = append(args, reflect.Zero(argType))
    78  		}
    79  
    80  		for j := 0; j < method.Type.NumOut(); j++ {
    81  			if returnType := method.Type.Out(j); returnType.Implements(errorIface) {
    82  				errorValue := methodV.Call(args)[j]
    83  				c.Logf(method.Name)
    84  				c.Check(errorValue.Interface(), gc.ErrorMatches, "lease manager stopped")
    85  
    86  			}
    87  		}
    88  	}
    89  }