github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/addresser/addresser_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package addresser_test
     5  
     6  import (
     7  	"errors"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/api/addresser"
    13  	"github.com/juju/juju/api/base"
    14  	apitesting "github.com/juju/juju/api/base/testing"
    15  	"github.com/juju/juju/apiserver/params"
    16  	apiservertesting "github.com/juju/juju/apiserver/testing"
    17  	coretesting "github.com/juju/juju/testing"
    18  	"github.com/juju/juju/watcher"
    19  )
    20  
    21  type AddresserSuite struct {
    22  	coretesting.BaseSuite
    23  }
    24  
    25  var _ = gc.Suite(&AddresserSuite{})
    26  
    27  func (s *AddresserSuite) TestNewAPI(c *gc.C) {
    28  	var called int
    29  	apiCaller := clientErrorAPICaller(c, "CleanupIPAddresses", nil, &called)
    30  	api := addresser.NewAPI(apiCaller)
    31  	c.Check(api, gc.NotNil)
    32  	c.Check(called, gc.Equals, 0)
    33  
    34  	// Make a call so that an error will be returned.
    35  	err := api.CleanupIPAddresses()
    36  	c.Assert(err, gc.ErrorMatches, "client error!")
    37  	c.Assert(called, gc.Equals, 1)
    38  }
    39  
    40  func (s *AddresserSuite) TestNewAPIWithNilCaller(c *gc.C) {
    41  	panicFunc := func() { addresser.NewAPI(nil) }
    42  	c.Assert(panicFunc, gc.PanicMatches, "caller is nil")
    43  }
    44  
    45  func (s *AddresserSuite) TestCanDeallocateAddressesSuccess(c *gc.C) {
    46  	var called int
    47  	expectedResult := params.BoolResult{
    48  		Result: true,
    49  	}
    50  	apiCaller := successAPICaller(c, "CanDeallocateAddresses", nil, expectedResult, &called)
    51  	api := addresser.NewAPI(apiCaller)
    52  
    53  	ok, err := api.CanDeallocateAddresses()
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	c.Assert(ok, jc.IsTrue)
    56  	c.Assert(called, gc.Equals, 1)
    57  }
    58  
    59  func (s *AddresserSuite) TestCanDeallocateAddressesServerError(c *gc.C) {
    60  	var called int
    61  	expectedResult := params.BoolResult{
    62  		Error: apiservertesting.ServerError("server boom!"),
    63  	}
    64  	apiCaller := successAPICaller(c, "CanDeallocateAddresses", nil, expectedResult, &called)
    65  	api := addresser.NewAPI(apiCaller)
    66  
    67  	ok, err := api.CanDeallocateAddresses()
    68  	c.Assert(err, gc.ErrorMatches, "server boom!")
    69  	c.Assert(ok, jc.IsFalse)
    70  	c.Assert(called, gc.Equals, 1)
    71  }
    72  
    73  func (s *AddresserSuite) TestCleanupIPAddressesSuccess(c *gc.C) {
    74  	var called int
    75  	expectedResult := params.ErrorResult{}
    76  	apiCaller := successAPICaller(c, "CleanupIPAddresses", nil, expectedResult, &called)
    77  	api := addresser.NewAPI(apiCaller)
    78  
    79  	err := api.CleanupIPAddresses()
    80  	c.Assert(err, jc.ErrorIsNil)
    81  	c.Assert(called, gc.Equals, 1)
    82  }
    83  
    84  func (s *AddresserSuite) TestCleanupIPAddressesServerError(c *gc.C) {
    85  	var called int
    86  	expectedResult := params.ErrorResult{
    87  		Error: apiservertesting.ServerError("server boom!"),
    88  	}
    89  	apiCaller := successAPICaller(c, "CleanupIPAddresses", nil, expectedResult, &called)
    90  	api := addresser.NewAPI(apiCaller)
    91  
    92  	err := api.CleanupIPAddresses()
    93  	c.Assert(err, gc.ErrorMatches, "server boom!")
    94  	c.Assert(called, gc.Equals, 1)
    95  }
    96  
    97  func (s *AddresserSuite) TestWatchIPAddressesSuccess(c *gc.C) {
    98  	var numFacadeCalls int
    99  	var numWatcherCalls int
   100  	expectedResult := params.EntitiesWatchResult{
   101  		EntitiesWatcherId: "42",
   102  		Changes: []string{
   103  			"ipaddress-11111111-0000-0000-0000-000000000000",
   104  			"ipaddress-22222222-0000-0000-0000-000000000000",
   105  		},
   106  	}
   107  	watcherFunc := func(caller base.APICaller, result params.EntitiesWatchResult) watcher.EntitiesWatcher {
   108  		numWatcherCalls++
   109  		c.Check(caller, gc.NotNil)
   110  		c.Check(result, jc.DeepEquals, expectedResult)
   111  		return nil
   112  	}
   113  	s.PatchValue(addresser.NewEntitiesWatcher, watcherFunc)
   114  
   115  	apiCaller := successAPICaller(c, "WatchIPAddresses", nil, expectedResult, &numFacadeCalls)
   116  	api := addresser.NewAPI(apiCaller)
   117  
   118  	w, err := api.WatchIPAddresses()
   119  	c.Assert(err, jc.ErrorIsNil)
   120  	c.Assert(numFacadeCalls, gc.Equals, 1)
   121  	c.Assert(numWatcherCalls, gc.Equals, 1)
   122  	c.Assert(w, gc.IsNil)
   123  }
   124  
   125  func (s *AddresserSuite) TestWatchIPAddressesClientError(c *gc.C) {
   126  	var called int
   127  	apiCaller := clientErrorAPICaller(c, "WatchIPAddresses", nil, &called)
   128  
   129  	api := addresser.NewAPI(apiCaller)
   130  	w, err := api.WatchIPAddresses()
   131  
   132  	c.Assert(w, jc.ErrorIsNil)
   133  	c.Assert(err, gc.ErrorMatches, "client error!")
   134  	c.Assert(called, gc.Equals, 1)
   135  }
   136  
   137  func (s *AddresserSuite) TestWatchIPAddressesServerError(c *gc.C) {
   138  	var called int
   139  	expectedResult := params.EntitiesWatchResult{
   140  		Error: apiservertesting.ServerError("server boom!"),
   141  	}
   142  	apiCaller := successAPICaller(c, "WatchIPAddresses", nil, expectedResult, &called)
   143  	api := addresser.NewAPI(apiCaller)
   144  
   145  	w, err := api.WatchIPAddresses()
   146  	c.Assert(w, jc.ErrorIsNil)
   147  	c.Assert(err, gc.ErrorMatches, "server boom!")
   148  	c.Assert(called, gc.Equals, 1)
   149  }
   150  
   151  func successAPICaller(c *gc.C, method string, expectArgs, useResults interface{}, numCalls *int) base.APICaller {
   152  	args := &apitesting.CheckArgs{
   153  		Facade:        "Addresser",
   154  		VersionIsZero: true,
   155  		IdIsEmpty:     true,
   156  		Method:        method,
   157  		Args:          expectArgs,
   158  		Results:       useResults,
   159  	}
   160  	return apitesting.CheckingAPICaller(c, args, numCalls, nil)
   161  }
   162  
   163  func clientErrorAPICaller(c *gc.C, method string, expectArgs interface{}, numCalls *int) base.APICaller {
   164  	args := &apitesting.CheckArgs{
   165  		Facade:        "Addresser",
   166  		VersionIsZero: true,
   167  		IdIsEmpty:     true,
   168  		Method:        method,
   169  		Args:          expectArgs,
   170  	}
   171  	return apitesting.CheckingAPICaller(c, args, numCalls, errors.New("client error!"))
   172  }