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

Side by Side Diff: net/url_request/url_request_throttler_unittest.cc

Issue 6966038: Anti-DDoS enhancements: Log to net log, UMA stats, improved policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove NON_EXPORTED_BASE where not needed. Created 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/memory/scoped_ptr.h" 5 #include "base/memory/scoped_ptr.h"
6 #include "base/metrics/histogram.h"
6 #include "base/pickle.h" 7 #include "base/pickle.h"
7 #include "base/stringprintf.h" 8 #include "base/stringprintf.h"
8 #include "base/string_number_conversions.h" 9 #include "base/string_number_conversions.h"
9 #include "base/time.h" 10 #include "base/time.h"
10 #include "net/base/test_completion_callback.h" 11 #include "net/base/test_completion_callback.h"
11 #include "net/url_request/url_request_context.h" 12 #include "net/url_request/url_request_context.h"
12 #include "net/url_request/url_request_throttler_header_interface.h" 13 #include "net/url_request/url_request_throttler_header_interface.h"
13 #include "net/url_request/url_request_throttler_manager.h" 14 #include "net/url_request/url_request_throttler_manager.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 16
16 using base::TimeDelta; 17 using base::TimeDelta;
17 using base::TimeTicks; 18 using base::TimeTicks;
18 19
19 namespace net { 20 namespace net {
20 21
21 namespace { 22 namespace {
23
24 using base::Histogram;
25 using base::StatisticsRecorder;
26
22 class MockURLRequestThrottlerManager; 27 class MockURLRequestThrottlerManager;
23 28
24 class MockBackoffEntry : public BackoffEntry { 29 class MockBackoffEntry : public BackoffEntry {
25 public: 30 public:
26 explicit MockBackoffEntry(const BackoffEntry::Policy* const policy) 31 explicit MockBackoffEntry(const BackoffEntry::Policy* const policy)
27 : BackoffEntry(policy), fake_now_(TimeTicks()) { 32 : BackoffEntry(policy), fake_now_(TimeTicks()) {
28 } 33 }
29 34
30 virtual ~MockBackoffEntry() {} 35 virtual ~MockBackoffEntry() {}
31 36
32 TimeTicks GetTimeNow() const { 37 TimeTicks ImplGetTimeNow() const OVERRIDE {
yzshen1 2011/05/25 03:49:06 It might be good to add 'virtual'.
Jói 2011/05/25 14:30:35 Done.
33 return fake_now_; 38 return fake_now_;
34 } 39 }
35 40
36 void SetFakeNow(const TimeTicks& now) { 41 void SetFakeNow(const TimeTicks& now) {
37 fake_now_ = now; 42 fake_now_ = now;
38 } 43 }
39 44
40 private: 45 private:
41 TimeTicks fake_now_; 46 TimeTicks fake_now_;
42 }; 47 };
43 48
44 class MockURLRequestThrottlerEntry : public URLRequestThrottlerEntry { 49 class MockURLRequestThrottlerEntry : public URLRequestThrottlerEntry {
45 public : 50 public :
46 explicit MockURLRequestThrottlerEntry( 51 explicit MockURLRequestThrottlerEntry(
47 net::URLRequestThrottlerManager* manager) 52 net::URLRequestThrottlerManager* manager)
48 : net::URLRequestThrottlerEntry(manager), 53 : net::URLRequestThrottlerEntry(manager, ""),
49 mock_backoff_entry_(&backoff_policy_) { 54 mock_backoff_entry_(&backoff_policy_) {
50 InitPolicy(); 55 InitPolicy();
51 } 56 }
52 MockURLRequestThrottlerEntry( 57 MockURLRequestThrottlerEntry(
53 net::URLRequestThrottlerManager* manager, 58 net::URLRequestThrottlerManager* manager,
54 const TimeTicks& exponential_backoff_release_time, 59 const TimeTicks& exponential_backoff_release_time,
55 const TimeTicks& sliding_window_release_time, 60 const TimeTicks& sliding_window_release_time,
56 const TimeTicks& fake_now) 61 const TimeTicks& fake_now)
57 : net::URLRequestThrottlerEntry(manager), 62 : net::URLRequestThrottlerEntry(manager, ""),
58 fake_time_now_(fake_now), 63 fake_time_now_(fake_now),
59 mock_backoff_entry_(&backoff_policy_) { 64 mock_backoff_entry_(&backoff_policy_) {
60 InitPolicy(); 65 InitPolicy();
61 66
62 mock_backoff_entry_.SetFakeNow(fake_now); 67 mock_backoff_entry_.SetFakeNow(fake_now);
63 set_exponential_backoff_release_time(exponential_backoff_release_time); 68 set_exponential_backoff_release_time(exponential_backoff_release_time);
64 set_sliding_window_release_time(sliding_window_release_time); 69 set_sliding_window_release_time(sliding_window_release_time);
65 } 70 }
66 virtual ~MockURLRequestThrottlerEntry() {} 71 virtual ~MockURLRequestThrottlerEntry() {}
67 72
(...skipping 11 matching lines...) Expand all
79 } 84 }
80 85
81 BackoffEntry* GetBackoffEntry() { 86 BackoffEntry* GetBackoffEntry() {
82 return &mock_backoff_entry_; 87 return &mock_backoff_entry_;
83 } 88 }
84 89
85 void ResetToBlank(const TimeTicks& time_now) { 90 void ResetToBlank(const TimeTicks& time_now) {
86 fake_time_now_ = time_now; 91 fake_time_now_ = time_now;
87 mock_backoff_entry_.SetFakeNow(time_now); 92 mock_backoff_entry_.SetFakeNow(time_now);
88 93
89 GetBackoffEntry()->InformOfRequest(true); // Sets failure count to 0. 94 GetBackoffEntry()->Reset();
90 GetBackoffEntry()->SetCustomReleaseTime(time_now); 95 GetBackoffEntry()->SetCustomReleaseTime(time_now);
91 set_sliding_window_release_time(time_now); 96 set_sliding_window_release_time(time_now);
92 } 97 }
93 98
94 // Overridden for tests. 99 // Overridden for tests.
95 virtual TimeTicks GetTimeNow() const { return fake_time_now_; } 100 virtual TimeTicks ImplGetTimeNow() const OVERRIDE { return fake_time_now_; }
96 101
97 void set_exponential_backoff_release_time( 102 void set_exponential_backoff_release_time(
98 const base::TimeTicks& release_time) { 103 const base::TimeTicks& release_time) {
99 GetBackoffEntry()->SetCustomReleaseTime(release_time); 104 GetBackoffEntry()->SetCustomReleaseTime(release_time);
100 } 105 }
101 106
102 base::TimeTicks sliding_window_release_time() const { 107 base::TimeTicks sliding_window_release_time() const {
103 return URLRequestThrottlerEntry::sliding_window_release_time(); 108 return URLRequestThrottlerEntry::sliding_window_release_time();
104 } 109 }
105 110
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 GURL url; 217 GURL url;
213 std::string result; 218 std::string result;
214 int line; 219 int line;
215 }; 220 };
216 221
217 } // namespace 222 } // namespace
218 223
219 class URLRequestThrottlerEntryTest : public testing::Test { 224 class URLRequestThrottlerEntryTest : public testing::Test {
220 protected: 225 protected:
221 virtual void SetUp(); 226 virtual void SetUp();
227
228 // After calling this function, histogram snapshots in |samples_| contain
229 // only the delta caused by the test case currently running.
230 void CalculateHistogramDeltas();
231
222 TimeTicks now_; 232 TimeTicks now_;
223 MockURLRequestThrottlerManager manager_; // Dummy object, not used. 233 MockURLRequestThrottlerManager manager_; // Dummy object, not used.
224 scoped_refptr<MockURLRequestThrottlerEntry> entry_; 234 scoped_refptr<MockURLRequestThrottlerEntry> entry_;
235
236 std::map<std::string, Histogram::SampleSet> original_samples_;
237 std::map<std::string, Histogram::SampleSet> samples_;
238 };
239
240 // List of all histograms we care about in these unit tests.
241 const char* kHistogramNames[] = {
242 "Throttling.CustomRetryAfterMs",
243 "Throttling.FailureCountAtSuccess",
244 "Throttling.HttpResponseCode",
245 "Throttling.PerceivedDowntime",
246 "Throttling.RequestThrottled",
247 "Throttling.SiteOptedOut",
225 }; 248 };
226 249
227 void URLRequestThrottlerEntryTest::SetUp() { 250 void URLRequestThrottlerEntryTest::SetUp() {
228 now_ = TimeTicks::Now(); 251 now_ = TimeTicks::Now();
229 entry_ = new MockURLRequestThrottlerEntry(&manager_); 252 entry_ = new MockURLRequestThrottlerEntry(&manager_);
230 entry_->ResetToBlank(now_); 253 entry_->ResetToBlank(now_);
254
255 for (size_t i = 0; i < arraysize(kHistogramNames); ++i) {
256 // Must retrieve original samples for each histogram for comparison
257 // as other tests may affect them.
258 const char* name = kHistogramNames[i];
259 Histogram::SampleSet& original = original_samples_[name];
260 Histogram* histogram;
261 if (StatisticsRecorder::FindHistogram(name, &histogram)) {
262 histogram->SnapshotSample(&original);
263 }
264 }
265 }
266
267 void URLRequestThrottlerEntryTest::CalculateHistogramDeltas() {
268 for (size_t i = 0; i < arraysize(kHistogramNames); ++i) {
269 const char* name = kHistogramNames[i];
270 Histogram::SampleSet& original = original_samples_[name];
271 Histogram::SampleSet& sample = samples_[name];
272
273 Histogram* histogram;
274 if (StatisticsRecorder::FindHistogram(name, &histogram)) {
275 ASSERT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags());
276
277 histogram->SnapshotSample(&sample);
278 // Ensure |original| size is same as |sample|, then subtract original
279 // values.
280 original.Resize(*histogram);
281 sample.Subtract(original);
282 }
283 }
284
285 // Ensure we don't accidentally use the originals in our tests.
286 original_samples_.clear();
231 } 287 }
232 288
233 std::ostream& operator<<(std::ostream& out, const base::TimeTicks& time) { 289 std::ostream& operator<<(std::ostream& out, const base::TimeTicks& time) {
234 return out << time.ToInternalValue(); 290 return out << time.ToInternalValue();
235 } 291 }
236 292
237 TEST_F(URLRequestThrottlerEntryTest, InterfaceDuringExponentialBackoff) { 293 TEST_F(URLRequestThrottlerEntryTest, InterfaceDuringExponentialBackoff) {
238 entry_->set_exponential_backoff_release_time( 294 entry_->set_exponential_backoff_release_time(
239 entry_->fake_time_now_ + TimeDelta::FromMilliseconds(1)); 295 entry_->fake_time_now_ + TimeDelta::FromMilliseconds(1));
240 EXPECT_TRUE(entry_->IsDuringExponentialBackoff()); 296 EXPECT_TRUE(entry_->IsDuringExponentialBackoff());
297
298 CalculateHistogramDeltas();
299 ASSERT_EQ(0, samples_["Throttling.RequestThrottled"].counts(0));
300 ASSERT_EQ(1, samples_["Throttling.RequestThrottled"].counts(1));
241 } 301 }
242 302
243 TEST_F(URLRequestThrottlerEntryTest, InterfaceNotDuringExponentialBackoff) { 303 TEST_F(URLRequestThrottlerEntryTest, InterfaceNotDuringExponentialBackoff) {
244 entry_->set_exponential_backoff_release_time(entry_->fake_time_now_); 304 entry_->set_exponential_backoff_release_time(entry_->fake_time_now_);
245 EXPECT_FALSE(entry_->IsDuringExponentialBackoff()); 305 EXPECT_FALSE(entry_->IsDuringExponentialBackoff());
246 entry_->set_exponential_backoff_release_time( 306 entry_->set_exponential_backoff_release_time(
247 entry_->fake_time_now_ - TimeDelta::FromMilliseconds(1)); 307 entry_->fake_time_now_ - TimeDelta::FromMilliseconds(1));
248 EXPECT_FALSE(entry_->IsDuringExponentialBackoff()); 308 EXPECT_FALSE(entry_->IsDuringExponentialBackoff());
309
310 CalculateHistogramDeltas();
311 ASSERT_EQ(2, samples_["Throttling.RequestThrottled"].counts(0));
312 ASSERT_EQ(0, samples_["Throttling.RequestThrottled"].counts(1));
249 } 313 }
250 314
251 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateRetryAfter) { 315 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateRetryAfter) {
252 // If the response we received has a retry-after field, 316 // If the response we received has a retry-after field,
253 // the request should be delayed. 317 // the request should be delayed.
254 MockURLRequestThrottlerHeaderAdapter header_w_delay_header("5.5", "", 200); 318 MockURLRequestThrottlerHeaderAdapter header_w_delay_header("5.5", "", 200);
255 entry_->UpdateWithResponse("", &header_w_delay_header); 319 entry_->UpdateWithResponse("", &header_w_delay_header);
256 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_) 320 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_)
257 << "When the server put a positive value in retry-after we should " 321 << "When the server put a positive value in retry-after we should "
258 "increase release_time"; 322 "increase release_time";
259 323
260 entry_->ResetToBlank(now_); 324 entry_->ResetToBlank(now_);
261 header_w_delay_header.fake_retry_value_ = "-5.5";
262 EXPECT_EQ(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_) 325 EXPECT_EQ(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_)
263 << "When given a negative value, it should not change the release_time"; 326 << "When given a negative value, it should not change the release_time";
yzshen1 2011/05/25 03:49:06 Please also update the string.
Jói 2011/05/25 14:30:35 This was incorrect, I've fixed it now (the call to
327
328 CalculateHistogramDeltas();
329 ASSERT_EQ(1, samples_["Throttling.CustomRetryAfterMs"].TotalCount());
264 } 330 }
265 331
266 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateFailure) { 332 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateFailure) {
267 MockURLRequestThrottlerHeaderAdapter failure_response(505); 333 MockURLRequestThrottlerHeaderAdapter failure_response(503);
268 entry_->UpdateWithResponse("", &failure_response); 334 entry_->UpdateWithResponse("", &failure_response);
269 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_) 335 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_)
270 << "A failure should increase the release_time"; 336 << "A failure should increase the release_time";
271 } 337 }
272 338
273 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateSuccess) { 339 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateSuccess) {
274 MockURLRequestThrottlerHeaderAdapter success_response(200); 340 MockURLRequestThrottlerHeaderAdapter success_response(200);
275 entry_->UpdateWithResponse("", &success_response); 341 entry_->UpdateWithResponse("", &success_response);
276 EXPECT_EQ(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_) 342 EXPECT_EQ(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_)
277 << "A success should not add any delay"; 343 << "A success should not add any delay";
278 } 344 }
279 345
280 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateSuccessThenFailure) { 346 TEST_F(URLRequestThrottlerEntryTest, InterfaceUpdateSuccessThenFailure) {
281 MockURLRequestThrottlerHeaderAdapter failure_response(500); 347 MockURLRequestThrottlerHeaderAdapter failure_response(503);
282 MockURLRequestThrottlerHeaderAdapter success_response(200); 348 MockURLRequestThrottlerHeaderAdapter success_response(200);
283 entry_->UpdateWithResponse("", &success_response); 349 entry_->UpdateWithResponse("", &success_response);
284 entry_->UpdateWithResponse("", &failure_response); 350 entry_->UpdateWithResponse("", &failure_response);
285 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_) 351 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), entry_->fake_time_now_)
286 << "This scenario should add delay"; 352 << "This scenario should add delay";
353 entry_->UpdateWithResponse("", &success_response);
354
355 CalculateHistogramDeltas();
356 ASSERT_EQ(1, samples_["Throttling.HttpResponseCode"].counts(503));
357 ASSERT_EQ(2, samples_["Throttling.HttpResponseCode"].counts(200));
358 ASSERT_EQ(1, samples_["Throttling.FailureCountAtSuccess"].counts(1));
359 ASSERT_EQ(1, samples_["Throttling.PerceivedDowntime"].TotalCount());
287 } 360 }
288 361
289 TEST_F(URLRequestThrottlerEntryTest, IsEntryReallyOutdated) { 362 TEST_F(URLRequestThrottlerEntryTest, IsEntryReallyOutdated) {
290 TimeDelta lifetime = TimeDelta::FromMilliseconds( 363 TimeDelta lifetime = TimeDelta::FromMilliseconds(
291 MockURLRequestThrottlerEntry::kDefaultEntryLifetimeMs); 364 MockURLRequestThrottlerEntry::kDefaultEntryLifetimeMs);
292 const TimeDelta kFiveMs = TimeDelta::FromMilliseconds(5); 365 const TimeDelta kFiveMs = TimeDelta::FromMilliseconds(5);
293 366
294 TimeAndBool test_values[] = { 367 TimeAndBool test_values[] = {
295 TimeAndBool(now_, false, __LINE__), 368 TimeAndBool(now_, false, __LINE__),
296 TimeAndBool(now_ - kFiveMs, false, __LINE__), 369 TimeAndBool(now_ - kFiveMs, false, __LINE__),
297 TimeAndBool(now_ + kFiveMs, false, __LINE__), 370 TimeAndBool(now_ + kFiveMs, false, __LINE__),
298 TimeAndBool(now_ - (lifetime - kFiveMs), false, __LINE__), 371 TimeAndBool(now_ - (lifetime - kFiveMs), false, __LINE__),
299 TimeAndBool(now_ - lifetime, true, __LINE__), 372 TimeAndBool(now_ - lifetime, true, __LINE__),
300 TimeAndBool(now_ - (lifetime + kFiveMs), true, __LINE__)}; 373 TimeAndBool(now_ - (lifetime + kFiveMs), true, __LINE__)};
301 374
302 for (unsigned int i = 0; i < arraysize(test_values); ++i) { 375 for (unsigned int i = 0; i < arraysize(test_values); ++i) {
303 entry_->set_exponential_backoff_release_time(test_values[i].time); 376 entry_->set_exponential_backoff_release_time(test_values[i].time);
304 EXPECT_EQ(entry_->IsEntryOutdated(), test_values[i].result) << 377 EXPECT_EQ(entry_->IsEntryOutdated(), test_values[i].result) <<
305 "Test case #" << i << " line " << test_values[i].line << " failed"; 378 "Test case #" << i << " line " << test_values[i].line << " failed";
306 } 379 }
307 } 380 }
308 381
309 TEST_F(URLRequestThrottlerEntryTest, MaxAllowedBackoff) { 382 TEST_F(URLRequestThrottlerEntryTest, MaxAllowedBackoff) {
310 for (int i = 0; i < 30; ++i) { 383 for (int i = 0; i < 30; ++i) {
311 MockURLRequestThrottlerHeaderAdapter response_adapter(505); 384 MockURLRequestThrottlerHeaderAdapter response_adapter(503);
312 entry_->UpdateWithResponse("", &response_adapter); 385 entry_->UpdateWithResponse("", &response_adapter);
313 } 386 }
314 387
315 TimeDelta delay = entry_->GetExponentialBackoffReleaseTime() - now_; 388 TimeDelta delay = entry_->GetExponentialBackoffReleaseTime() - now_;
316 EXPECT_EQ(delay.InMilliseconds(), 389 EXPECT_EQ(delay.InMilliseconds(),
317 MockURLRequestThrottlerEntry::kDefaultMaximumBackoffMs); 390 MockURLRequestThrottlerEntry::kDefaultMaximumBackoffMs);
318 } 391 }
319 392
320 TEST_F(URLRequestThrottlerEntryTest, MalformedContent) { 393 TEST_F(URLRequestThrottlerEntryTest, MalformedContent) {
321 MockURLRequestThrottlerHeaderAdapter response_adapter(505); 394 MockURLRequestThrottlerHeaderAdapter response_adapter(503);
322 for (int i = 0; i < 5; ++i) 395 for (int i = 0; i < 5; ++i)
323 entry_->UpdateWithResponse("", &response_adapter); 396 entry_->UpdateWithResponse("", &response_adapter);
324 397
325 TimeTicks release_after_failures = entry_->GetExponentialBackoffReleaseTime(); 398 TimeTicks release_after_failures = entry_->GetExponentialBackoffReleaseTime();
326 399
327 // Inform the entry that a response body was malformed, which is supposed to 400 // Inform the entry that a response body was malformed, which is supposed to
328 // increase the back-off time. Note that we also submit a successful 401 // increase the back-off time. Note that we also submit a successful
329 // UpdateWithResponse to pair with ReceivedContentWasMalformed() since that 402 // UpdateWithResponse to pair with ReceivedContentWasMalformed() since that
330 // is what happens in practice (if a body is received, then a non-500 403 // is what happens in practice (if a body is received, then a non-500
331 // response must also have been received). 404 // response must also have been received).
332 entry_->ReceivedContentWasMalformed(); 405 entry_->ReceivedContentWasMalformed(200);
333 MockURLRequestThrottlerHeaderAdapter success_adapter(200); 406 MockURLRequestThrottlerHeaderAdapter success_adapter(200);
334 entry_->UpdateWithResponse("", &success_adapter); 407 entry_->UpdateWithResponse("", &success_adapter);
335 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), release_after_failures); 408 EXPECT_GT(entry_->GetExponentialBackoffReleaseTime(), release_after_failures);
336 } 409 }
337 410
338 TEST_F(URLRequestThrottlerEntryTest, SlidingWindow) { 411 TEST_F(URLRequestThrottlerEntryTest, SlidingWindow) {
339 int max_send = URLRequestThrottlerEntry::kDefaultMaxSendThreshold; 412 int max_send = URLRequestThrottlerEntry::kDefaultMaxSendThreshold;
340 int sliding_window = 413 int sliding_window =
341 URLRequestThrottlerEntry::kDefaultSlidingWindowPeriodMs; 414 URLRequestThrottlerEntry::kDefaultSlidingWindowPeriodMs;
342 415
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 __LINE__), 452 __LINE__),
380 GurlAndString(GURL("http://www.example.com/0/token/false"), 453 GurlAndString(GURL("http://www.example.com/0/token/false"),
381 std::string("http://www.example.com/0/token/false"), 454 std::string("http://www.example.com/0/token/false"),
382 __LINE__), 455 __LINE__),
383 GurlAndString(GURL("http://www.example.com/index.php?code=javascript"), 456 GurlAndString(GURL("http://www.example.com/index.php?code=javascript"),
384 std::string("http://www.example.com/index.php"), 457 std::string("http://www.example.com/index.php"),
385 __LINE__), 458 __LINE__),
386 GurlAndString(GURL("http://www.example.com/index.php?code=1#superEntry"), 459 GurlAndString(GURL("http://www.example.com/index.php?code=1#superEntry"),
387 std::string("http://www.example.com/index.php"), 460 std::string("http://www.example.com/index.php"),
388 __LINE__), 461 __LINE__),
462 GurlAndString(GURL("http://www.example.com/index.php#superEntry"),
463 std::string("http://www.example.com/index.php"),
464 __LINE__),
389 GurlAndString(GURL("http://www.example.com:1234/"), 465 GurlAndString(GURL("http://www.example.com:1234/"),
390 std::string("http://www.example.com:1234/"), 466 std::string("http://www.example.com:1234/"),
391 __LINE__)}; 467 __LINE__)};
392 468
393 for (unsigned int i = 0; i < arraysize(test_values); ++i) { 469 for (unsigned int i = 0; i < arraysize(test_values); ++i) {
394 std::string temp = manager.DoGetUrlIdFromUrl(test_values[i].url); 470 std::string temp = manager.DoGetUrlIdFromUrl(test_values[i].url);
395 EXPECT_EQ(temp, test_values[i].result) << 471 EXPECT_EQ(temp, test_values[i].result) <<
396 "Test case #" << i << " line " << test_values[i].line << " failed"; 472 "Test case #" << i << " line " << test_values[i].line << " failed";
397 } 473 }
398 } 474 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 MockURLRequestThrottlerHeaderAdapter wrong_adapter("", "yesplease", 200); 554 MockURLRequestThrottlerHeaderAdapter wrong_adapter("", "yesplease", 200);
479 no_opt_out_entry->UpdateWithResponse("www.nike.com", &wrong_adapter); 555 no_opt_out_entry->UpdateWithResponse("www.nike.com", &wrong_adapter);
480 ExpectEntryAllowsAllOnErrorIfOptedOut(no_opt_out_entry, false); 556 ExpectEntryAllowsAllOnErrorIfOptedOut(no_opt_out_entry, false);
481 557
482 // A localhost entry should always be opted out. 558 // A localhost entry should always be opted out.
483 scoped_refptr<net::URLRequestThrottlerEntryInterface> localhost_entry = 559 scoped_refptr<net::URLRequestThrottlerEntryInterface> localhost_entry =
484 manager.RegisterRequestUrl(GURL("http://localhost/hello")); 560 manager.RegisterRequestUrl(GURL("http://localhost/hello"));
485 ExpectEntryAllowsAllOnErrorIfOptedOut(localhost_entry, true); 561 ExpectEntryAllowsAllOnErrorIfOptedOut(localhost_entry, true);
486 } 562 }
487 563
564 TEST(URLRequestThrottlerManager, ClearOnNetworkChange) {
565 for (int i = 0; i < 3; ++i) {
566 MockURLRequestThrottlerManager manager;
567 scoped_refptr<net::URLRequestThrottlerEntryInterface> entry_before =
568 manager.RegisterRequestUrl(GURL("http://www.example.com/"));
569 MockURLRequestThrottlerHeaderAdapter failure_adapter(503);
570 for (int j = 0; j < 10; ++j) {
571 // Host doesn't really matter in this scenario so we skip it.
572 entry_before->UpdateWithResponse("", &failure_adapter);
573 }
574 EXPECT_TRUE(entry_before->IsDuringExponentialBackoff());
575
576 switch (i) {
577 case 0:
578 manager.OnIPAddressChanged();
579 break;
580 case 1:
581 manager.OnOnlineStateChanged(true);
582 break;
583 case 2:
584 manager.OnOnlineStateChanged(false);
585 break;
586 default:
587 FAIL();
588 }
589
590 scoped_refptr<net::URLRequestThrottlerEntryInterface> entry_after =
591 manager.RegisterRequestUrl(GURL("http://www.example.com/"));
592 EXPECT_FALSE(entry_after->IsDuringExponentialBackoff());
593 }
594 }
595
488 } // namespace net 596 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698