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