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: &params.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: &params.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: &params.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: &params.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  }