OLD | NEW |
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 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 | 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 "net/http/broken_alternative_services.h" | 5 #include "net/http/broken_alternative_services.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/test/test_mock_time_task_runner.h" | 10 #include "base/test/test_mock_time_task_runner.h" |
11 #include "base/time/tick_clock.h" | 11 #include "base/time/tick_clock.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 | 13 |
14 namespace net { | 14 namespace net { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 class BrokenAlternativeServicesTest | 18 class BrokenAlternativeServicesTest |
19 : public BrokenAlternativeServices::Delegate, | 19 : public BrokenAlternativeServices::Delegate, |
20 public ::testing::Test { | 20 public ::testing::Test { |
21 public: | 21 public: |
22 BrokenAlternativeServicesTest() | 22 BrokenAlternativeServicesTest() |
23 : test_task_runner_(new base::TestMockTimeTaskRunner()), | 23 : test_task_runner_(new base::TestMockTimeTaskRunner()), |
24 test_task_runner_context_(test_task_runner_), | 24 test_task_runner_context_(test_task_runner_), |
25 broken_services_clock_(test_task_runner_->GetMockTickClock()), | 25 broken_services_clock_(test_task_runner_->GetMockTickClock()), |
26 broken_services_(this, broken_services_clock_.get()) {} | 26 broken_services_(this) { |
| 27 broken_services_.SetTickClockForTesting(broken_services_clock_.get()); |
| 28 } |
27 | 29 |
28 // BrokenAlternativeServices::Delegate implementation | 30 // BrokenAlternativeServices::Delegate implementation |
29 void OnExpireBrokenAlternativeService( | 31 void OnExpireBrokenAlternativeService( |
30 const AlternativeService& expired_alternative_service) override { | 32 const AlternativeService& expired_alternative_service) override { |
31 expired_alt_svcs_.push_back(expired_alternative_service); | 33 expired_alt_svcs_.push_back(expired_alternative_service); |
32 } | 34 } |
33 | 35 |
34 // All tests will run inside the scope of |test_task_runner_context_|, which | 36 // 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 | 37 // means any task posted to the main message loop will run on |
36 // |test_task_runner_|. | 38 // |test_task_runner_|. |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 403 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
402 EXPECT_FALSE( | 404 EXPECT_FALSE( |
403 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 405 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
404 } | 406 } |
405 | 407 |
406 TEST_F(BrokenAlternativeServicesTest, AddBrokenAlternativeServicesToExisting) { | 408 TEST_F(BrokenAlternativeServicesTest, AddBrokenAlternativeServicesToExisting) { |
407 AlternativeService alternative_service1(kProtoQUIC, "foo1", 443); | 409 AlternativeService alternative_service1(kProtoQUIC, "foo1", 443); |
408 AlternativeService alternative_service2(kProtoQUIC, "foo2", 443); | 410 AlternativeService alternative_service2(kProtoQUIC, "foo2", 443); |
409 AlternativeService alternative_service3(kProtoQUIC, "foo3", 443); | 411 AlternativeService alternative_service3(kProtoQUIC, "foo3", 443); |
410 | 412 |
411 base::TimeDelta delay1 = base::TimeDelta::FromMinutes(1); | |
412 base::TimeDelta delay3 = base::TimeDelta::FromMinutes(3); | |
413 | |
414 std::unique_ptr<BrokenAlternativeServiceList> broken_list = | 413 std::unique_ptr<BrokenAlternativeServiceList> broken_list = |
415 base::MakeUnique<BrokenAlternativeServiceList>(); | 414 base::MakeUnique<BrokenAlternativeServiceList>(); |
416 broken_list->push_back( | 415 broken_list->push_back( |
417 {alternative_service3, broken_services_clock_->NowTicks() + delay3}); | 416 {alternative_service3, |
| 417 broken_services_clock_->NowTicks() + base::TimeDelta::FromMinutes(1)}); |
418 broken_list->push_back( | 418 broken_list->push_back( |
419 {alternative_service1, broken_services_clock_->NowTicks() + delay1}); | 419 {alternative_service1, |
| 420 broken_services_clock_->NowTicks() + base::TimeDelta::FromMinutes(3)}); |
420 | 421 |
421 std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map = | 422 std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map = |
422 base::MakeUnique<RecentlyBrokenAlternativeServices>( | 423 base::MakeUnique<RecentlyBrokenAlternativeServices>( |
423 RecentlyBrokenAlternativeServices::NO_AUTO_EVICT); | 424 RecentlyBrokenAlternativeServices::NO_AUTO_EVICT); |
424 recently_broken_map->Put(alternative_service1, 1); | 425 recently_broken_map->Put(alternative_service1, 1); |
425 recently_broken_map->Put(alternative_service3, 1); | 426 recently_broken_map->Put(alternative_service3, 1); |
426 | 427 |
427 broken_services_.MarkAlternativeServiceBroken(alternative_service1); | 428 broken_services_.MarkAlternativeServiceBroken(alternative_service1); |
428 broken_services_.MarkAlternativeServiceBroken(alternative_service2); | 429 broken_services_.MarkAlternativeServiceBroken(alternative_service2); |
429 | 430 |
430 // At this point, |alternative_service1| and |alternative_service2| are marked | 431 // At this point, |alternative_service1| and |alternative_service2| are marked |
431 // broken and should expire in 5 minutes. | 432 // broken and should expire in 5 minutes. |
432 // Adding |broken_list| should additionally mark |alternative_service3| | 433 // Adding |broken_list| should overwrite |alternative_service1|'s expiration |
433 // broken and should expire in 3 minute. Even though |broken_list| contains | 434 // time to 3 minutes, and additionally mark |alternative_service3| |
434 // |alternative_service1|, its expiration time should not change since it was | 435 // broken with an expiration time of 1 minute. |
435 // already marked broken. | |
436 broken_services_.AddBrokenAndRecentlyBrokenAlternativeServices( | 436 broken_services_.AddBrokenAndRecentlyBrokenAlternativeServices( |
437 std::move(broken_list), std::move(recently_broken_map)); | 437 std::move(broken_list), std::move(recently_broken_map)); |
438 | 438 |
439 EXPECT_TRUE( | 439 EXPECT_TRUE( |
440 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 440 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
441 EXPECT_TRUE( | 441 EXPECT_TRUE( |
442 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 442 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
443 EXPECT_TRUE( | 443 EXPECT_TRUE( |
444 broken_services_.IsAlternativeServiceBroken(alternative_service3)); | 444 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
445 | 445 |
446 // Make sure |alternative_service3|'s brokenness expires in 3 minutes. | 446 // Make sure |alternative_service3|'s brokenness expires in 1 minute. |
447 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(3) - | 447 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1) - |
448 base::TimeDelta::FromInternalValue(1)); | 448 base::TimeDelta::FromInternalValue(1)); |
449 EXPECT_TRUE( | 449 EXPECT_TRUE( |
450 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 450 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
451 EXPECT_TRUE( | 451 EXPECT_TRUE( |
452 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 452 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
453 EXPECT_TRUE( | 453 EXPECT_TRUE( |
454 broken_services_.IsAlternativeServiceBroken(alternative_service3)); | 454 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
455 | 455 |
456 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); | 456 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
457 EXPECT_TRUE( | 457 EXPECT_TRUE( |
458 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 458 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
459 EXPECT_TRUE( | 459 EXPECT_TRUE( |
460 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 460 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
461 EXPECT_FALSE( | 461 EXPECT_FALSE( |
462 broken_services_.IsAlternativeServiceBroken(alternative_service3)); | 462 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
463 | 463 |
464 // Make sure |alternative_service1| and |alternative_service2|'s brokenness | 464 // Make sure |alternative_service1|'s brokenness expires in 2 more minutes. |
465 // expire in 2 more minutes. | |
466 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2) - | 465 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2) - |
467 base::TimeDelta::FromInternalValue(1)); | 466 base::TimeDelta::FromInternalValue(1)); |
468 EXPECT_TRUE( | 467 EXPECT_TRUE( |
469 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 468 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
470 EXPECT_TRUE( | 469 EXPECT_TRUE( |
471 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 470 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
472 EXPECT_FALSE( | 471 EXPECT_FALSE( |
473 broken_services_.IsAlternativeServiceBroken(alternative_service3)); | 472 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
474 | 473 |
475 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); | 474 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
476 EXPECT_FALSE( | 475 EXPECT_FALSE( |
477 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 476 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 477 EXPECT_TRUE( |
| 478 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 479 EXPECT_FALSE( |
| 480 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 481 |
| 482 // Make sure |alternative_service2|'s brokenness expires in 2 more minutes. |
| 483 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2) - |
| 484 base::TimeDelta::FromInternalValue(1)); |
| 485 EXPECT_FALSE( |
| 486 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 487 EXPECT_TRUE( |
| 488 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 489 EXPECT_FALSE( |
| 490 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 491 |
| 492 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 493 EXPECT_FALSE( |
| 494 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
478 EXPECT_FALSE( | 495 EXPECT_FALSE( |
479 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 496 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
480 EXPECT_FALSE( | 497 EXPECT_FALSE( |
481 broken_services_.IsAlternativeServiceBroken(alternative_service3)); | 498 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
482 | 499 |
483 // Make sure recently broken alternative services are in most-recently-used | 500 // Make sure recently broken alternative services are in most-recently-used |
484 // order. AddBrokenAndRecentlyBrokenAlternativeServices() will add | 501 // order. AddBrokenAndRecentlyBrokenAlternativeServices() will add |
485 // entries in |recently_broken_map| (that aren't already marked recently | 502 // entries in |recently_broken_map| (that aren't already marked recently |
486 // broken in |broken_services_|) to the back of |broken_services_|'s | 503 // broken in |broken_services_|) to the back of |broken_services_|'s |
487 // recency list; in this case, only |alternative_service3| is added as | 504 // recency list; in this case, only |alternative_service3| is added as |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 538 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
522 | 539 |
523 // Make sure an expiration task has been scheduled for expiring the brokenness | 540 // Make sure an expiration task has been scheduled for expiring the brokenness |
524 // of |alternative_service1|. | 541 // of |alternative_service1|. |
525 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 542 EXPECT_TRUE(test_task_runner_->HasPendingTask()); |
526 } | 543 } |
527 | 544 |
528 } // namespace | 545 } // namespace |
529 | 546 |
530 } // namespace net | 547 } // namespace net |
OLD | NEW |