| 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 |