github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/instancepoller/instancepoller_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package instancepoller_test
     5  
     6  import (
     7  	"errors"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  	"gopkg.in/juju/names.v2"
    12  
    13  	"github.com/juju/juju/api/base"
    14  	apitesting "github.com/juju/juju/api/base/testing"
    15  	"github.com/juju/juju/api/instancepoller"
    16  	"github.com/juju/juju/apiserver/params"
    17  	apiservertesting "github.com/juju/juju/apiserver/testing"
    18  	coretesting "github.com/juju/juju/testing"
    19  	"github.com/juju/juju/watcher"
    20  )
    21  
    22  type InstancePollerSuite struct {
    23  	coretesting.BaseSuite
    24  }
    25  
    26  var _ = gc.Suite(&InstancePollerSuite{})
    27  
    28  func (s *InstancePollerSuite) TestNewAPI(c *gc.C) {
    29  	var called int
    30  	apiCaller := clientErrorAPICaller(c, "Life", nil, &called)
    31  	api := instancepoller.NewAPI(apiCaller)
    32  	c.Check(api, gc.NotNil)
    33  	c.Check(called, gc.Equals, 0)
    34  
    35  	// Nothing happens until we actually call something else.
    36  	m, err := api.Machine(names.MachineTag{})
    37  	c.Assert(err, gc.ErrorMatches, "client error!")
    38  	c.Assert(m, gc.IsNil)
    39  	c.Assert(called, gc.Equals, 1)
    40  }
    41  
    42  func (s *InstancePollerSuite) TestNewAPIWithNilCaller(c *gc.C) {
    43  	panicFunc := func() { instancepoller.NewAPI(nil) }
    44  	c.Assert(panicFunc, gc.PanicMatches, "caller is nil")
    45  }
    46  
    47  func (s *InstancePollerSuite) TestMachineCallsLife(c *gc.C) {
    48  	// We have tested separately the Life method, here we just check
    49  	// it's called internally.
    50  	var called int
    51  	expectedResults := params.LifeResults{
    52  		Results: []params.LifeResult{{Life: "working"}},
    53  	}
    54  	apiCaller := successAPICaller(c, "Life", entitiesArgs, expectedResults, &called)
    55  	api := instancepoller.NewAPI(apiCaller)
    56  	m, err := api.Machine(names.NewMachineTag("42"))
    57  	c.Assert(err, jc.ErrorIsNil)
    58  	c.Assert(called, gc.Equals, 1)
    59  	c.Assert(m.Life(), gc.Equals, params.Life("working"))
    60  	c.Assert(m.Id(), gc.Equals, "42")
    61  }
    62  
    63  func (s *InstancePollerSuite) TestWatchModelMachinesSuccess(c *gc.C) {
    64  	// We're not testing the watcher logic here as it's already tested elsewhere.
    65  	var numFacadeCalls int
    66  	var numWatcherCalls int
    67  	expectResult := params.StringsWatchResult{
    68  		StringsWatcherId: "42",
    69  		Changes:          []string{"foo", "bar"},
    70  	}
    71  	watcherFunc := func(caller base.APICaller, result params.StringsWatchResult) watcher.StringsWatcher {
    72  		numWatcherCalls++
    73  		c.Check(caller, gc.NotNil)
    74  		c.Check(result, jc.DeepEquals, expectResult)
    75  		return nil
    76  	}
    77  	s.PatchValue(instancepoller.NewStringsWatcher, watcherFunc)
    78  
    79  	apiCaller := successAPICaller(c, "WatchModelMachines", nil, expectResult, &numFacadeCalls)
    80  
    81  	api := instancepoller.NewAPI(apiCaller)
    82  	w, err := api.WatchModelMachines()
    83  	c.Assert(err, jc.ErrorIsNil)
    84  	c.Assert(numFacadeCalls, gc.Equals, 1)
    85  	c.Assert(numWatcherCalls, gc.Equals, 1)
    86  	c.Assert(w, gc.IsNil)
    87  }
    88  
    89  func (s *InstancePollerSuite) TestWatchModelMachinesClientError(c *gc.C) {
    90  	var called int
    91  	apiCaller := clientErrorAPICaller(c, "WatchModelMachines", nil, &called)
    92  	api := instancepoller.NewAPI(apiCaller)
    93  	w, err := api.WatchModelMachines()
    94  	c.Assert(err, gc.ErrorMatches, "client error!")
    95  	c.Assert(w, gc.IsNil)
    96  	c.Assert(called, gc.Equals, 1)
    97  }
    98  
    99  func (s *InstancePollerSuite) TestWatchModelMachinesServerError(c *gc.C) {
   100  	var called int
   101  	expectedResults := params.StringsWatchResult{
   102  		Error: apiservertesting.ServerError("server boom!"),
   103  	}
   104  	apiCaller := successAPICaller(c, "WatchModelMachines", nil, expectedResults, &called)
   105  
   106  	api := instancepoller.NewAPI(apiCaller)
   107  	w, err := api.WatchModelMachines()
   108  	c.Assert(err, gc.ErrorMatches, "server boom!")
   109  	c.Assert(called, gc.Equals, 1)
   110  	c.Assert(w, gc.IsNil)
   111  }
   112  
   113  func (s *InstancePollerSuite) TestWatchForModelConfigChangesClientError(c *gc.C) {
   114  	// We're not testing the success case as we're not patching the
   115  	// NewNotifyWatcher call the embedded ModelWatcher is calling.
   116  	var called int
   117  	apiCaller := clientErrorAPICaller(c, "WatchForModelConfigChanges", nil, &called)
   118  
   119  	api := instancepoller.NewAPI(apiCaller)
   120  	w, err := api.WatchForModelConfigChanges()
   121  	c.Assert(err, gc.ErrorMatches, "client error!")
   122  	c.Assert(called, gc.Equals, 1)
   123  	c.Assert(w, gc.IsNil)
   124  }
   125  
   126  func (s *InstancePollerSuite) TestModelConfigSuccess(c *gc.C) {
   127  	var called int
   128  	expectedConfig := coretesting.ModelConfig(c)
   129  	expectedResults := params.ModelConfigResult{
   130  		Config: params.ModelConfig(expectedConfig.AllAttrs()),
   131  	}
   132  	apiCaller := successAPICaller(c, "ModelConfig", nil, expectedResults, &called)
   133  
   134  	api := instancepoller.NewAPI(apiCaller)
   135  	cfg, err := api.ModelConfig()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	c.Assert(called, gc.Equals, 1)
   138  	c.Assert(cfg, jc.DeepEquals, expectedConfig)
   139  }
   140  
   141  func (s *InstancePollerSuite) TestModelConfigClientError(c *gc.C) {
   142  	var called int
   143  	apiCaller := clientErrorAPICaller(c, "ModelConfig", nil, &called)
   144  	api := instancepoller.NewAPI(apiCaller)
   145  	cfg, err := api.ModelConfig()
   146  	c.Assert(err, gc.ErrorMatches, "client error!")
   147  	c.Assert(cfg, gc.IsNil)
   148  	c.Assert(called, gc.Equals, 1)
   149  }
   150  
   151  func (s *InstancePollerSuite) TestModelConfigServerError(c *gc.C) {
   152  	var called int
   153  	expectResults := params.ModelConfigResult{
   154  		Config: params.ModelConfig{"type": "foo"},
   155  	}
   156  	apiCaller := successAPICaller(c, "ModelConfig", nil, expectResults, &called)
   157  
   158  	api := instancepoller.NewAPI(apiCaller)
   159  	cfg, err := api.ModelConfig()
   160  	c.Assert(err, gc.NotNil) // the actual error doesn't matter
   161  	c.Assert(called, gc.Equals, 1)
   162  	c.Assert(cfg, gc.IsNil)
   163  }
   164  
   165  func clientErrorAPICaller(c *gc.C, method string, expectArgs interface{}, numCalls *int) base.APICaller {
   166  	args := &apitesting.CheckArgs{
   167  		Facade:        "InstancePoller",
   168  		VersionIsZero: true,
   169  		IdIsEmpty:     true,
   170  		Method:        method,
   171  		Args:          expectArgs,
   172  	}
   173  	return apitesting.CheckingAPICaller(c, args, numCalls, errors.New("client error!"))
   174  }
   175  
   176  func successAPICaller(c *gc.C, method string, expectArgs, useResults interface{}, numCalls *int) base.APICaller {
   177  	args := &apitesting.CheckArgs{
   178  		Facade:        "InstancePoller",
   179  		VersionIsZero: true,
   180  		IdIsEmpty:     true,
   181  		Method:        method,
   182  		Args:          expectArgs,
   183  		Results:       useResults,
   184  	}
   185  	return apitesting.CheckingAPICaller(c, args, numCalls, nil)
   186  }