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 }