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

Side by Side Diff: net/http/broken_alternative_services_unittest.cc

Issue 2898983006: Fix and refactor HttpServerPropertiesImpl's alternative services brokenness expiration behavior (Closed)
Patch Set: Inlined all uses of BROKEN_ALT_SVC_EXPIRATION_DELAY. Unrolled loops to reduce logic in BrokenAltern… Created 3 years, 6 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 (c) 2017 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/http/broken_alternative_services.h"
6
7 #include <algorithm>
8 #include <vector>
9
10 #include "base/test/test_mock_time_task_runner.h"
11 #include "base/time/tick_clock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace net {
15
16 namespace {
17
18 class BrokenAlternativeServicesTest
19 : public BrokenAlternativeServices::Delegate,
20 public ::testing::Test {
21 public:
22 BrokenAlternativeServicesTest()
23 : test_task_runner_(new base::TestMockTimeTaskRunner()),
24 test_task_runner_context_(test_task_runner_),
25 broken_services_clock_(test_task_runner_->GetMockTickClock()),
26 broken_services_(this, broken_services_clock_.get()) {}
27
28 // BrokenAlternativeServices::Delegate implementation
29 void OnExpireBrokenAlternativeService(
30 const AlternativeService& expired_alternative_service) override {
31 expired_alt_svcs_.push_back(expired_alternative_service);
32 }
33
34 // All tests will run inside the scope of |test_task_runner_context_|, which
35 // means any task posted to the main message loop will run on
36 // |test_task_runner_|.
37 scoped_refptr<base::TestMockTimeTaskRunner> test_task_runner_;
38 base::TestMockTimeTaskRunner::ScopedContext test_task_runner_context_;
39
40 std::unique_ptr<base::TickClock> broken_services_clock_;
41 BrokenAlternativeServices broken_services_;
42
43 std::vector<AlternativeService> expired_alt_svcs_;
44 };
45
46 TEST_F(BrokenAlternativeServicesTest, MarkBroken) {
47 const AlternativeService alternative_service1(kProtoHTTP2, "foo", 443);
48 const AlternativeService alternative_service2(kProtoHTTP2, "foo", 1234);
49
50 EXPECT_FALSE(
51 broken_services_.IsAlternativeServiceBroken(alternative_service1));
52 EXPECT_FALSE(
53 broken_services_.IsAlternativeServiceBroken(alternative_service2));
54
55 broken_services_.MarkAlternativeServiceBroken(alternative_service1);
56
57 EXPECT_TRUE(
58 broken_services_.IsAlternativeServiceBroken(alternative_service1));
59 EXPECT_FALSE(
60 broken_services_.IsAlternativeServiceBroken(alternative_service2));
61
62 broken_services_.MarkAlternativeServiceBroken(alternative_service2);
63
64 EXPECT_TRUE(
65 broken_services_.IsAlternativeServiceBroken(alternative_service1));
66 EXPECT_TRUE(
67 broken_services_.IsAlternativeServiceBroken(alternative_service2));
68
69 broken_services_.ConfirmAlternativeService(alternative_service1);
70
71 EXPECT_FALSE(
72 broken_services_.IsAlternativeServiceBroken(alternative_service1));
73 EXPECT_TRUE(
74 broken_services_.IsAlternativeServiceBroken(alternative_service2));
75
76 broken_services_.ConfirmAlternativeService(alternative_service2);
77
78 EXPECT_FALSE(
79 broken_services_.IsAlternativeServiceBroken(alternative_service1));
80 EXPECT_FALSE(
81 broken_services_.IsAlternativeServiceBroken(alternative_service2));
82
83 EXPECT_EQ(0u, expired_alt_svcs_.size());
84 }
85
86 TEST_F(BrokenAlternativeServicesTest, MarkRecentlyBroken) {
87 const AlternativeService alternative_service(kProtoHTTP2, "foo", 443);
88
89 EXPECT_FALSE(
90 broken_services_.IsAlternativeServiceBroken(alternative_service));
91 EXPECT_FALSE(broken_services_.WasAlternativeServiceRecentlyBroken(
92 alternative_service));
93
94 broken_services_.MarkAlternativeServiceRecentlyBroken(alternative_service);
95 EXPECT_FALSE(
96 broken_services_.IsAlternativeServiceBroken(alternative_service));
97 EXPECT_TRUE(broken_services_.WasAlternativeServiceRecentlyBroken(
98 alternative_service));
99
100 broken_services_.ConfirmAlternativeService(alternative_service);
101 EXPECT_FALSE(
102 broken_services_.IsAlternativeServiceBroken(alternative_service));
103 EXPECT_FALSE(broken_services_.WasAlternativeServiceRecentlyBroken(
104 alternative_service));
105 }
106
107 TEST_F(BrokenAlternativeServicesTest, ExpireBrokenAlternateProtocolMappings) {
108 AlternativeService alternative_service(kProtoQUIC, "foo", 443);
109
110 broken_services_.MarkAlternativeServiceBroken(alternative_service);
111
112 // |broken_services_| should have posted task to expire the brokenness of
113 // |alternative_service|.
114 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
115
116 // Advance time until one time quantum before |alternative_service1|'s
117 // brokenness expires
118 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(5) -
119 base::TimeDelta::FromInternalValue(1));
120
121 // Ensure |alternative_service| is still marked broken.
122 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
123 EXPECT_EQ(0u, expired_alt_svcs_.size());
124 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
125
126 // Advance time by one time quantum
Zhongyi Shi 2017/05/31 18:54:15 nit: quantum.
wangyix1 2017/06/01 20:05:48 Done.
127 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
128
129 // Ensure |alternative_service| brokenness has expired but is still
130 // considered recently broken
131 EXPECT_FALSE(
132 broken_services_.IsAlternativeServiceBroken(alternative_service));
133 EXPECT_FALSE(test_task_runner_->HasPendingTask());
134 EXPECT_EQ(1u, expired_alt_svcs_.size());
135 EXPECT_EQ(alternative_service, expired_alt_svcs_[0]);
136 EXPECT_TRUE(broken_services_.WasAlternativeServiceRecentlyBroken(
137 alternative_service));
138 }
139
140 TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff) {
141 // Tests the exponential backoff of the computed expiration delay when an
142 // alt svc is marked broken. After being marked broken 10 times, the max
143 // expiration delay will have been reached and exponential backoff will no
144 // longer apply.
145
146 AlternativeService alternative_service(kProtoQUIC, "foo", 443);
147
148 broken_services_.MarkAlternativeServiceBroken(alternative_service);
149 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(5) -
150 base::TimeDelta::FromInternalValue(1));
151 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
152 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
153 EXPECT_FALSE(
154 broken_services_.IsAlternativeServiceBroken(alternative_service));
155
156 broken_services_.MarkAlternativeServiceBroken(alternative_service);
157 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) -
158 base::TimeDelta::FromInternalValue(1));
159 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
160 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
161 EXPECT_FALSE(
162 broken_services_.IsAlternativeServiceBroken(alternative_service));
163
164 broken_services_.MarkAlternativeServiceBroken(alternative_service);
165 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(20) -
166 base::TimeDelta::FromInternalValue(1));
167 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
168 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
169 EXPECT_FALSE(
170 broken_services_.IsAlternativeServiceBroken(alternative_service));
171
172 broken_services_.MarkAlternativeServiceBroken(alternative_service);
173 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(40) -
174 base::TimeDelta::FromInternalValue(1));
175 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
176 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
177 EXPECT_FALSE(
178 broken_services_.IsAlternativeServiceBroken(alternative_service));
179
180 broken_services_.MarkAlternativeServiceBroken(alternative_service);
181 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(80) -
182 base::TimeDelta::FromInternalValue(1));
183 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
184 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
185 EXPECT_FALSE(
186 broken_services_.IsAlternativeServiceBroken(alternative_service));
187
188 broken_services_.MarkAlternativeServiceBroken(alternative_service);
189 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(160) -
190 base::TimeDelta::FromInternalValue(1));
191 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
192 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
193 EXPECT_FALSE(
194 broken_services_.IsAlternativeServiceBroken(alternative_service));
195
196 broken_services_.MarkAlternativeServiceBroken(alternative_service);
197 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(320) -
198 base::TimeDelta::FromInternalValue(1));
199 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
200 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
201 EXPECT_FALSE(
202 broken_services_.IsAlternativeServiceBroken(alternative_service));
203
204 broken_services_.MarkAlternativeServiceBroken(alternative_service);
205 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(640) -
206 base::TimeDelta::FromInternalValue(1));
207 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
208 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
209 EXPECT_FALSE(
210 broken_services_.IsAlternativeServiceBroken(alternative_service));
211
212 broken_services_.MarkAlternativeServiceBroken(alternative_service);
213 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1280) -
214 base::TimeDelta::FromInternalValue(1));
215 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
216 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
217 EXPECT_FALSE(
218 broken_services_.IsAlternativeServiceBroken(alternative_service));
219
220 broken_services_.MarkAlternativeServiceBroken(alternative_service);
221 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2560) -
222 base::TimeDelta::FromInternalValue(1));
223 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
224 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
225 EXPECT_FALSE(
226 broken_services_.IsAlternativeServiceBroken(alternative_service));
227
228 // Max expiration delay has been reached; subsequent expiration delays from
229 // this point forward should not increase further.
230 broken_services_.MarkAlternativeServiceBroken(alternative_service);
231 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2560) -
232 base::TimeDelta::FromInternalValue(1));
233 EXPECT_TRUE(broken_services_.IsAlternativeServiceBroken(alternative_service));
234 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
235 EXPECT_FALSE(
236 broken_services_.IsAlternativeServiceBroken(alternative_service));
237 }
238
239 TEST_F(BrokenAlternativeServicesTest, RemoveExpiredBrokenAltSvc) {
240 // This test will mark broken an alternative service A that has already been
241 // marked broken many times, then immediately mark another alternative service
242 // B as broken for the first time. Because A's been marked broken many times
243 // already, its brokenness will be scheduled to expire much further in the
244 // future than B, even though it was marked broken before B. This test makes
245 // sure that even though A was marked broken before B, B's brokenness should
246 // expire before A.
247
248 AlternativeService alternative_service1(kProtoQUIC, "foo", 443);
249 AlternativeService alternative_service2(kProtoQUIC, "bar", 443);
250
251 // Repeately mark |alternative_service1| broken and let brokenness expire.
252 // Do this a few times.
253
254 broken_services_.MarkAlternativeServiceBroken(alternative_service1);
255 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
256 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(5));
257 EXPECT_EQ(1u, expired_alt_svcs_.size());
258 EXPECT_EQ(alternative_service1, expired_alt_svcs_.back());
259
260 broken_services_.MarkAlternativeServiceBroken(alternative_service1);
261 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
262 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10));
263 EXPECT_EQ(2u, expired_alt_svcs_.size());
264 EXPECT_EQ(alternative_service1, expired_alt_svcs_.back());
265
266 broken_services_.MarkAlternativeServiceBroken(alternative_service1);
267 EXPECT_EQ(1u, test_task_runner_->GetPendingTaskCount());
268 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(20));
269 EXPECT_EQ(3u, expired_alt_svcs_.size());
270 EXPECT_EQ(alternative_service1, expired_alt_svcs_.back());
271
272 expired_alt_svcs_.clear();
273
274 // Mark |alternative_service1| broken (will be given longer expiration delay),
275 // then mark |alternative_service2| broken (will be given shorter expiration
276 // delay).
277 broken_services_.MarkAlternativeServiceBroken(alternative_service1);
278 broken_services_.MarkAlternativeServiceBroken(alternative_service2);
279
280 EXPECT_TRUE(
281 broken_services_.IsAlternativeServiceBroken(alternative_service1));
282 EXPECT_TRUE(
283 broken_services_.IsAlternativeServiceBroken(alternative_service2));
284
285 // Advance time until one time quantum before |alternative_service2|'s
286 // brokenness expires.
287 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(5) -
288 base::TimeDelta::FromInternalValue(1));
289
290 EXPECT_TRUE(
291 broken_services_.IsAlternativeServiceBroken(alternative_service1));
292 EXPECT_TRUE(
293 broken_services_.IsAlternativeServiceBroken(alternative_service2));
294 EXPECT_EQ(0u, expired_alt_svcs_.size());
295
296 // Advance time by one time quantum. |alternative_service2| should no longer
297 // be broken.
298 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
299
300 EXPECT_TRUE(
301 broken_services_.IsAlternativeServiceBroken(alternative_service1));
302 EXPECT_FALSE(
303 broken_services_.IsAlternativeServiceBroken(alternative_service2));
304 EXPECT_EQ(1u, expired_alt_svcs_.size());
305 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]);
306
307 // Advance time until one time quantum before |alternative_service1|'s
308 // brokenness expires
309 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(40) -
310 base::TimeDelta::FromMinutes(5) -
311 base::TimeDelta::FromInternalValue(1));
312
313 EXPECT_TRUE(
314 broken_services_.IsAlternativeServiceBroken(alternative_service1));
315 EXPECT_FALSE(
316 broken_services_.IsAlternativeServiceBroken(alternative_service2));
317 EXPECT_EQ(1u, expired_alt_svcs_.size());
318 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]);
319
320 // Advance time by one time quantum. |alternative_service1| should no longer
321 // be broken.
322 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1));
323
324 EXPECT_FALSE(
325 broken_services_.IsAlternativeServiceBroken(alternative_service1));
326 EXPECT_FALSE(
327 broken_services_.IsAlternativeServiceBroken(alternative_service2));
328 EXPECT_EQ(2u, expired_alt_svcs_.size());
329 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]);
330 EXPECT_EQ(alternative_service1, expired_alt_svcs_[1]);
331 }
332
Zhongyi Shi 2017/05/31 18:54:14 Most of the tests currently schedule expiring task
wangyix1 2017/06/01 20:05:49 Done.
333 } // namespace
334
335 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698