| 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 |