| Index: net/base/backoff_entry_unittest.cc
|
| ===================================================================
|
| --- net/base/backoff_entry_unittest.cc (revision 133709)
|
| +++ net/base/backoff_entry_unittest.cc (working copy)
|
| @@ -11,7 +11,7 @@
|
| using base::TimeTicks;
|
| using net::BackoffEntry;
|
|
|
| -BackoffEntry::Policy base_policy = { 0, 1000, 2.0, 0.0, 20000, 2000 };
|
| +BackoffEntry::Policy base_policy = { 0, 1000, 2.0, 0.0, 20000, 2000, false };
|
|
|
| class TestBackoffEntry : public BackoffEntry {
|
| public:
|
| @@ -42,9 +42,11 @@
|
| TEST(BackoffEntryTest, BaseTest) {
|
| TestBackoffEntry entry(&base_policy);
|
| EXPECT_FALSE(entry.ShouldRejectRequest());
|
| + EXPECT_EQ(TimeDelta(), entry.GetTimeUntilRelease());
|
|
|
| entry.InformOfRequest(false);
|
| EXPECT_TRUE(entry.ShouldRejectRequest());
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(1000), entry.GetTimeUntilRelease());
|
| }
|
|
|
| TEST(BackoffEntryTest, CanDiscardNeverExpires) {
|
| @@ -83,6 +85,26 @@
|
| EXPECT_TRUE(entry.CanDiscard());
|
| }
|
|
|
| +TEST(BackoffEntryTest, CanDiscardAlwaysDelay) {
|
| + BackoffEntry::Policy always_delay_policy = base_policy;
|
| + always_delay_policy.always_use_initial_delay = true;
|
| + always_delay_policy.entry_lifetime_ms = 0;
|
| +
|
| + TestBackoffEntry entry(&always_delay_policy);
|
| +
|
| + // Because lifetime is non-zero, we shouldn't be able to discard yet.
|
| + entry.set_now(entry.GetReleaseTime() + TimeDelta::FromMilliseconds(2000));
|
| + EXPECT_TRUE(entry.CanDiscard());
|
| +
|
| + // Even with no failures, we wait until the delay before we allow discard.
|
| + entry.InformOfRequest(true);
|
| + EXPECT_FALSE(entry.CanDiscard());
|
| +
|
| + // Wait until the delay expires, and we can discard the entry again.
|
| + entry.set_now(entry.GetReleaseTime() + TimeDelta::FromMilliseconds(1000));
|
| + EXPECT_TRUE(entry.CanDiscard());
|
| +}
|
| +
|
| TEST(BackoffEntryTest, CanDiscardNotStored) {
|
| BackoffEntry::Policy no_store_policy = base_policy;
|
| no_store_policy.entry_lifetime_ms = 0;
|
| @@ -95,10 +117,13 @@
|
| lenient_policy.num_errors_to_ignore = 2;
|
|
|
| BackoffEntry entry(&lenient_policy);
|
| +
|
| entry.InformOfRequest(false);
|
| EXPECT_FALSE(entry.ShouldRejectRequest());
|
| +
|
| entry.InformOfRequest(false);
|
| EXPECT_FALSE(entry.ShouldRejectRequest());
|
| +
|
| entry.InformOfRequest(false);
|
| EXPECT_TRUE(entry.ShouldRejectRequest());
|
| }
|
| @@ -114,16 +139,19 @@
|
| entry.InformOfRequest(false);
|
| result = entry.GetReleaseTime();
|
| EXPECT_EQ(entry.ImplGetTimeNow() + TimeDelta::FromMilliseconds(1000), result);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(1000), entry.GetTimeUntilRelease());
|
|
|
| // 2 errors.
|
| entry.InformOfRequest(false);
|
| result = entry.GetReleaseTime();
|
| EXPECT_EQ(entry.ImplGetTimeNow() + TimeDelta::FromMilliseconds(2000), result);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000), entry.GetTimeUntilRelease());
|
|
|
| // 3 errors.
|
| entry.InformOfRequest(false);
|
| result = entry.GetReleaseTime();
|
| EXPECT_EQ(entry.ImplGetTimeNow() + TimeDelta::FromMilliseconds(4000), result);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(4000), entry.GetTimeUntilRelease());
|
|
|
| // 6 errors (to check it doesn't pass maximum).
|
| entry.InformOfRequest(false);
|
| @@ -134,6 +162,42 @@
|
| entry.ImplGetTimeNow() + TimeDelta::FromMilliseconds(20000), result);
|
| }
|
|
|
| +TEST(BackoffEntryTest, ReleaseTimeCalculationAlwaysDelay) {
|
| + BackoffEntry::Policy always_delay_policy = base_policy;
|
| + always_delay_policy.always_use_initial_delay = true;
|
| + always_delay_policy.num_errors_to_ignore = 2;
|
| +
|
| + TestBackoffEntry entry(&always_delay_policy);
|
| +
|
| + // With previous requests, should return "now".
|
| + TimeTicks result = entry.GetReleaseTime();
|
| + EXPECT_EQ(TimeDelta(), entry.GetTimeUntilRelease());
|
| +
|
| + // 1 error.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(1000), entry.GetTimeUntilRelease());
|
| +
|
| + // 2 errors.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(1000), entry.GetTimeUntilRelease());
|
| +
|
| + // 3 errors, exponential backoff starts.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000), entry.GetTimeUntilRelease());
|
| +
|
| + // 4 errors.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(4000), entry.GetTimeUntilRelease());
|
| +
|
| + // 8 errors (to check it doesn't pass maximum).
|
| + entry.InformOfRequest(false);
|
| + entry.InformOfRequest(false);
|
| + entry.InformOfRequest(false);
|
| + entry.InformOfRequest(false);
|
| + result = entry.GetReleaseTime();
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(20000), entry.GetTimeUntilRelease());
|
| +}
|
| +
|
| TEST(BackoffEntryTest, ReleaseTimeCalculationWithJitter) {
|
| for (int i = 0; i < 10; ++i) {
|
| BackoffEntry::Policy jittery_policy = base_policy;
|
| @@ -172,6 +236,32 @@
|
| entry.GetReleaseTime());
|
| }
|
|
|
| +TEST(BackoffEntryTest, FailureThenSuccessAlwaysDelay) {
|
| + BackoffEntry::Policy always_delay_policy = base_policy;
|
| + always_delay_policy.always_use_initial_delay = true;
|
| + always_delay_policy.num_errors_to_ignore = 1;
|
| +
|
| + TestBackoffEntry entry(&always_delay_policy);
|
| +
|
| + // Failure count 1.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(1000), entry.GetTimeUntilRelease());
|
| +
|
| + // Failure count 2.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000), entry.GetTimeUntilRelease());
|
| + entry.set_now(entry.GetReleaseTime() + TimeDelta::FromMilliseconds(2000));
|
| +
|
| + // Success. We should go back to the original delay.
|
| + entry.InformOfRequest(true);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(1000), entry.GetTimeUntilRelease());
|
| +
|
| + // Failure count reaches 2 again. We should increase the delay once more.
|
| + entry.InformOfRequest(false);
|
| + EXPECT_EQ(TimeDelta::FromMilliseconds(2000), entry.GetTimeUntilRelease());
|
| + entry.set_now(entry.GetReleaseTime() + TimeDelta::FromMilliseconds(2000));
|
| +}
|
| +
|
| TEST(BackoffEntryTest, RetainCustomHorizon) {
|
| TestBackoffEntry custom(&base_policy);
|
| TimeTicks custom_horizon = TimeTicks() + TimeDelta::FromDays(3);
|
|
|