github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/controller/logfwd/lastsent_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logfwd_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 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/apiserver/common" 14 "github.com/juju/juju/apiserver/facades/controller/logfwd" 15 "github.com/juju/juju/apiserver/params" 16 apiservertesting "github.com/juju/juju/apiserver/testing" 17 "github.com/juju/juju/state" 18 ) 19 20 type LastSentSuite struct { 21 testing.IsolationSuite 22 23 stub *testing.Stub 24 state *stubState 25 authorizer apiservertesting.FakeAuthorizer 26 } 27 28 var _ = gc.Suite(&LastSentSuite{}) 29 30 func (s *LastSentSuite) SetUpTest(c *gc.C) { 31 s.IsolationSuite.SetUpTest(c) 32 33 s.stub = &testing.Stub{} 34 s.state = &stubState{stub: s.stub} 35 s.authorizer = apiservertesting.FakeAuthorizer{ 36 Tag: names.NewMachineTag("99"), 37 Controller: true, 38 } 39 } 40 41 func (s *LastSentSuite) TestAuthRefusesUser(c *gc.C) { 42 anAuthorizer := apiservertesting.FakeAuthorizer{ 43 Tag: names.NewUserTag("bob"), 44 } 45 46 _, err := logfwd.NewLogForwardingAPI(s.state, anAuthorizer) 47 48 c.Check(err, gc.ErrorMatches, "permission denied") 49 } 50 51 func (s *LastSentSuite) TestAuthRefusesNonController(c *gc.C) { 52 anAuthorizer := apiservertesting.FakeAuthorizer{ 53 Tag: names.NewMachineTag("99"), 54 } 55 56 _, err := logfwd.NewLogForwardingAPI(s.state, anAuthorizer) 57 58 c.Check(err, gc.ErrorMatches, "permission denied") 59 } 60 61 func (s *LastSentSuite) TestGetLastSentOne(c *gc.C) { 62 tracker := s.state.addTracker() 63 tracker.ReturnGet = 10 64 api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer) 65 c.Assert(err, jc.ErrorIsNil) 66 model := "deadbeef-2f18-4fd2-967d-db9663db7bea" 67 modelTag := names.NewModelTag(model) 68 69 res := api.GetLastSent(params.LogForwardingGetLastSentParams{ 70 IDs: []params.LogForwardingID{{ 71 ModelTag: modelTag.String(), 72 Sink: "spam", 73 }}, 74 }) 75 76 c.Check(res, jc.DeepEquals, params.LogForwardingGetLastSentResults{ 77 Results: []params.LogForwardingGetLastSentResult{{ 78 RecordID: 10, 79 RecordTimestamp: 100, 80 }}, 81 }) 82 s.stub.CheckCallNames(c, "NewLastSentTracker", "Get", "Close") 83 s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam") 84 } 85 86 func (s *LastSentSuite) TestGetLastSentBulk(c *gc.C) { 87 trackerSpam := s.state.addTracker() 88 trackerSpam.ReturnGet = 10 89 trackerEggs := s.state.addTracker() 90 trackerEggs.ReturnGet = 20 91 s.state.addTracker() // ham 92 s.stub.SetErrors(nil, nil, nil, nil, state.ErrNeverForwarded) 93 api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer) 94 c.Assert(err, jc.ErrorIsNil) 95 model := "deadbeef-2f18-4fd2-967d-db9663db7bea" 96 modelTag := names.NewModelTag(model) 97 98 res := api.GetLastSent(params.LogForwardingGetLastSentParams{ 99 IDs: []params.LogForwardingID{{ 100 ModelTag: modelTag.String(), 101 Sink: "spam", 102 }, { 103 ModelTag: modelTag.String(), 104 Sink: "eggs", 105 }, { 106 ModelTag: modelTag.String(), 107 Sink: "ham", 108 }}, 109 }) 110 111 c.Check(res, jc.DeepEquals, params.LogForwardingGetLastSentResults{ 112 Results: []params.LogForwardingGetLastSentResult{{ 113 RecordID: 10, 114 RecordTimestamp: 100, 115 }, { 116 RecordID: 20, 117 RecordTimestamp: 200, 118 }, { 119 Error: ¶ms.Error{ 120 Message: `cannot find ID of the last forwarded record`, 121 Code: params.CodeNotFound, 122 }, 123 }}, 124 }) 125 s.stub.CheckCallNames(c, 126 "NewLastSentTracker", "Get", "Close", 127 "NewLastSentTracker", "Get", "Close", 128 "NewLastSentTracker", "Get", "Close", 129 ) 130 s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam") 131 s.stub.CheckCall(c, 3, "NewLastSentTracker", modelTag, "eggs") 132 s.stub.CheckCall(c, 6, "NewLastSentTracker", modelTag, "ham") 133 } 134 135 func (s *LastSentSuite) TestSetLastSentOne(c *gc.C) { 136 s.state.addTracker() 137 api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer) 138 c.Assert(err, jc.ErrorIsNil) 139 model := "deadbeef-2f18-4fd2-967d-db9663db7bea" 140 modelTag := names.NewModelTag(model) 141 142 res := api.SetLastSent(params.LogForwardingSetLastSentParams{ 143 Params: []params.LogForwardingSetLastSentParam{{ 144 LogForwardingID: params.LogForwardingID{ 145 ModelTag: modelTag.String(), 146 Sink: "spam", 147 }, 148 RecordID: 10, 149 RecordTimestamp: 100, 150 }}, 151 }) 152 153 c.Check(res, jc.DeepEquals, params.ErrorResults{ 154 Results: []params.ErrorResult{{ 155 Error: nil, 156 }}, 157 }) 158 s.stub.CheckCallNames(c, "NewLastSentTracker", "Set", "Close") 159 s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam") 160 s.stub.CheckCall(c, 1, "Set", int64(10), int64(100)) 161 } 162 163 func (s *LastSentSuite) TestSetLastSentBulk(c *gc.C) { 164 s.state.addTracker() // spam 165 s.state.addTracker() // eggs 166 s.state.addTracker() // ham 167 failure := errors.New("<failed>") 168 s.stub.SetErrors(nil, nil, failure) 169 api, err := logfwd.NewLogForwardingAPI(s.state, s.authorizer) 170 c.Assert(err, jc.ErrorIsNil) 171 model := "deadbeef-2f18-4fd2-967d-db9663db7bea" 172 modelTag := names.NewModelTag(model) 173 174 res := api.SetLastSent(params.LogForwardingSetLastSentParams{ 175 Params: []params.LogForwardingSetLastSentParam{{ 176 LogForwardingID: params.LogForwardingID{ 177 ModelTag: modelTag.String(), 178 Sink: "spam", 179 }, 180 RecordID: 10, 181 RecordTimestamp: 100, 182 }, { 183 LogForwardingID: params.LogForwardingID{ 184 ModelTag: modelTag.String(), 185 Sink: "eggs", 186 }, 187 RecordID: 20, 188 RecordTimestamp: 200, 189 }, { 190 LogForwardingID: params.LogForwardingID{ 191 ModelTag: modelTag.String(), 192 Sink: "ham", 193 }, 194 RecordID: 15, 195 RecordTimestamp: 150, 196 }}, 197 }) 198 199 c.Check(res, jc.DeepEquals, params.ErrorResults{ 200 Results: []params.ErrorResult{{ 201 Error: nil, 202 }, { 203 Error: common.ServerError(failure), 204 }, { 205 Error: nil, 206 }}, 207 }) 208 s.stub.CheckCallNames(c, 209 "NewLastSentTracker", "Set", "Close", 210 "NewLastSentTracker", "Set", "Close", 211 "NewLastSentTracker", "Set", "Close", 212 ) 213 s.stub.CheckCall(c, 0, "NewLastSentTracker", modelTag, "spam") 214 s.stub.CheckCall(c, 1, "Set", int64(10), int64(100)) 215 s.stub.CheckCall(c, 3, "NewLastSentTracker", modelTag, "eggs") 216 s.stub.CheckCall(c, 4, "Set", int64(20), int64(200)) 217 s.stub.CheckCall(c, 6, "NewLastSentTracker", modelTag, "ham") 218 s.stub.CheckCall(c, 7, "Set", int64(15), int64(150)) 219 } 220 221 type stubState struct { 222 stub *testing.Stub 223 224 ReturnNewLastSentTracker []logfwd.LastSentTracker 225 } 226 227 func (s *stubState) addTracker() *stubTracker { 228 tracker := &stubTracker{stub: s.stub} 229 s.ReturnNewLastSentTracker = append(s.ReturnNewLastSentTracker, tracker) 230 return tracker 231 } 232 233 func (s *stubState) NewLastSentTracker(tag names.ModelTag, sink string) logfwd.LastSentTracker { 234 s.stub.AddCall("NewLastSentTracker", tag, sink) 235 if len(s.ReturnNewLastSentTracker) == 0 { 236 panic("ran out of trackers") 237 } 238 tracker := s.ReturnNewLastSentTracker[0] 239 s.ReturnNewLastSentTracker = s.ReturnNewLastSentTracker[1:] 240 return tracker 241 } 242 243 type stubTracker struct { 244 stub *testing.Stub 245 246 ReturnGet int64 247 } 248 249 func (s *stubTracker) Get() (int64, int64, error) { 250 s.stub.AddCall("Get") 251 if err := s.stub.NextErr(); err != nil { 252 return 0, 0, err 253 } 254 255 return s.ReturnGet, s.ReturnGet * 10, nil 256 } 257 258 func (s *stubTracker) Set(recID int64, recTimestamp int64) error { 259 s.stub.AddCall("Set", recID, recTimestamp) 260 if err := s.stub.NextErr(); err != nil { 261 return err 262 } 263 264 return nil 265 } 266 267 func (s *stubTracker) Close() error { 268 s.stub.AddCall("Close") 269 if err := s.stub.NextErr(); err != nil { 270 return err 271 } 272 273 return nil 274 }