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" |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 | 323 |
324 EXPECT_FALSE( | 324 EXPECT_FALSE( |
325 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 325 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
326 EXPECT_FALSE( | 326 EXPECT_FALSE( |
327 broken_services_.IsAlternativeServiceBroken(alternative_service2)); | 327 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
328 EXPECT_EQ(2u, expired_alt_svcs_.size()); | 328 EXPECT_EQ(2u, expired_alt_svcs_.size()); |
329 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]); | 329 EXPECT_EQ(alternative_service2, expired_alt_svcs_[0]); |
330 EXPECT_EQ(alternative_service1, expired_alt_svcs_[1]); | 330 EXPECT_EQ(alternative_service1, expired_alt_svcs_[1]); |
331 } | 331 } |
332 | 332 |
| 333 TEST_F(BrokenAlternativeServicesTest, AddBrokenAlternativeServices) { |
| 334 AlternativeService alternative_service1(kProtoQUIC, "foo1", 443); |
| 335 AlternativeService alternative_service2(kProtoQUIC, "foo2", 443); |
| 336 |
| 337 base::TimeDelta delay1 = base::TimeDelta::FromMinutes(1); |
| 338 |
| 339 std::unique_ptr<BrokenAlternativeServiceList> broken_list = |
| 340 base::MakeUnique<BrokenAlternativeServiceList>(); |
| 341 broken_list->push_back( |
| 342 {alternative_service1, broken_services_clock_->NowTicks() + delay1}); |
| 343 |
| 344 std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map = |
| 345 base::MakeUnique<RecentlyBrokenAlternativeServices>( |
| 346 RecentlyBrokenAlternativeServices::NO_AUTO_EVICT); |
| 347 recently_broken_map->Put(alternative_service1, 1); |
| 348 recently_broken_map->Put(alternative_service2, 2); |
| 349 |
| 350 broken_services_.AddBrokenAndRecentlyBrokenAlternativeServices( |
| 351 std::move(broken_list), std::move(recently_broken_map)); |
| 352 |
| 353 EXPECT_TRUE( |
| 354 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 355 EXPECT_FALSE( |
| 356 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 357 |
| 358 EXPECT_TRUE(broken_services_.WasAlternativeServiceRecentlyBroken( |
| 359 alternative_service1)); |
| 360 EXPECT_TRUE(broken_services_.WasAlternativeServiceRecentlyBroken( |
| 361 alternative_service2)); |
| 362 |
| 363 // Make sure |alternative_service1| expires after the delay in |broken_list|. |
| 364 test_task_runner_->FastForwardBy(delay1 - |
| 365 base::TimeDelta::FromInternalValue(1)); |
| 366 EXPECT_TRUE( |
| 367 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 368 |
| 369 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 370 EXPECT_FALSE( |
| 371 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 372 |
| 373 // Make sure the broken counts in |recently_broken_map| translate to the |
| 374 // correct expiration delays if the alternative services are marked broken. |
| 375 broken_services_.MarkAlternativeServiceBroken(alternative_service2); |
| 376 broken_services_.MarkAlternativeServiceBroken(alternative_service1); |
| 377 |
| 378 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) - |
| 379 base::TimeDelta::FromInternalValue(1)); |
| 380 EXPECT_TRUE( |
| 381 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 382 EXPECT_TRUE( |
| 383 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 384 |
| 385 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 386 EXPECT_FALSE( |
| 387 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 388 EXPECT_TRUE( |
| 389 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 390 |
| 391 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(20) - |
| 392 base::TimeDelta::FromMinutes(10) - |
| 393 base::TimeDelta::FromInternalValue(1)); |
| 394 EXPECT_FALSE( |
| 395 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 396 EXPECT_TRUE( |
| 397 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 398 |
| 399 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 400 EXPECT_FALSE( |
| 401 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 402 EXPECT_FALSE( |
| 403 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 404 } |
| 405 |
| 406 TEST_F(BrokenAlternativeServicesTest, AddBrokenAlternativeServicesToExisting) { |
| 407 AlternativeService alternative_service1(kProtoQUIC, "foo1", 443); |
| 408 AlternativeService alternative_service2(kProtoQUIC, "foo2", 443); |
| 409 AlternativeService alternative_service3(kProtoQUIC, "foo3", 443); |
| 410 |
| 411 base::TimeDelta delay1 = base::TimeDelta::FromMinutes(1); |
| 412 base::TimeDelta delay3 = base::TimeDelta::FromMinutes(3); |
| 413 |
| 414 std::unique_ptr<BrokenAlternativeServiceList> broken_list = |
| 415 base::MakeUnique<BrokenAlternativeServiceList>(); |
| 416 broken_list->push_back( |
| 417 {alternative_service3, broken_services_clock_->NowTicks() + delay3}); |
| 418 broken_list->push_back( |
| 419 {alternative_service1, broken_services_clock_->NowTicks() + delay1}); |
| 420 |
| 421 std::unique_ptr<RecentlyBrokenAlternativeServices> recently_broken_map = |
| 422 base::MakeUnique<RecentlyBrokenAlternativeServices>( |
| 423 RecentlyBrokenAlternativeServices::NO_AUTO_EVICT); |
| 424 recently_broken_map->Put(alternative_service1, 1); |
| 425 recently_broken_map->Put(alternative_service3, 1); |
| 426 |
| 427 broken_services_.MarkAlternativeServiceBroken(alternative_service1); |
| 428 broken_services_.MarkAlternativeServiceBroken(alternative_service2); |
| 429 |
| 430 // At this point, |alternative_service1| and |alternative_service2| are marked |
| 431 // broken and should expire in 5 minutes. |
| 432 // Adding |broken_list| should additionally mark |alternative_service3| |
| 433 // broken and should expire in 3 minute. Even though |broken_list| contains |
| 434 // |alternative_service1|, its expiration time should not change since it was |
| 435 // already marked broken. |
| 436 broken_services_.AddBrokenAndRecentlyBrokenAlternativeServices( |
| 437 std::move(broken_list), std::move(recently_broken_map)); |
| 438 |
| 439 EXPECT_TRUE( |
| 440 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 441 EXPECT_TRUE( |
| 442 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 443 EXPECT_TRUE( |
| 444 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 445 |
| 446 // Make sure |alternative_service3|'s brokenness expires in 3 minutes. |
| 447 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(3) - |
| 448 base::TimeDelta::FromInternalValue(1)); |
| 449 EXPECT_TRUE( |
| 450 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 451 EXPECT_TRUE( |
| 452 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 453 EXPECT_TRUE( |
| 454 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 455 |
| 456 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 457 EXPECT_TRUE( |
| 458 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 459 EXPECT_TRUE( |
| 460 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 461 EXPECT_FALSE( |
| 462 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 463 |
| 464 // Make sure |alternative_service1| and |alternative_service2|'s brokenness |
| 465 // expire in 2 more minutes. |
| 466 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2) - |
| 467 base::TimeDelta::FromInternalValue(1)); |
| 468 EXPECT_TRUE( |
| 469 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 470 EXPECT_TRUE( |
| 471 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 472 EXPECT_FALSE( |
| 473 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 474 |
| 475 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 476 EXPECT_FALSE( |
| 477 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 478 EXPECT_FALSE( |
| 479 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 480 EXPECT_FALSE( |
| 481 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 482 |
| 483 // Make sure recently broken alternative services are in most-recently-used |
| 484 // order. AddBrokenAndRecentlyBrokenAlternativeServices() will add |
| 485 // entries in |recently_broken_map| (that aren't already marked recently |
| 486 // broken in |broken_services_|) to the back of |broken_services_|'s |
| 487 // recency list; in this case, only |alternative_service3| is added as |
| 488 // recently broken. |
| 489 auto it = broken_services_.recently_broken_alternative_services().begin(); |
| 490 EXPECT_EQ(alternative_service2, it->first); |
| 491 ++it; |
| 492 EXPECT_EQ(alternative_service1, it->first); |
| 493 ++it; |
| 494 EXPECT_EQ(alternative_service3, it->first); |
| 495 } |
| 496 |
333 TEST_F(BrokenAlternativeServicesTest, ScheduleExpireTaskAfterExpire) { | 497 TEST_F(BrokenAlternativeServicesTest, ScheduleExpireTaskAfterExpire) { |
334 // This test will check that when a broken alt svc expires, an expiration task | 498 // This test will check that when a broken alt svc expires, an expiration task |
335 // is scheduled for the next broken alt svc in the expiration queue. | 499 // is scheduled for the next broken alt svc in the expiration queue. |
336 | 500 |
337 AlternativeService alternative_service1(kProtoQUIC, "foo", 443); | 501 AlternativeService alternative_service1(kProtoQUIC, "foo", 443); |
338 AlternativeService alternative_service2(kProtoQUIC, "bar", 443); | 502 AlternativeService alternative_service2(kProtoQUIC, "bar", 443); |
339 | 503 |
340 // Mark |alternative_service1| broken and let brokenness expire. This will | 504 // Mark |alternative_service1| broken and let brokenness expire. This will |
341 // increase its expiration delay the next time it's marked broken. | 505 // increase its expiration delay the next time it's marked broken. |
342 broken_services_.MarkAlternativeServiceBroken(alternative_service1); | 506 broken_services_.MarkAlternativeServiceBroken(alternative_service1); |
(...skipping 14 matching lines...) Expand all Loading... |
357 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 521 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
358 | 522 |
359 // Make sure an expiration task has been scheduled for expiring the brokenness | 523 // Make sure an expiration task has been scheduled for expiring the brokenness |
360 // of |alternative_service1|. | 524 // of |alternative_service1|. |
361 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 525 EXPECT_TRUE(test_task_runner_->HasPendingTask()); |
362 } | 526 } |
363 | 527 |
364 } // namespace | 528 } // namespace |
365 | 529 |
366 } // namespace net | 530 } // namespace net |
OLD | NEW |