github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/api/leadership/client_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/names" 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/api/base" 16 apitesting "github.com/juju/juju/api/base/testing" 17 "github.com/juju/juju/api/leadership" 18 "github.com/juju/juju/apiserver/params" 19 coreleadership "github.com/juju/juju/leadership" 20 ) 21 22 /* 23 Test that the client is translating incoming parameters to the 24 service layer correctly, and also translates the results back 25 correctly. 26 */ 27 28 type ClientSuite struct { 29 testing.IsolationSuite 30 } 31 32 var _ = gc.Suite(&ClientSuite{}) 33 34 const ( 35 StubServiceNm = "stub-service" 36 StubUnitNm = "stub-unit/0" 37 ) 38 39 func (s *ClientSuite) apiCaller(c *gc.C, check func(request string, arg, result interface{}) error) base.APICaller { 40 return apitesting.APICallerFunc(func(facade string, version int, id, request string, arg, result interface{}) error { 41 c.Check(facade, gc.Equals, "LeadershipService") 42 c.Check(version, gc.Equals, 0) 43 c.Check(id, gc.Equals, "") 44 return check(request, arg, result) 45 }) 46 } 47 48 func (s *ClientSuite) TestClaimLeadershipTranslation(c *gc.C) { 49 50 const claimTime = 5 * time.Hour 51 numStubCalls := 0 52 53 apiCaller := s.apiCaller(c, func(request string, arg, result interface{}) error { 54 numStubCalls++ 55 c.Check(request, gc.Equals, "ClaimLeadership") 56 c.Check(arg, jc.DeepEquals, params.ClaimLeadershipBulkParams{ 57 Params: []params.ClaimLeadershipParams{{ 58 ServiceTag: "service-stub-service", 59 UnitTag: "unit-stub-unit-0", 60 DurationSeconds: claimTime.Seconds(), 61 }}, 62 }) 63 switch result := result.(type) { 64 case *params.ClaimLeadershipBulkResults: 65 result.Results = []params.ErrorResult{{}} 66 default: 67 c.Fatalf("bad result type: %T", result) 68 } 69 return nil 70 }) 71 72 client := leadership.NewClient(apiCaller) 73 err := client.ClaimLeadership(StubServiceNm, StubUnitNm, claimTime) 74 c.Check(err, jc.ErrorIsNil) 75 c.Check(numStubCalls, gc.Equals, 1) 76 } 77 78 func (s *ClientSuite) TestClaimLeadershipDeniedError(c *gc.C) { 79 80 numStubCalls := 0 81 apiCaller := s.apiCaller(c, func(_ string, _, result interface{}) error { 82 numStubCalls++ 83 switch result := result.(type) { 84 case *params.ClaimLeadershipBulkResults: 85 result.Results = []params.ErrorResult{{Error: ¶ms.Error{ 86 Message: "blah", 87 Code: params.CodeLeadershipClaimDenied, 88 }}} 89 default: 90 c.Fatalf("bad result type: %T", result) 91 } 92 return nil 93 }) 94 95 client := leadership.NewClient(apiCaller) 96 err := client.ClaimLeadership(StubServiceNm, StubUnitNm, 0) 97 c.Check(numStubCalls, gc.Equals, 1) 98 c.Check(err, gc.Equals, coreleadership.ErrClaimDenied) 99 } 100 101 func (s *ClientSuite) TestClaimLeadershipUnknownError(c *gc.C) { 102 103 errMsg := "I'm trying!" 104 numStubCalls := 0 105 apiCaller := s.apiCaller(c, func(_ string, _, result interface{}) error { 106 numStubCalls++ 107 switch result := result.(type) { 108 case *params.ClaimLeadershipBulkResults: 109 result.Results = []params.ErrorResult{{Error: ¶ms.Error{ 110 Message: errMsg, 111 }}} 112 default: 113 c.Fatalf("bad result type: %T", result) 114 } 115 return nil 116 }) 117 118 client := leadership.NewClient(apiCaller) 119 err := client.ClaimLeadership(StubServiceNm, StubUnitNm, 0) 120 c.Check(numStubCalls, gc.Equals, 1) 121 c.Check(err, gc.ErrorMatches, errMsg) 122 } 123 124 func (s *ClientSuite) TestClaimLeadershipFacadeCallError(c *gc.C) { 125 errMsg := "well, I just give up." 126 numStubCalls := 0 127 apiCaller := s.apiCaller(c, func(_ string, _, _ interface{}) error { 128 numStubCalls++ 129 return errors.Errorf(errMsg) 130 }) 131 132 client := leadership.NewClient(apiCaller) 133 err := client.ClaimLeadership(StubServiceNm, StubUnitNm, 0) 134 c.Check(numStubCalls, gc.Equals, 1) 135 c.Check(err, gc.ErrorMatches, "error making a leadership claim: "+errMsg) 136 } 137 138 func (s *ClientSuite) TestReleaseLeadershipTranslation(c *gc.C) { 139 140 numStubCalls := 0 141 apiCaller := s.apiCaller(c, func(request string, arg, result interface{}) error { 142 numStubCalls++ 143 c.Check(request, gc.Equals, "ReleaseLeadership") 144 c.Check(arg, jc.DeepEquals, params.ReleaseLeadershipBulkParams{ 145 Params: []params.ReleaseLeadershipParams{{ 146 ServiceTag: "service-stub-service", 147 UnitTag: "unit-stub-unit-0", 148 }}, 149 }) 150 switch result := result.(type) { 151 case *params.ReleaseLeadershipBulkResults: 152 result.Results = []params.ErrorResult{{}} 153 default: 154 c.Fatalf("bad result type: %T", result) 155 } 156 return nil 157 }) 158 159 client := leadership.NewClient(apiCaller) 160 err := client.ReleaseLeadership(StubServiceNm, StubUnitNm) 161 c.Check(numStubCalls, gc.Equals, 1) 162 c.Check(err, jc.ErrorIsNil) 163 } 164 165 func (s *ClientSuite) TestReleaseLeadershipUnknownError(c *gc.C) { 166 167 errMsg := "I'm trying!" 168 numStubCalls := 0 169 apiCaller := s.apiCaller(c, func(_ string, _, result interface{}) error { 170 numStubCalls++ 171 switch result := result.(type) { 172 case *params.ReleaseLeadershipBulkResults: 173 result.Results = []params.ErrorResult{{Error: ¶ms.Error{ 174 Message: errMsg, 175 }}} 176 default: 177 c.Fatalf("bad result type: %T", result) 178 } 179 return nil 180 }) 181 182 client := leadership.NewClient(apiCaller) 183 err := client.ReleaseLeadership(StubServiceNm, StubUnitNm) 184 c.Check(numStubCalls, gc.Equals, 1) 185 c.Check(err, gc.ErrorMatches, errMsg) 186 } 187 188 func (s *ClientSuite) TestReleaseLeadershipFacadeCallError(c *gc.C) { 189 errMsg := "well, I just give up." 190 numStubCalls := 0 191 apiCaller := s.apiCaller(c, func(_ string, _, _ interface{}) error { 192 numStubCalls++ 193 return errors.Errorf(errMsg) 194 }) 195 196 client := leadership.NewClient(apiCaller) 197 err := client.ReleaseLeadership(StubServiceNm, StubUnitNm) 198 c.Check(numStubCalls, gc.Equals, 1) 199 c.Check(err, gc.ErrorMatches, "cannot release leadership: "+errMsg) 200 } 201 202 func (s *ClientSuite) TestBlockUntilLeadershipReleasedTranslation(c *gc.C) { 203 204 numStubCalls := 0 205 apiCaller := s.apiCaller(c, func(request string, arg, result interface{}) error { 206 numStubCalls++ 207 c.Check(request, gc.Equals, "BlockUntilLeadershipReleased") 208 c.Check(arg, jc.DeepEquals, names.NewServiceTag(StubServiceNm)) 209 switch result := result.(type) { 210 case *params.ErrorResult: 211 default: 212 c.Fatalf("bad result type: %T", result) 213 } 214 return nil 215 }) 216 217 client := leadership.NewClient(apiCaller) 218 err := client.BlockUntilLeadershipReleased(StubServiceNm) 219 220 c.Check(numStubCalls, gc.Equals, 1) 221 c.Check(err, jc.ErrorIsNil) 222 } 223 224 func (s *ClientSuite) TestBlockUntilLeadershipReleasedError(c *gc.C) { 225 226 numStubCalls := 0 227 apiCaller := s.apiCaller(c, func(_ string, _, result interface{}) error { 228 numStubCalls++ 229 switch result := result.(type) { 230 case *params.ErrorResult: 231 *result = params.ErrorResult{Error: ¶ms.Error{Message: "splat"}} 232 default: 233 c.Fatalf("bad result type: %T", result) 234 } 235 return nil 236 }) 237 238 client := leadership.NewClient(apiCaller) 239 err := client.BlockUntilLeadershipReleased(StubServiceNm) 240 241 c.Check(numStubCalls, gc.Equals, 1) 242 c.Check(err, gc.ErrorMatches, "error blocking on leadership release: splat") 243 } 244 245 func (s *ClientSuite) TestBlockUntilLeadershipReleasedFacadeCallError(c *gc.C) { 246 errMsg := "well, I just give up." 247 numStubCalls := 0 248 apiCaller := s.apiCaller(c, func(_ string, _, _ interface{}) error { 249 numStubCalls++ 250 return errors.Errorf(errMsg) 251 }) 252 253 client := leadership.NewClient(apiCaller) 254 err := client.BlockUntilLeadershipReleased(StubServiceNm) 255 c.Check(numStubCalls, gc.Equals, 1) 256 c.Check(err, gc.ErrorMatches, "error blocking on leadership release: "+errMsg) 257 }