| Index: net/base/backoff_entry_unittest.cc
|
| diff --git a/net/base/backoff_entry_unittest.cc b/net/base/backoff_entry_unittest.cc
|
| index bf0e1b92a9675a4ca544dca74fba7179a0d87171..66aeff89d5ecc86bc4610582622c463c8cf29b6d 100644
|
| --- a/net/base/backoff_entry_unittest.cc
|
| +++ b/net/base/backoff_entry_unittest.cc
|
| @@ -327,7 +327,7 @@ TEST(BackoffEntryTest, OverflowProtection) {
|
| EXPECT_EQ(20000, custom.GetTimeUntilRelease().InMilliseconds());
|
| }
|
|
|
| -TEST(BackoffEntryTest, SerializeTimeOffsets) {
|
| +TEST(BackoffEntryTest, SerializationTimeOffsets) {
|
| TestBackoffEntry original(&base_policy);
|
| // 2 errors.
|
| original.InformOfRequest(false);
|
| @@ -335,7 +335,7 @@ TEST(BackoffEntryTest, SerializeTimeOffsets) {
|
| scoped_ptr<base::ListValue> serialized = original.Serialize();
|
|
|
| {
|
| - // Test that immediate deserializeation round-trips.
|
| + // Test that immediate deserialization round-trips.
|
| TestBackoffEntry deserialized(&base_policy);
|
| EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| @@ -405,7 +405,7 @@ TEST(BackoffEntryTest, SerializeTimeOffsets) {
|
| }
|
| }
|
|
|
| -TEST(BackoffEntryTest, SerializeNoFailures) {
|
| +TEST(BackoffEntryTest, SerializationNoFailures) {
|
| TestBackoffEntry original(&base_policy);
|
| scoped_ptr<base::ListValue> serialized = original.Serialize();
|
|
|
| @@ -420,4 +420,131 @@ TEST(BackoffEntryTest, SerializeNoFailures) {
|
| EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
|
| }
|
|
|
| +TEST(BackoffEntryTest, SerializationOverflowProtection) {
|
| + // Test that deserialization round-trips with extremely large positive and
|
| + // negative release times.
|
| + BackoffEntry::Policy no_maximum_policy = base_policy;
|
| + no_maximum_policy.maximum_backoff_ms = -1;
|
| +
|
| + // Test that deserialization round-trips if ImplGetTimeNow and
|
| + // ImplGetWallClockTimeNow are zero throughout.
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
|
| + }
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(original.GetReleaseTime(), deserialized.GetReleaseTime());
|
| + }
|
| +
|
| +
|
| + // These were the actual values when I wrote this test.
|
| + const TimeTicks realistic_time_ticks_now =
|
| + TimeTicks::FromInternalValue(304519400134);
|
| + const Time realistic_wall_clock_time_now =
|
| + Time::FromInternalValue(13071957275919685);
|
| +
|
| + // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow
|
| + // initially have realistic values but then decrease.
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
|
| + original.set_now(realistic_time_ticks_now);
|
| + original.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(TimeTicks::FromInternalValue(kint64max),
|
| + deserialized.GetReleaseTime());
|
| + }
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
|
| + original.set_now(realistic_time_ticks_now);
|
| + original.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(TimeTicks::FromInternalValue(kint64min)
|
| + + (realistic_wall_clock_time_now - Time()),
|
| + deserialized.GetReleaseTime());
|
| + }
|
| +
|
| + // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow
|
| + // are initially zero, but then have realistic values.
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + deserialized.set_now(realistic_time_ticks_now);
|
| + deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(original.GetReleaseTime()
|
| + - (realistic_wall_clock_time_now - Time())
|
| + + (realistic_time_ticks_now - TimeTicks()),
|
| + deserialized.GetReleaseTime());
|
| + }
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + deserialized.set_now(realistic_time_ticks_now);
|
| + deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(TimeTicks::FromInternalValue(kint64min)
|
| + + (realistic_time_ticks_now - TimeTicks()),
|
| + deserialized.GetReleaseTime());
|
| + }
|
| +
|
| + // Test overflow behavior, when ImplGetTimeNow and ImplGetWallClockTimeNow
|
| + // have the same realistic values both before and after.
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64max - 1));
|
| + original.set_now(realistic_time_ticks_now);
|
| + original.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + deserialized.set_now(realistic_time_ticks_now);
|
| + deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(TimeTicks::FromInternalValue(kint64max)
|
| + - (realistic_wall_clock_time_now - Time())
|
| + + (realistic_time_ticks_now - TimeTicks()),
|
| + deserialized.GetReleaseTime());
|
| + }
|
| + {
|
| + TestBackoffEntry original(&no_maximum_policy);
|
| + original.SetCustomReleaseTime(TimeTicks::FromInternalValue(kint64min + 1));
|
| + original.set_now(realistic_time_ticks_now);
|
| + original.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + scoped_ptr<base::ListValue> serialized = original.Serialize();
|
| + TestBackoffEntry deserialized(&no_maximum_policy);
|
| + deserialized.set_now(realistic_time_ticks_now);
|
| + deserialized.set_wall_clock_now(realistic_wall_clock_time_now);
|
| + EXPECT_TRUE(deserialized.Deserialize(*serialized));
|
| + EXPECT_EQ(original.failure_count(), deserialized.failure_count());
|
| + EXPECT_EQ(TimeTicks::FromInternalValue(kint64min)
|
| + + (realistic_time_ticks_now - TimeTicks()),
|
| + deserialized.GetReleaseTime());
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|