github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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  	"github.com/juju/juju/core/watcher"
    19  	coretesting "github.com/juju/juju/testing"
    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  	apiCaller := clientErrorAPICaller(c, "Life", nil)
    30  	api := instancepoller.NewAPI(apiCaller)
    31  	c.Check(api, gc.NotNil)
    32  	c.Check(apiCaller.CallCount, gc.Equals, 0)
    33  
    34  	// Nothing happens until we actually call something else.
    35  	m, err := api.Machine(names.MachineTag{})
    36  	c.Assert(err, gc.ErrorMatches, "client error!")
    37  	c.Assert(m, gc.IsNil)
    38  	c.Check(apiCaller.CallCount, gc.Equals, 1)
    39  }
    40  
    41  func (s *InstancePollerSuite) TestNewAPIWithNilCaller(c *gc.C) {
    42  	panicFunc := func() { instancepoller.NewAPI(nil) }
    43  	c.Assert(panicFunc, gc.PanicMatches, "caller is nil")
    44  }
    45  
    46  func (s *InstancePollerSuite) TestMachineCallsLife(c *gc.C) {
    47  	// We have tested separately the Life method, here we just check
    48  	// it's called internally.
    49  	expectedResults := params.LifeResults{
    50  		Results: []params.LifeResult{{Life: "working"}},
    51  	}
    52  	apiCaller := successAPICaller(c, "Life", entitiesArgs, expectedResults)
    53  	api := instancepoller.NewAPI(apiCaller)
    54  	m, err := api.Machine(names.NewMachineTag("42"))
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
    57  	c.Assert(m.Life(), gc.Equals, params.Life("working"))
    58  	c.Assert(m.Id(), gc.Equals, "42")
    59  }
    60  
    61  func (s *InstancePollerSuite) TestWatchModelMachinesSuccess(c *gc.C) {
    62  	// We're not testing the watcher logic here as it's already tested elsewhere.
    63  	var numWatcherCalls int
    64  	expectResult := params.StringsWatchResult{
    65  		StringsWatcherId: "42",
    66  		Changes:          []string{"foo", "bar"},
    67  	}
    68  	watcherFunc := func(caller base.APICaller, result params.StringsWatchResult) watcher.StringsWatcher {
    69  		numWatcherCalls++
    70  		c.Check(caller, gc.NotNil)
    71  		c.Check(result, jc.DeepEquals, expectResult)
    72  		return nil
    73  	}
    74  	s.PatchValue(instancepoller.NewStringsWatcher, watcherFunc)
    75  
    76  	apiCaller := successAPICaller(c, "WatchModelMachines", nil, expectResult)
    77  
    78  	api := instancepoller.NewAPI(apiCaller)
    79  	w, err := api.WatchModelMachines()
    80  	c.Assert(err, jc.ErrorIsNil)
    81  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
    82  	c.Assert(numWatcherCalls, gc.Equals, 1)
    83  	c.Assert(w, gc.IsNil)
    84  }
    85  
    86  func (s *InstancePollerSuite) TestWatchModelMachinesClientError(c *gc.C) {
    87  	apiCaller := clientErrorAPICaller(c, "WatchModelMachines", nil)
    88  	api := instancepoller.NewAPI(apiCaller)
    89  	w, err := api.WatchModelMachines()
    90  	c.Assert(err, gc.ErrorMatches, "client error!")
    91  	c.Assert(w, gc.IsNil)
    92  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
    93  }
    94  
    95  func (s *InstancePollerSuite) TestWatchModelMachinesServerError(c *gc.C) {
    96  	expectedResults := params.StringsWatchResult{
    97  		Error: apiservertesting.ServerError("server boom!"),
    98  	}
    99  	apiCaller := successAPICaller(c, "WatchModelMachines", nil, expectedResults)
   100  
   101  	api := instancepoller.NewAPI(apiCaller)
   102  	w, err := api.WatchModelMachines()
   103  	c.Assert(err, gc.ErrorMatches, "server boom!")
   104  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
   105  	c.Assert(w, gc.IsNil)
   106  }
   107  
   108  func (s *InstancePollerSuite) TestWatchForModelConfigChangesClientError(c *gc.C) {
   109  	// We're not testing the success case as we're not patching the
   110  	// NewNotifyWatcher call the embedded ModelWatcher is calling.
   111  	apiCaller := clientErrorAPICaller(c, "WatchForModelConfigChanges", nil)
   112  
   113  	api := instancepoller.NewAPI(apiCaller)
   114  	w, err := api.WatchForModelConfigChanges()
   115  	c.Assert(err, gc.ErrorMatches, "client error!")
   116  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
   117  	c.Assert(w, gc.IsNil)
   118  }
   119  
   120  func (s *InstancePollerSuite) TestModelConfigSuccess(c *gc.C) {
   121  	expectedConfig := coretesting.ModelConfig(c)
   122  	expectedResults := params.ModelConfigResult{
   123  		Config: params.ModelConfig(expectedConfig.AllAttrs()),
   124  	}
   125  	apiCaller := successAPICaller(c, "ModelConfig", nil, expectedResults)
   126  
   127  	api := instancepoller.NewAPI(apiCaller)
   128  	cfg, err := api.ModelConfig()
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
   131  	c.Assert(cfg, jc.DeepEquals, expectedConfig)
   132  }
   133  
   134  func (s *InstancePollerSuite) TestModelConfigClientError(c *gc.C) {
   135  	apiCaller := clientErrorAPICaller(c, "ModelConfig", nil)
   136  	api := instancepoller.NewAPI(apiCaller)
   137  	cfg, err := api.ModelConfig()
   138  	c.Assert(err, gc.ErrorMatches, "client error!")
   139  	c.Assert(cfg, gc.IsNil)
   140  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
   141  }
   142  
   143  func (s *InstancePollerSuite) TestModelConfigServerError(c *gc.C) {
   144  	expectResults := params.ModelConfigResult{
   145  		Config: params.ModelConfig{"type": "foo"},
   146  	}
   147  	apiCaller := successAPICaller(c, "ModelConfig", nil, expectResults)
   148  
   149  	api := instancepoller.NewAPI(apiCaller)
   150  	cfg, err := api.ModelConfig()
   151  	c.Assert(err, gc.NotNil) // the actual error doesn't matter
   152  	c.Assert(apiCaller.CallCount, gc.Equals, 1)
   153  	c.Assert(cfg, gc.IsNil)
   154  }
   155  
   156  func clientErrorAPICaller(c *gc.C, method string, expectArgs interface{}) *apitesting.CallChecker {
   157  	return apitesting.APICallChecker(c, apitesting.APICall{
   158  		Facade:        "InstancePoller",
   159  		VersionIsZero: true,
   160  		IdIsEmpty:     true,
   161  		Method:        method,
   162  		Args:          expectArgs,
   163  		Error:         errors.New("client error!"),
   164  	})
   165  }
   166  
   167  func successAPICaller(c *gc.C, method string, expectArgs, useResults interface{}) *apitesting.CallChecker {
   168  	return apitesting.APICallChecker(c, apitesting.APICall{
   169  		Facade:        "InstancePoller",
   170  		VersionIsZero: true,
   171  		IdIsEmpty:     true,
   172  		Method:        method,
   173  		Args:          expectArgs,
   174  		Results:       useResults,
   175  	})
   176  }