github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/core/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) TestBlockUntilLeadershipReleasedTranslation(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, "BlockUntilLeadershipReleased") 144 c.Check(arg, jc.DeepEquals, names.NewServiceTag(StubServiceNm)) 145 switch result := result.(type) { 146 case *params.ErrorResult: 147 default: 148 c.Fatalf("bad result type: %T", result) 149 } 150 return nil 151 }) 152 153 client := leadership.NewClient(apiCaller) 154 err := client.BlockUntilLeadershipReleased(StubServiceNm) 155 156 c.Check(numStubCalls, gc.Equals, 1) 157 c.Check(err, jc.ErrorIsNil) 158 } 159 160 func (s *ClientSuite) TestBlockUntilLeadershipReleasedError(c *gc.C) { 161 162 numStubCalls := 0 163 apiCaller := s.apiCaller(c, func(_ string, _, result interface{}) error { 164 numStubCalls++ 165 switch result := result.(type) { 166 case *params.ErrorResult: 167 *result = params.ErrorResult{Error: ¶ms.Error{Message: "splat"}} 168 default: 169 c.Fatalf("bad result type: %T", result) 170 } 171 return nil 172 }) 173 174 client := leadership.NewClient(apiCaller) 175 err := client.BlockUntilLeadershipReleased(StubServiceNm) 176 177 c.Check(numStubCalls, gc.Equals, 1) 178 c.Check(err, gc.ErrorMatches, "error blocking on leadership release: splat") 179 } 180 181 func (s *ClientSuite) TestBlockUntilLeadershipReleasedFacadeCallError(c *gc.C) { 182 errMsg := "well, I just give up." 183 numStubCalls := 0 184 apiCaller := s.apiCaller(c, func(_ string, _, _ interface{}) error { 185 numStubCalls++ 186 return errors.Errorf(errMsg) 187 }) 188 189 client := leadership.NewClient(apiCaller) 190 err := client.BlockUntilLeadershipReleased(StubServiceNm) 191 c.Check(numStubCalls, gc.Equals, 1) 192 c.Check(err, gc.ErrorMatches, "error blocking on leadership release: "+errMsg) 193 }