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 "net/base/backoff_entry.h" | 5 #include "net/base/backoff_entry.h" |
6 | 6 |
7 #include "base/values.h" | 7 #include "base/values.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace { | 10 namespace { |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 for (int i = 0; i < 129; ++i) { | 320 for (int i = 0; i < 129; ++i) { |
321 custom.set_now(custom.ImplGetTimeNow() + custom.GetTimeUntilRelease()); | 321 custom.set_now(custom.ImplGetTimeNow() + custom.GetTimeUntilRelease()); |
322 custom.InformOfRequest(false); | 322 custom.InformOfRequest(false); |
323 ASSERT_TRUE(custom.ShouldRejectRequest()); | 323 ASSERT_TRUE(custom.ShouldRejectRequest()); |
324 } | 324 } |
325 | 325 |
326 // Max delay should still be respected. | 326 // Max delay should still be respected. |
327 EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds()); | 327 EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds()); |
328 } | 328 } |
329 | 329 |
330 TEST(BackoffEntryTest, SerializeTimeOffsets) { | 330 TEST(BackoffEntryTest, SerializationTimeOffsets) { |
331 TestBackoffEntry original(&base_policy); | 331 TestBackoffEntry original(&base_policy); |
332 // 2 errors. | 332 // 2 errors. |
333 original.InformOfRequest(false); | 333 original.InformOfRequest(false); |
334 original.InformOfRequest(false); | 334 original.InformOfRequest(false); |
335 scoped_ptr<base::ListValue> serialized = original.Serialize(); | 335 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
336 | 336 |
337 { | 337 { |
338 // Test that immediate deserializeation round-trips. | 338 // Test that immediate deserialization round-trips. |
339 TestBackoffEntry deserialized(&base_policy); | 339 TestBackoffEntry deserialized(&base_policy); |
340 EXPECT_TRUE(deserialized.Deserialize(*serialized)); | 340 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
341 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); | 341 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
342 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); | 342 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); |
343 } | 343 } |
344 | 344 |
345 { | 345 { |
346 // Test deserialization when wall clock has advanced but TimeTicks haven't | 346 // Test deserialization when wall clock has advanced but TimeTicks haven't |
347 // (e.g. device was rebooted). | 347 // (e.g. device was rebooted). |
348 TestBackoffEntry deserialized(&base_policy); | 348 TestBackoffEntry deserialized(&base_policy); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 deserialized.set_wall_clock_now( | 398 deserialized.set_wall_clock_now( |
399 original.ImplGetWallClockTimeNow() - TimeDelta::FromDays(1)); | 399 original.ImplGetWallClockTimeNow() - TimeDelta::FromDays(1)); |
400 EXPECT_TRUE(deserialized.Deserialize(*serialized)); | 400 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
401 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); | 401 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
402 // Deserialization should respect maximum_backoff_ms in such a situation. | 402 // Deserialization should respect maximum_backoff_ms in such a situation. |
403 EXPECT_EQ(TimeDelta::FromMilliseconds(base_policy.maximum_backoff_ms), | 403 EXPECT_EQ(TimeDelta::FromMilliseconds(base_policy.maximum_backoff_ms), |
404 deserialized.GetTimeUntilRelease()); | 404 deserialized.GetTimeUntilRelease()); |
405 } | 405 } |
406 } | 406 } |
407 | 407 |
408 TEST(BackoffEntryTest, SerializeNoFailures) { | 408 TEST(BackoffEntryTest, SerializationNoFailures) { |
409 TestBackoffEntry original(&base_policy); | 409 TestBackoffEntry original(&base_policy); |
410 scoped_ptr<base::ListValue> serialized = original.Serialize(); | 410 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
411 | 411 |
412 TestBackoffEntry deserialized(&base_policy); | 412 TestBackoffEntry deserialized(&base_policy); |
413 // 1 error, so that we can tell when Deserialize restores the values. | 413 // 1 error, so that we can tell when Deserialize restores the values. |
414 deserialized.InformOfRequest(false); | 414 deserialized.InformOfRequest(false); |
415 EXPECT_NE(original.failure_count(), deserialized.failure_count()); | 415 EXPECT_NE(original.failure_count(), deserialized.failure_count()); |
416 EXPECT_NE(original.GetReleaseTime(), deserialized.GetReleaseTime()); | 416 EXPECT_NE(original.GetReleaseTime(), deserialized.GetReleaseTime()); |
417 | 417 |
418 EXPECT_TRUE(deserialized.Deserialize(*serialized)); | 418 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
419 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); | 419 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
420 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); | 420 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); |
421 } | 421 } |
422 | 422 |
| 423 TEST(BackoffEntryTest, SerializationOverflowProtection) { |
| 424 // Test that deserialization round-trips with extremely large positive and |
| 425 // negative release times. |
| 426 BackoffEntry::Policy no_maximum_policy = base_policy; |
| 427 no_maximum_policy.maximum_backoff_ms = -1; |
| 428 |
| 429 // Test that deserialization round-trips if ImplGetTimeNow and |
| 430 // ImplGetWallClockTimeNow are zero throughout. |
| 431 { |
| 432 TestBackoffEntry original(&no_maximum_policy); |
| 433 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1)); |
| 434 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 435 TestBackoffEntry deserialized(&no_maximum_policy); |
| 436 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 437 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 438 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); |
| 439 } |
| 440 { |
| 441 TestBackoffEntry original(&no_maximum_policy); |
| 442 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1)); |
| 443 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 444 TestBackoffEntry deserialized(&no_maximum_policy); |
| 445 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 446 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 447 EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime()); |
| 448 } |
| 449 |
| 450 |
| 451 // These were the actual values when I wrote this test. |
| 452 const TimeTicks realistic_time_ticks_now = |
| 453 TimeTicks::FromInternalValue(304519400134); |
| 454 const Time realistic_wall_clock_time_now = |
| 455 Time::FromInternalValue(13071957275919685); |
| 456 |
| 457 // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow |
| 458 // initially have realistic values but then decrease. |
| 459 { |
| 460 TestBackoffEntry original(&no_maximum_policy); |
| 461 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1)); |
| 462 original.set_now(realistic_time_ticks_now); |
| 463 original.set_wall_clock_now(realistic_wall_clock_time_now); |
| 464 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 465 TestBackoffEntry deserialized(&no_maximum_policy); |
| 466 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 467 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 468 EXPECT_EQ(TimeTicks::FromInternalValue(kint64max), |
| 469 deserialized.GetReleaseTime()); |
| 470 } |
| 471 { |
| 472 TestBackoffEntry original(&no_maximum_policy); |
| 473 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1)); |
| 474 original.set_now(realistic_time_ticks_now); |
| 475 original.set_wall_clock_now(realistic_wall_clock_time_now); |
| 476 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 477 TestBackoffEntry deserialized(&no_maximum_policy); |
| 478 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 479 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 480 EXPECT_EQ(TimeTicks::FromInternalValue(kint64min) |
| 481 + (realistic_wall_clock_time_now - Time()), |
| 482 deserialized.GetReleaseTime()); |
| 483 } |
| 484 |
| 485 // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow |
| 486 // are initially zero, but then have realistic values. |
| 487 { |
| 488 TestBackoffEntry original(&no_maximum_policy); |
| 489 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1)); |
| 490 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 491 TestBackoffEntry deserialized(&no_maximum_policy); |
| 492 deserialized.set_now(realistic_time_ticks_now); |
| 493 deserialized.set_wall_clock_now(realistic_wall_clock_time_now); |
| 494 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 495 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 496 EXPECT_EQ(original.GetReleaseTime() |
| 497 - (realistic_wall_clock_time_now - Time()) |
| 498 + (realistic_time_ticks_now - TimeTicks()), |
| 499 deserialized.GetReleaseTime()); |
| 500 } |
| 501 { |
| 502 TestBackoffEntry original(&no_maximum_policy); |
| 503 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1)); |
| 504 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 505 TestBackoffEntry deserialized(&no_maximum_policy); |
| 506 deserialized.set_now(realistic_time_ticks_now); |
| 507 deserialized.set_wall_clock_now(realistic_wall_clock_time_now); |
| 508 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 509 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 510 EXPECT_EQ(TimeTicks::FromInternalValue(kint64min) |
| 511 + (realistic_time_ticks_now - TimeTicks()), |
| 512 deserialized.GetReleaseTime()); |
| 513 } |
| 514 |
| 515 // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow |
| 516 // have the same realistic values both before and after. |
| 517 { |
| 518 TestBackoffEntry original(&no_maximum_policy); |
| 519 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1)); |
| 520 original.set_now(realistic_time_ticks_now); |
| 521 original.set_wall_clock_now(realistic_wall_clock_time_now); |
| 522 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 523 TestBackoffEntry deserialized(&no_maximum_policy); |
| 524 deserialized.set_now(realistic_time_ticks_now); |
| 525 deserialized.set_wall_clock_now(realistic_wall_clock_time_now); |
| 526 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 527 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 528 EXPECT_EQ(TimeTicks::FromInternalValue(kint64max) |
| 529 - (realistic_wall_clock_time_now - Time()) |
| 530 + (realistic_time_ticks_now - TimeTicks()), |
| 531 deserialized.GetReleaseTime()); |
| 532 } |
| 533 { |
| 534 TestBackoffEntry original(&no_maximum_policy); |
| 535 original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1)); |
| 536 original.set_now(realistic_time_ticks_now); |
| 537 original.set_wall_clock_now(realistic_wall_clock_time_now); |
| 538 scoped_ptr<base::ListValue> serialized = original.Serialize(); |
| 539 TestBackoffEntry deserialized(&no_maximum_policy); |
| 540 deserialized.set_now(realistic_time_ticks_now); |
| 541 deserialized.set_wall_clock_now(realistic_wall_clock_time_now); |
| 542 EXPECT_TRUE(deserialized.Deserialize(*serialized)); |
| 543 EXPECT_EQ(original.failure_count(), deserialized.failure_count()); |
| 544 EXPECT_EQ(TimeTicks::FromInternalValue(kint64min) |
| 545 + (realistic_time_ticks_now - TimeTicks()), |
| 546 deserialized.GetReleaseTime()); |
| 547 } |
| 548 } |
| 549 |
423 } // namespace | 550 } // namespace |
OLD | NEW |