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