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 }