OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/message_loop.h" | 5 #include "base/message_loop.h" |
6 #include "base/process.h" | 6 #include "base/process.h" |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "chrome/browser/extensions/extension_function.h" | 9 #include "chrome/browser/extensions/extension_function.h" |
10 #include "chrome/browser/extensions/extensions_quota_service.h" | 10 #include "chrome/browser/extensions/extensions_quota_service.h" |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 // Do the same as above except don't exhaust the 3rd (w.l.o.g) bucket. | 211 // Do the same as above except don't exhaust the 3rd (w.l.o.g) bucket. |
212 bucket.Reset(k2PerMinute, kStartTime); | 212 bucket.Reset(k2PerMinute, kStartTime); |
213 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, 3); | 213 DoMoreThan2PerMinuteFor5Minutes(kStartTime, &lim, &bucket, 3); |
214 // If the 3rd bucket were exhausted, this would fail (see first test). | 214 // If the 3rd bucket were exhausted, this would fail (see first test). |
215 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(6))); | 215 EXPECT_TRUE(lim.Apply(&bucket, kStartTime + TimeDelta::FromMinutes(6))); |
216 } | 216 } |
217 | 217 |
218 TEST_F(ExtensionsQuotaServiceTest, NoHeuristic) { | 218 TEST_F(ExtensionsQuotaServiceTest, NoHeuristic) { |
219 scoped_refptr<MockFunction> f(new MockFunction("foo")); | 219 scoped_refptr<MockFunction> f(new MockFunction("foo")); |
220 ListValue args; | 220 ListValue args; |
221 EXPECT_EQ("", service_->Assess(extension_a_, f, &args, kStartTime)); | 221 EXPECT_EQ("", service_->Assess(extension_a_, f.get(), &args, kStartTime)); |
222 } | 222 } |
223 | 223 |
224 TEST_F(ExtensionsQuotaServiceTest, FrozenHeuristic) { | 224 TEST_F(ExtensionsQuotaServiceTest, FrozenHeuristic) { |
225 scoped_refptr<MockFunction> f(new FrozenMockFunction("foo")); | 225 scoped_refptr<MockFunction> f(new FrozenMockFunction("foo")); |
226 ListValue args; | 226 ListValue args; |
227 args.Append(new base::FundamentalValue(1)); | 227 args.Append(new base::FundamentalValue(1)); |
228 EXPECT_NE("", service_->Assess(extension_a_, f, &args, kStartTime)); | 228 EXPECT_NE("", service_->Assess(extension_a_, f.get(), &args, kStartTime)); |
229 } | 229 } |
230 | 230 |
231 TEST_F(ExtensionsQuotaServiceTest, SingleHeuristic) { | 231 TEST_F(ExtensionsQuotaServiceTest, SingleHeuristic) { |
232 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); | 232 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); |
233 ListValue args; | 233 ListValue args; |
234 args.Append(new base::FundamentalValue(1)); | 234 args.Append(new base::FundamentalValue(1)); |
235 EXPECT_EQ("", service_->Assess(extension_a_, f, &args, kStartTime)); | 235 EXPECT_EQ("", service_->Assess(extension_a_, f.get(), &args, kStartTime)); |
236 EXPECT_EQ("", service_->Assess(extension_a_, f, &args, | 236 EXPECT_EQ("", |
237 kStartTime + TimeDelta::FromSeconds(10))); | 237 service_->Assess(extension_a_, |
238 EXPECT_NE("", service_->Assess(extension_a_, f, &args, | 238 f.get(), |
239 kStartTime + TimeDelta::FromSeconds(15))); | 239 &args, |
| 240 kStartTime + TimeDelta::FromSeconds(10))); |
| 241 EXPECT_NE("", |
| 242 service_->Assess(extension_a_, |
| 243 f.get(), |
| 244 &args, |
| 245 kStartTime + TimeDelta::FromSeconds(15))); |
240 | 246 |
241 ListValue args2; | 247 ListValue args2; |
242 args2.Append(new base::FundamentalValue(1)); | 248 args2.Append(new base::FundamentalValue(1)); |
243 args2.Append(new base::FundamentalValue(2)); | 249 args2.Append(new base::FundamentalValue(2)); |
244 EXPECT_EQ("", service_->Assess(extension_b_, f, &args2, kStartTime)); | 250 EXPECT_EQ("", service_->Assess(extension_b_, f.get(), &args2, kStartTime)); |
245 EXPECT_EQ("", service_->Assess(extension_b_, f, &args2, | 251 EXPECT_EQ("", |
246 kStartTime + TimeDelta::FromSeconds(10))); | 252 service_->Assess(extension_b_, |
| 253 f.get(), |
| 254 &args2, |
| 255 kStartTime + TimeDelta::FromSeconds(10))); |
247 | 256 |
248 TimeDelta peace = TimeDelta::FromMinutes(30); | 257 TimeDelta peace = TimeDelta::FromMinutes(30); |
249 EXPECT_EQ("", service_->Assess(extension_b_, f, &args, kStartTime + peace)); | 258 EXPECT_EQ("", |
250 EXPECT_EQ("", service_->Assess( | 259 service_->Assess(extension_b_, f.get(), &args, kStartTime + peace)); |
251 extension_b_, f, &args, | 260 EXPECT_EQ("", |
252 kStartTime + peace + TimeDelta::FromSeconds(10))); | 261 service_->Assess(extension_b_, |
253 EXPECT_NE("", service_->Assess(extension_b_, f, &args2, | 262 f.get(), |
254 kStartTime + peace + TimeDelta::FromSeconds(15))); | 263 &args, |
| 264 kStartTime + peace + TimeDelta::FromSeconds(10))); |
| 265 EXPECT_NE("", |
| 266 service_->Assess(extension_b_, |
| 267 f.get(), |
| 268 &args2, |
| 269 kStartTime + peace + TimeDelta::FromSeconds(15))); |
255 | 270 |
256 // Test that items are independent. | 271 // Test that items are independent. |
257 ListValue args3; | 272 ListValue args3; |
258 args3.Append(new base::FundamentalValue(3)); | 273 args3.Append(new base::FundamentalValue(3)); |
259 EXPECT_EQ("", service_->Assess(extension_c_, f, &args, kStartTime)); | 274 EXPECT_EQ("", service_->Assess(extension_c_, f.get(), &args, kStartTime)); |
260 EXPECT_EQ("", service_->Assess(extension_c_, f, &args3, | 275 EXPECT_EQ("", |
261 kStartTime + TimeDelta::FromSeconds(10))); | 276 service_->Assess(extension_c_, |
262 EXPECT_EQ("", service_->Assess(extension_c_, f, &args, | 277 f.get(), |
263 kStartTime + TimeDelta::FromSeconds(15))); | 278 &args3, |
264 EXPECT_EQ("", service_->Assess(extension_c_, f, &args3, | 279 kStartTime + TimeDelta::FromSeconds(10))); |
265 kStartTime + TimeDelta::FromSeconds(20))); | 280 EXPECT_EQ("", |
266 EXPECT_NE("", service_->Assess(extension_c_, f, &args, | 281 service_->Assess(extension_c_, |
267 kStartTime + TimeDelta::FromSeconds(25))); | 282 f.get(), |
268 EXPECT_NE("", service_->Assess(extension_c_, f, &args3, | 283 &args, |
269 kStartTime + TimeDelta::FromSeconds(30))); | 284 kStartTime + TimeDelta::FromSeconds(15))); |
| 285 EXPECT_EQ("", |
| 286 service_->Assess(extension_c_, |
| 287 f.get(), |
| 288 &args3, |
| 289 kStartTime + TimeDelta::FromSeconds(20))); |
| 290 EXPECT_NE("", |
| 291 service_->Assess(extension_c_, |
| 292 f.get(), |
| 293 &args, |
| 294 kStartTime + TimeDelta::FromSeconds(25))); |
| 295 EXPECT_NE("", |
| 296 service_->Assess(extension_c_, |
| 297 f.get(), |
| 298 &args3, |
| 299 kStartTime + TimeDelta::FromSeconds(30))); |
270 } | 300 } |
271 | 301 |
272 TEST_F(ExtensionsQuotaServiceTest, ChainedHeuristics) { | 302 TEST_F(ExtensionsQuotaServiceTest, ChainedHeuristics) { |
273 scoped_refptr<MockFunction> f(new ChainedLimitsMockFunction("foo")); | 303 scoped_refptr<MockFunction> f(new ChainedLimitsMockFunction("foo")); |
274 ListValue args; | 304 ListValue args; |
275 args.Append(new base::FundamentalValue(1)); | 305 args.Append(new base::FundamentalValue(1)); |
276 | 306 |
277 // First, test that the low limit can be avoided but the higher one is hit. | 307 // First, test that the low limit can be avoided but the higher one is hit. |
278 // One event per minute for 20 minutes comes in under the sustained limit, | 308 // One event per minute for 20 minutes comes in under the sustained limit, |
279 // but is equal to the timed limit. | 309 // but is equal to the timed limit. |
280 for (int i = 0; i < 20; i++) { | 310 for (int i = 0; i < 20; i++) { |
281 EXPECT_EQ("", service_->Assess( | 311 EXPECT_EQ( |
282 extension_a_, f, &args, | 312 "", |
283 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); | 313 service_->Assess(extension_a_, |
| 314 f.get(), |
| 315 &args, |
| 316 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); |
284 } | 317 } |
285 | 318 |
286 // This will bring us to 21 events in an hour, which is a violation. | 319 // This will bring us to 21 events in an hour, which is a violation. |
287 EXPECT_NE("", service_->Assess(extension_a_, f, &args, | 320 EXPECT_NE("", |
288 kStartTime + TimeDelta::FromMinutes(30))); | 321 service_->Assess(extension_a_, |
| 322 f.get(), |
| 323 &args, |
| 324 kStartTime + TimeDelta::FromMinutes(30))); |
289 | 325 |
290 // Now, check that we can still hit the lower limit. | 326 // Now, check that we can still hit the lower limit. |
291 for (int i = 0; i < 5; i++) { | 327 for (int i = 0; i < 5; i++) { |
292 EXPECT_EQ("", service_->Assess( | 328 EXPECT_EQ( |
293 extension_b_, f, &args, | 329 "", |
294 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); | 330 service_->Assess(extension_b_, |
295 EXPECT_EQ("", service_->Assess( | 331 f.get(), |
296 extension_b_, f, &args, | 332 &args, |
297 kStartTime + TimeDelta::FromSeconds(15 + i * 60))); | 333 kStartTime + TimeDelta::FromSeconds(10 + i * 60))); |
298 EXPECT_EQ("", service_->Assess( | 334 EXPECT_EQ( |
299 extension_b_, f, &args, | 335 "", |
300 kStartTime + TimeDelta::FromSeconds(20 + i * 60))); | 336 service_->Assess(extension_b_, |
| 337 f.get(), |
| 338 &args, |
| 339 kStartTime + TimeDelta::FromSeconds(15 + i * 60))); |
| 340 EXPECT_EQ( |
| 341 "", |
| 342 service_->Assess(extension_b_, |
| 343 f.get(), |
| 344 &args, |
| 345 kStartTime + TimeDelta::FromSeconds(20 + i * 60))); |
301 } | 346 } |
302 | 347 |
303 EXPECT_NE("", service_->Assess(extension_b_, f, &args, | 348 EXPECT_NE("", |
304 kStartTime + TimeDelta::FromMinutes(6))); | 349 service_->Assess(extension_b_, |
| 350 f.get(), |
| 351 &args, |
| 352 kStartTime + TimeDelta::FromMinutes(6))); |
305 } | 353 } |
306 | 354 |
307 TEST_F(ExtensionsQuotaServiceTest, MultipleFunctionsDontInterfere) { | 355 TEST_F(ExtensionsQuotaServiceTest, MultipleFunctionsDontInterfere) { |
308 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); | 356 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); |
309 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); | 357 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); |
310 | 358 |
311 ListValue args_f; | 359 ListValue args_f; |
312 ListValue args_g; | 360 ListValue args_g; |
313 args_f.Append(new base::FundamentalValue(1)); | 361 args_f.Append(new base::FundamentalValue(1)); |
314 args_g.Append(new base::FundamentalValue(2)); | 362 args_g.Append(new base::FundamentalValue(2)); |
315 | 363 |
316 EXPECT_EQ("", service_->Assess(extension_a_, f, &args_f, kStartTime)); | 364 EXPECT_EQ("", service_->Assess(extension_a_, f.get(), &args_f, kStartTime)); |
317 EXPECT_EQ("", service_->Assess(extension_a_, g, &args_g, kStartTime)); | 365 EXPECT_EQ("", service_->Assess(extension_a_, g.get(), &args_g, kStartTime)); |
318 EXPECT_EQ("", service_->Assess(extension_a_, f, &args_f, | 366 EXPECT_EQ("", |
319 kStartTime + TimeDelta::FromSeconds(10))); | 367 service_->Assess(extension_a_, |
320 EXPECT_EQ("", service_->Assess(extension_a_, g, &args_g, | 368 f.get(), |
321 kStartTime + TimeDelta::FromSeconds(10))); | 369 &args_f, |
322 EXPECT_NE("", service_->Assess(extension_a_, f, &args_f, | 370 kStartTime + TimeDelta::FromSeconds(10))); |
323 kStartTime + TimeDelta::FromSeconds(15))); | 371 EXPECT_EQ("", |
324 EXPECT_NE("", service_->Assess(extension_a_, g, &args_g, | 372 service_->Assess(extension_a_, |
325 kStartTime + TimeDelta::FromSeconds(15))); | 373 g.get(), |
| 374 &args_g, |
| 375 kStartTime + TimeDelta::FromSeconds(10))); |
| 376 EXPECT_NE("", |
| 377 service_->Assess(extension_a_, |
| 378 f.get(), |
| 379 &args_f, |
| 380 kStartTime + TimeDelta::FromSeconds(15))); |
| 381 EXPECT_NE("", |
| 382 service_->Assess(extension_a_, |
| 383 g.get(), |
| 384 &args_g, |
| 385 kStartTime + TimeDelta::FromSeconds(15))); |
326 } | 386 } |
327 | 387 |
328 TEST_F(ExtensionsQuotaServiceTest, ViolatorsWillBeViolators) { | 388 TEST_F(ExtensionsQuotaServiceTest, ViolatorsWillBeViolators) { |
329 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); | 389 scoped_refptr<MockFunction> f(new TimedLimitMockFunction("foo")); |
330 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); | 390 scoped_refptr<MockFunction> g(new TimedLimitMockFunction("bar")); |
331 ListValue arg; | 391 ListValue arg; |
332 arg.Append(new base::FundamentalValue(1)); | 392 arg.Append(new base::FundamentalValue(1)); |
333 EXPECT_EQ("", service_->Assess(extension_a_, f, &arg, kStartTime)); | 393 EXPECT_EQ("", service_->Assess(extension_a_, f.get(), &arg, kStartTime)); |
334 EXPECT_EQ("", service_->Assess(extension_a_, f, &arg, | 394 EXPECT_EQ("", |
335 kStartTime + TimeDelta::FromSeconds(10))); | 395 service_->Assess(extension_a_, |
336 EXPECT_NE("", service_->Assess(extension_a_, f, &arg, | 396 f.get(), |
337 kStartTime + TimeDelta::FromSeconds(15))); | 397 &arg, |
| 398 kStartTime + TimeDelta::FromSeconds(10))); |
| 399 EXPECT_NE("", |
| 400 service_->Assess(extension_a_, |
| 401 f.get(), |
| 402 &arg, |
| 403 kStartTime + TimeDelta::FromSeconds(15))); |
338 | 404 |
339 // We don't allow this extension to use quota limited functions even if they | 405 // We don't allow this extension to use quota limited functions even if they |
340 // wait a while. | 406 // wait a while. |
341 EXPECT_NE("", service_->Assess(extension_a_, f, &arg, | 407 EXPECT_NE( |
342 kStartTime + TimeDelta::FromDays(1))); | 408 "", |
343 EXPECT_NE("", service_->Assess(extension_a_, g, &arg, | 409 service_->Assess( |
344 kStartTime + TimeDelta::FromDays(1))); | 410 extension_a_, f.get(), &arg, kStartTime + TimeDelta::FromDays(1))); |
| 411 EXPECT_NE( |
| 412 "", |
| 413 service_->Assess( |
| 414 extension_a_, g.get(), &arg, kStartTime + TimeDelta::FromDays(1))); |
345 } | 415 } |
OLD | NEW |