Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: net/base/backoff_entry_serializer_unittest.cc

Issue 1023473003: Allow BackoffEntry to be serialized and deserialized. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed mmenke's review nits Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/base/backoff_entry.h"
6
7 #include "base/logging.h"
8 #include "base/macros.h"
9 #include "base/time/tick_clock.h"
10 #include "base/values.h"
11 #include "net/base/backoff_entry_serializer.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace net {
15
16 namespace {
17
18 using base::Time;
19 using base::TimeDelta;
20 using base::TimeTicks;
21
22 BackoffEntry::Policy base_policy = {
23 0 /* num_errors_to_ignore */,
24 1000 /* initial_delay_ms */,
25 2.0 /* multiply_factor */,
26 0.0 /* jitter_factor */,
27 20000 /* maximum_backoff_ms */,
28 2000 /* entry_lifetime_ms */,
29 false /* always_use_initial_delay */
30 };
31
32 class TestTickClock : public base::TickClock {
33 public:
34 TestTickClock() {}
35 ~TestTickClock() override {}
36
37 TimeTicks NowTicks() override { return now_ticks_; }
38 void set_now(TimeTicks now) { now_ticks_ = now; }
39
40 private:
41 TimeTicks now_ticks_;
42
43 DISALLOW_COPY_AND_ASSIGN(TestTickClock);
44 };
45
46 TEST(BackoffEntrySerializerTest, SerializeNoFailures) {
47 Time original_time = Time::Now();
48 TestTickClock original_ticks;
49 original_ticks.set_now(TimeTicks::Now());
50 BackoffEntry original(&base_policy, &original_ticks);
51 scoped_ptr<base::Value> serialized =
52 BackoffEntrySerializer::SerializeToValue(original, original_time);
53
54 scoped_ptr<BackoffEntry> deserialized =
55 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
56 &original_ticks,
57 original_time);
58 ASSERT_TRUE(deserialized.get());
59 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
60 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
61 }
62
63 TEST(BackoffEntrySerializerTest, SerializeTimeOffsets) {
64 Time original_time = Time::FromJsTime(1430907555111); // May 2015 for realism
65 TestTickClock original_ticks;
66 BackoffEntry original(&base_policy, &original_ticks);
67 // 2 errors.
68 original.InformOfRequest(false);
69 original.InformOfRequest(false);
70 scoped_ptr<base::Value> serialized =
71 BackoffEntrySerializer::SerializeToValue(original, original_time);
72
73 {
74 // Test that immediate deserialization round-trips.
75 scoped_ptr<BackoffEntry> deserialized =
76 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
77 &original_ticks,
78 original_time);
79 ASSERT_TRUE(deserialized.get());
80 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
81 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
82 }
83
84 {
85 // Test deserialization when wall clock has advanced but TimeTicks::Now()
86 // hasn't (e.g. device was rebooted).
87 Time later_time = original_time + TimeDelta::FromDays(1);
88 scoped_ptr<BackoffEntry> deserialized =
89 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
90 &original_ticks,
91 later_time);
92 ASSERT_TRUE(deserialized.get());
93 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
94 // Remaining backoff duration continues decreasing while device is off.
95 // Since TimeTicks::Now() has not advanced, the absolute release time ticks
96 // will decrease accordingly.
97 EXPECT_GT(original.GetTimeUntilRelease(),
98 deserialized->GetTimeUntilRelease());
99 EXPECT_EQ(original.GetReleaseTime() - TimeDelta::FromDays(1),
100 deserialized->GetReleaseTime());
101 }
102
103 {
104 // Test deserialization when TimeTicks::Now() has advanced but wall clock
105 // hasn't (e.g. it's an hour later, but a DST change cancelled that out).
106 TestTickClock later_ticks;
107 later_ticks.set_now(TimeTicks() + TimeDelta::FromDays(1));
108 scoped_ptr<BackoffEntry> deserialized =
109 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
110 &later_ticks,
111 original_time);
112 ASSERT_TRUE(deserialized.get());
113 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
114 // According to the wall clock, no time has passed. So remaining backoff
115 // duration is preserved, hence the absolute release time ticks increases.
116 // This isn't ideal - if we also serialized the current time and time ticks,
mmenke 2015/05/06 20:48:44 nit: Don't use we in comments (x2)
johnme 2015/05/07 12:16:01 Done (oops, old habits).
117 // we could detect that time had passed but the wall clock went backwards,
118 // and reduce the remaining backoff duration accordingly.
119 EXPECT_EQ(original.GetTimeUntilRelease(),
120 deserialized->GetTimeUntilRelease());
121 EXPECT_EQ(original.GetReleaseTime() + TimeDelta::FromDays(1),
122 deserialized->GetReleaseTime());
123 }
124
125 {
126 // Test deserialization when both wall clock and TimeTicks::Now() have
127 // advanced (e.g. it's just later than it used to be).
128 TestTickClock later_ticks;
129 later_ticks.set_now(TimeTicks() + TimeDelta::FromDays(1));
130 Time later_time = original_time + TimeDelta::FromDays(1);
131 scoped_ptr<BackoffEntry> deserialized =
132 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
133 &later_ticks, later_time);
134 ASSERT_TRUE(deserialized.get());
135 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
136 // Since both have advanced by the same amount, the absolute release time
137 // ticks should be preserved; the remaining backoff duration will have
138 // decreased of course, since time has passed.
139 EXPECT_GT(original.GetTimeUntilRelease(),
140 deserialized->GetTimeUntilRelease());
141 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
142 }
143
144 {
145 // Test deserialization when wall clock has gone backwards but TimeTicks
146 // haven't (e.g. the system clock was fast but they fixed it).
147 EXPECT_LT(TimeDelta::FromSeconds(1), original.GetTimeUntilRelease());
148 Time earlier_time = original_time - TimeDelta::FromSeconds(1);
149 scoped_ptr<BackoffEntry> deserialized =
150 BackoffEntrySerializer::DeserializeFromValue(*serialized, &base_policy,
151 &original_ticks,
152 earlier_time);
153 ASSERT_TRUE(deserialized.get());
154 EXPECT_EQ(original.failure_count(), deserialized->failure_count());
155 // If we just serialized the absolute wall clock time, subtracting the
mmenke 2015/05/06 20:48:44 nit: -we
johnme 2015/05/07 12:16:01 Done.
156 // (decreased) current wall clock time from the serialized wall clock time
157 // could give very large (incorrect) values for remaining backoff duration.
158 // But we actually serialize the remaining backoff duration as well, and
159 // don't allow the duration to increase beyond it's previous value during
160 // deserialization. Hence when the wall clock goes backwards the remaining
161 // backoff duration will be preserved.
162 EXPECT_EQ(original.GetTimeUntilRelease(),
163 deserialized->GetTimeUntilRelease());
164 // Since TimeTicks::Now() hasn't changed, the absolute release time ticks
165 // will be equal too in this particular case.
166 EXPECT_EQ(original.GetReleaseTime(), deserialized->GetReleaseTime());
167 }
168 }
169
170 } // namespace
171
172 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698