github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 }