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