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, SetBrokenAlternativeServices) { |
| 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_.SetBrokenAndRecentlyBrokenAlternativeServices( |
| 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, |
| 407 SetBrokenAlternativeServicesWithExisting) { |
| 408 AlternativeService alternative_service1(kProtoQUIC, "foo1", 443); |
| 409 AlternativeService alternative_service2(kProtoQUIC, "foo2", 443); |
| 410 AlternativeService alternative_service3(kProtoQUIC, "foo3", 443); |
| 411 |
| 412 std::unique_ptr<BrokenAlternativeServiceList> broken_list = |
| 413 base::MakeUnique<BrokenAlternativeServiceList>(); |
| 414 broken_list->push_back( |
| 415 {alternative_service3, |
| 416 broken_services_clock_->NowTicks() + base::TimeDelta::FromMinutes(1)}); |
| 417 broken_list->push_back( |
| 418 {alternative_service1, |
| 419 broken_services_clock_->NowTicks() + base::TimeDelta::FromMinutes(3)}); |
| 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 overwrite |alternative_service1|'s expiration |
| 433 // time to 3 minutes, and additionally mark |alternative_service3| |
| 434 // broken with an expiration time of 1 minute. |
| 435 broken_services_.SetBrokenAndRecentlyBrokenAlternativeServices( |
| 436 std::move(broken_list), std::move(recently_broken_map)); |
| 437 |
| 438 EXPECT_TRUE( |
| 439 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 440 EXPECT_TRUE( |
| 441 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 442 EXPECT_TRUE( |
| 443 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 444 |
| 445 // Make sure |alternative_service3|'s brokenness expires in 1 minute. |
| 446 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1) - |
| 447 base::TimeDelta::FromInternalValue(1)); |
| 448 EXPECT_TRUE( |
| 449 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 450 EXPECT_TRUE( |
| 451 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 452 EXPECT_TRUE( |
| 453 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 454 |
| 455 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 456 EXPECT_TRUE( |
| 457 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 458 EXPECT_TRUE( |
| 459 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 460 EXPECT_FALSE( |
| 461 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 462 |
| 463 // Make sure |alternative_service1|'s brokenness expires in 2 more minutes. |
| 464 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2) - |
| 465 base::TimeDelta::FromInternalValue(1)); |
| 466 EXPECT_TRUE( |
| 467 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 468 EXPECT_TRUE( |
| 469 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 470 EXPECT_FALSE( |
| 471 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 472 |
| 473 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 474 EXPECT_FALSE( |
| 475 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 476 EXPECT_TRUE( |
| 477 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 478 EXPECT_FALSE( |
| 479 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 480 |
| 481 // Make sure |alternative_service2|'s brokenness expires in 2 more minutes. |
| 482 test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(2) - |
| 483 base::TimeDelta::FromInternalValue(1)); |
| 484 EXPECT_FALSE( |
| 485 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 486 EXPECT_TRUE( |
| 487 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 488 EXPECT_FALSE( |
| 489 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 490 |
| 491 test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 492 EXPECT_FALSE( |
| 493 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
| 494 EXPECT_FALSE( |
| 495 broken_services_.IsAlternativeServiceBroken(alternative_service2)); |
| 496 EXPECT_FALSE( |
| 497 broken_services_.IsAlternativeServiceBroken(alternative_service3)); |
| 498 |
| 499 // Make sure recently broken alternative services are in most-recently-used |
| 500 // order. SetBrokenAndRecentlyBrokenAlternativeServices() will add |
| 501 // entries in |recently_broken_map| (that aren't already marked recently |
| 502 // broken in |broken_services_|) to the back of |broken_services_|'s |
| 503 // recency list; in this case, only |alternative_service3| is added as |
| 504 // recently broken. |
| 505 auto it = broken_services_.recently_broken_alternative_services().begin(); |
| 506 EXPECT_EQ(alternative_service2, it->first); |
| 507 ++it; |
| 508 EXPECT_EQ(alternative_service1, it->first); |
| 509 ++it; |
| 510 EXPECT_EQ(alternative_service3, it->first); |
| 511 } |
| 512 |
333 TEST_F(BrokenAlternativeServicesTest, ScheduleExpireTaskAfterExpire) { | 513 TEST_F(BrokenAlternativeServicesTest, ScheduleExpireTaskAfterExpire) { |
334 // This test will check that when a broken alt svc expires, an expiration task | 514 // 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. | 515 // is scheduled for the next broken alt svc in the expiration queue. |
336 | 516 |
337 AlternativeService alternative_service1(kProtoQUIC, "foo", 443); | 517 AlternativeService alternative_service1(kProtoQUIC, "foo", 443); |
338 AlternativeService alternative_service2(kProtoQUIC, "bar", 443); | 518 AlternativeService alternative_service2(kProtoQUIC, "bar", 443); |
339 | 519 |
340 // Mark |alternative_service1| broken and let brokenness expire. This will | 520 // Mark |alternative_service1| broken and let brokenness expire. This will |
341 // increase its expiration delay the next time it's marked broken. | 521 // increase its expiration delay the next time it's marked broken. |
342 broken_services_.MarkAlternativeServiceBroken(alternative_service1); | 522 broken_services_.MarkAlternativeServiceBroken(alternative_service1); |
(...skipping 14 matching lines...) Expand all Loading... |
357 broken_services_.IsAlternativeServiceBroken(alternative_service1)); | 537 broken_services_.IsAlternativeServiceBroken(alternative_service1)); |
358 | 538 |
359 // Make sure an expiration task has been scheduled for expiring the brokenness | 539 // Make sure an expiration task has been scheduled for expiring the brokenness |
360 // of |alternative_service1|. | 540 // of |alternative_service1|. |
361 EXPECT_TRUE(test_task_runner_->HasPendingTask()); | 541 EXPECT_TRUE(test_task_runner_->HasPendingTask()); |
362 } | 542 } |
363 | 543 |
364 } // namespace | 544 } // namespace |
365 | 545 |
366 } // namespace net | 546 } // namespace net |
OLD | NEW |