github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/api/leadership/client_test.go (about) 1 package leadership 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/juju/names" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/params" 12 ) 13 14 /* 15 Test that the client is translating incoming parameters to the 16 service layer correctly, and also translates the results back 17 correctly. 18 */ 19 20 func Test(t *testing.T) { gc.TestingT(t) } 21 22 var _ = gc.Suite(&clientSuite{}) 23 24 type clientSuite struct{} 25 26 const ( 27 StubServiceNm = "stub-service" 28 StubUnitNm = "stub-unit/0" 29 ) 30 31 type stubFacade struct { 32 FacadeCallFn func(string, interface{}, interface{}) error 33 } 34 35 func (s *stubFacade) FacadeCall(request string, params, response interface{}) error { 36 if s.FacadeCallFn != nil { 37 return s.FacadeCallFn(request, params, response) 38 } 39 return nil 40 } 41 42 func (s *stubFacade) BestAPIVersion() int { return -1 } 43 func (s *stubFacade) Close() error { return nil } 44 45 func (s *clientSuite) TestClaimLeadershipTranslation(c *gc.C) { 46 47 const claimTime = 5 * time.Hour 48 numStubCalls := 0 49 50 stub := &stubFacade{ 51 FacadeCallFn: func(name string, parameters, response interface{}) error { 52 numStubCalls++ 53 c.Check(name, gc.Equals, "ClaimLeadership") 54 c.Assert(parameters, gc.Not(gc.IsNil)) 55 56 typedP, ok := parameters.(params.ClaimLeadershipBulkParams) 57 c.Assert(ok, gc.Equals, true) 58 59 typedR, ok := response.(*params.ClaimLeadershipBulkResults) 60 c.Assert(ok, gc.Equals, true) 61 typedR.Results = []params.ClaimLeadershipResults{{ 62 ClaimDurationInSec: claimTime.Seconds(), 63 }} 64 65 c.Assert(typedP.Params, gc.HasLen, 1) 66 c.Check(typedP.Params[0].ServiceTag, gc.Equals, names.NewServiceTag(StubServiceNm).String()) 67 c.Check(typedP.Params[0].UnitTag, gc.Equals, names.NewUnitTag(StubUnitNm).String()) 68 69 return nil 70 }, 71 } 72 73 client := NewClient(stub, stub) 74 claimInterval, err := client.ClaimLeadership(StubServiceNm, StubUnitNm) 75 76 c.Assert(err, gc.IsNil) 77 c.Check(numStubCalls, gc.Equals, 1) 78 c.Check(claimInterval, gc.Equals, claimTime) 79 } 80 81 func (s *clientSuite) TestClaimLeadershipErrorTranslation(c *gc.C) { 82 83 // First check translating errors embedded in the result. 84 errMsg := "I'm trying!" 85 numStubCalls := 0 86 stub := &stubFacade{ 87 FacadeCallFn: func(name string, parameters, response interface{}) error { 88 numStubCalls++ 89 typedR, ok := response.(*params.ClaimLeadershipBulkResults) 90 c.Assert(ok, gc.Equals, true) 91 typedR.Results = []params.ClaimLeadershipResults{{ 92 Error: ¶ms.Error{Message: errMsg}, 93 }} 94 return nil 95 }, 96 } 97 98 client := NewClient(stub, stub) 99 _, err := client.ClaimLeadership(StubServiceNm, StubUnitNm) 100 c.Check(numStubCalls, gc.Equals, 1) 101 c.Check(err, gc.ErrorMatches, errMsg) 102 103 // Now check errors returned from the function itself. 104 errMsg = "well, I just give up." 105 numStubCalls = 0 106 stub.FacadeCallFn = func(name string, parameters, response interface{}) error { 107 numStubCalls++ 108 return fmt.Errorf(errMsg) 109 } 110 111 _, err = client.ClaimLeadership(StubServiceNm, StubUnitNm) 112 c.Check(numStubCalls, gc.Equals, 1) 113 c.Check(err, gc.ErrorMatches, "error making a leadership claim: "+errMsg) 114 } 115 116 func (s *clientSuite) TestReleaseLeadershipTranslation(c *gc.C) { 117 118 numStubCalls := 0 119 stub := &stubFacade{ 120 FacadeCallFn: func(name string, parameters, response interface{}) error { 121 numStubCalls++ 122 c.Check(name, gc.Equals, "ReleaseLeadership") 123 c.Assert(parameters, gc.Not(gc.IsNil)) 124 125 typedP, ok := parameters.(params.ReleaseLeadershipBulkParams) 126 c.Assert(ok, gc.Equals, true) 127 128 typedR, ok := response.(*params.ReleaseLeadershipBulkResults) 129 c.Assert(ok, gc.Equals, true) 130 typedR.Results = []params.ErrorResult{{}} 131 132 c.Assert(typedP.Params, gc.HasLen, 1) 133 c.Check(typedP.Params[0].ServiceTag, gc.Equals, names.NewServiceTag(StubServiceNm).String()) 134 c.Check(typedP.Params[0].UnitTag, gc.Equals, names.NewUnitTag(StubUnitNm).String()) 135 136 return nil 137 }, 138 } 139 140 client := NewClient(stub, stub) 141 err := client.ReleaseLeadership(StubServiceNm, StubUnitNm) 142 143 c.Check(numStubCalls, gc.Equals, 1) 144 c.Assert(err, gc.IsNil) 145 } 146 147 func (s *clientSuite) TestBlockUntilLeadershipReleasedTranslation(c *gc.C) { 148 149 numStubCalls := 0 150 stub := &stubFacade{ 151 FacadeCallFn: func(name string, parameters, response interface{}) error { 152 numStubCalls++ 153 c.Check(name, gc.Equals, "BlockUntilLeadershipReleased") 154 c.Assert(parameters, gc.Not(gc.IsNil)) 155 156 typedP, ok := parameters.(names.ServiceTag) 157 c.Assert(ok, gc.Equals, true) 158 c.Check(typedP.Id(), gc.Equals, StubServiceNm) 159 160 _, ok = response.(*params.ErrorResult) 161 c.Assert(ok, gc.Equals, true) 162 163 return nil 164 }, 165 } 166 167 client := NewClient(stub, stub) 168 err := client.BlockUntilLeadershipReleased(StubServiceNm) 169 170 c.Check(numStubCalls, gc.Equals, 1) 171 c.Assert(err, gc.IsNil) 172 }