OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/precache/core/precache_fetcher.h" | 5 #include "components/precache/core/precache_fetcher.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <cstring> | 9 #include <cstring> |
10 #include <memory> | 10 #include <memory> |
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 569 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
570 | 570 |
571 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 571 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
572 | 572 |
573 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 573 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
574 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 574 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
575 url_callback_.total_response_bytes(), 1); | 575 url_callback_.total_response_bytes(), 1); |
576 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 576 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
577 } | 577 } |
578 | 578 |
579 TEST_F(PrecacheFetcherTest, PrecacheResourceSelection) { | 579 class PrecacheFetcherResourceSelectionTest |
| 580 : public PrecacheFetcherTest, |
| 581 public testing::WithParamInterface<PrecacheResourceSelection> { |
| 582 public: |
| 583 // These bitsets are asymmetric and multibyte, in order to test the orderings. |
| 584 |
| 585 // Set bits for kGoodResourceURL, kGoodResourceURLC and kGoodResourceURLD. |
| 586 static PrecacheResourceSelection DeprecatedBitset() { |
| 587 PrecacheResourceSelection ret; |
| 588 ret.set_deprecated_bitset(0b110000000001); |
| 589 return ret; |
| 590 } |
| 591 |
| 592 // Set bits for kGoodResourceURL, kGoodResourceURLC and kGoodResourceURLD. |
| 593 static PrecacheResourceSelection Bitset() { |
| 594 PrecacheResourceSelection ret; |
| 595 ret.set_bitset("\x01\x0c"); |
| 596 return ret; |
| 597 } |
| 598 }; |
| 599 |
| 600 TEST_P(PrecacheFetcherResourceSelectionTest, Basic) { |
580 SetDefaultFlags(); | 601 SetDefaultFlags(); |
581 | 602 |
582 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 603 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
583 new PrecacheUnfinishedWork()); | 604 new PrecacheUnfinishedWork()); |
584 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); | 605 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); |
585 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 606 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
586 | 607 |
587 PrecacheConfigurationSettings config; | 608 PrecacheConfigurationSettings config; |
588 | 609 |
589 PrecacheManifest good_manifest; | 610 PrecacheManifest good_manifest; |
590 PrecacheResourceSelection resource_selection; | 611 PrecacheResourceSelection resource_selection; |
591 good_manifest.add_resource()->set_url(kGoodResourceURL); | 612 good_manifest.add_resource()->set_url(kGoodResourceURL); |
592 good_manifest.add_resource()->set_url(kGoodResourceURLA); | 613 good_manifest.add_resource()->set_url(kGoodResourceURLA); |
593 good_manifest.add_resource()->set_url(kGoodResourceURLB); | 614 for (int i = 0; i < 8; ++i) |
| 615 good_manifest.add_resource()->set_url(kGoodResourceURLB); |
594 good_manifest.add_resource()->set_url(kGoodResourceURLC); | 616 good_manifest.add_resource()->set_url(kGoodResourceURLC); |
595 good_manifest.add_resource()->set_url(kGoodResourceURLD); | 617 good_manifest.add_resource()->set_url(kGoodResourceURLD); |
596 | 618 |
597 // Set bits for kGoodResourceURL, kGoodResourceURLB and kGoodResourceURLD. | |
598 resource_selection.set_bitset(0b10101); | |
599 (*good_manifest.mutable_experiments() | 619 (*good_manifest.mutable_experiments() |
600 ->mutable_resources_by_experiment_group())[kExperimentID] = | 620 ->mutable_resources_by_experiment_group())[kExperimentID] = GetParam(); |
601 resource_selection; | |
602 | 621 |
603 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 622 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
604 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 623 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
605 factory_.SetFakeResponse(GURL(kGoodManifestURL), | 624 factory_.SetFakeResponse(GURL(kGoodManifestURL), |
606 good_manifest.SerializeAsString(), net::HTTP_OK, | 625 good_manifest.SerializeAsString(), net::HTTP_OK, |
607 net::URLRequestStatus::SUCCESS); | 626 net::URLRequestStatus::SUCCESS); |
608 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, | 627 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, |
609 net::URLRequestStatus::SUCCESS); | 628 net::URLRequestStatus::SUCCESS); |
610 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, | 629 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL B", net::HTTP_OK, |
611 net::URLRequestStatus::SUCCESS); | 630 net::URLRequestStatus::SUCCESS); |
612 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, | 631 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, |
613 net::URLRequestStatus::SUCCESS); | 632 net::URLRequestStatus::SUCCESS); |
614 | 633 |
615 base::HistogramTester histogram; | 634 base::HistogramTester histogram; |
616 | 635 |
617 { | 636 { |
618 PrecacheFetcher precache_fetcher( | 637 PrecacheFetcher precache_fetcher( |
619 request_context_.get(), GURL(), std::string(), | 638 request_context_.get(), GURL(), std::string(), |
620 std::move(unfinished_work), kExperimentID, | 639 std::move(unfinished_work), kExperimentID, |
621 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 640 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
622 precache_fetcher.Start(); | 641 precache_fetcher.Start(); |
623 | 642 |
624 base::RunLoop().RunUntilIdle(); | 643 base::RunLoop().RunUntilIdle(); |
625 | 644 |
626 // Destroy the PrecacheFetcher after it has finished, to record metrics. | 645 // Destroy the PrecacheFetcher after it has finished, to record metrics. |
627 } | 646 } |
628 | 647 |
629 std::vector<GURL> expected_requested_urls; | 648 std::vector<GURL> expected_requested_urls; |
630 expected_requested_urls.emplace_back(kConfigURL); | 649 expected_requested_urls.emplace_back(kConfigURL); |
631 expected_requested_urls.emplace_back(kGoodManifestURL); | 650 expected_requested_urls.emplace_back(kGoodManifestURL); |
632 expected_requested_urls.emplace_back(kGoodResourceURL); | 651 expected_requested_urls.emplace_back(kGoodResourceURL); |
633 expected_requested_urls.emplace_back(kGoodResourceURLB); | 652 expected_requested_urls.emplace_back(kGoodResourceURLC); |
634 expected_requested_urls.emplace_back(kGoodResourceURLD); | 653 expected_requested_urls.emplace_back(kGoodResourceURLD); |
635 | 654 |
636 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 655 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
637 | 656 |
638 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 657 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
639 | 658 |
640 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 659 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
641 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 660 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
642 url_callback_.total_response_bytes(), 1); | 661 url_callback_.total_response_bytes(), 1); |
643 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 662 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
644 } | 663 } |
645 | 664 |
646 TEST_F(PrecacheFetcherTest, PrecacheResourceSelectionMissingBitset) { | 665 TEST_P(PrecacheFetcherResourceSelectionTest, MissingBitset) { |
647 SetDefaultFlags(); | 666 SetDefaultFlags(); |
648 | 667 |
649 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 668 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
650 new PrecacheUnfinishedWork()); | 669 new PrecacheUnfinishedWork()); |
651 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); | 670 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); |
652 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 671 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
653 | 672 |
654 PrecacheConfigurationSettings config; | 673 PrecacheConfigurationSettings config; |
655 | 674 |
656 PrecacheManifest good_manifest; | 675 PrecacheManifest good_manifest; |
657 PrecacheResourceSelection resource_selection; | 676 PrecacheResourceSelection resource_selection; |
658 good_manifest.add_resource()->set_url(kGoodResourceURL); | 677 good_manifest.add_resource()->set_url(kGoodResourceURL); |
659 good_manifest.add_resource()->set_url(kGoodResourceURLA); | 678 good_manifest.add_resource()->set_url(kGoodResourceURLA); |
660 good_manifest.add_resource()->set_url(kGoodResourceURLB); | 679 good_manifest.add_resource()->set_url(kGoodResourceURLB); |
661 good_manifest.add_resource()->set_url(kGoodResourceURLC); | 680 good_manifest.add_resource()->set_url(kGoodResourceURLC); |
662 good_manifest.add_resource()->set_url(kGoodResourceURLD); | 681 good_manifest.add_resource()->set_url(kGoodResourceURLD); |
663 | 682 |
664 // Set bits for a different experiment group. | 683 // Set bits for a different experiment group. |
665 resource_selection.set_bitset(0b1); | |
666 (*good_manifest.mutable_experiments() | 684 (*good_manifest.mutable_experiments() |
667 ->mutable_resources_by_experiment_group())[kExperimentID + 1] = | 685 ->mutable_resources_by_experiment_group())[kExperimentID + 1] = |
668 resource_selection; | 686 GetParam(); |
669 | 687 |
670 // Resource selection bitset for the experiment group will be missing and all | 688 // Resource selection bitset for the experiment group will be missing and all |
671 // resources will be fetched. | 689 // resources will be fetched. |
672 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 690 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
673 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 691 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
674 factory_.SetFakeResponse(GURL(kGoodManifestURL), | 692 factory_.SetFakeResponse(GURL(kGoodManifestURL), |
675 good_manifest.SerializeAsString(), net::HTTP_OK, | 693 good_manifest.SerializeAsString(), net::HTTP_OK, |
676 net::URLRequestStatus::SUCCESS); | 694 net::URLRequestStatus::SUCCESS); |
677 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, | 695 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, |
678 net::URLRequestStatus::SUCCESS); | 696 net::URLRequestStatus::SUCCESS); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 729 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
712 | 730 |
713 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 731 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
714 | 732 |
715 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 733 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
716 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 734 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
717 url_callback_.total_response_bytes(), 1); | 735 url_callback_.total_response_bytes(), 1); |
718 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 736 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
719 } | 737 } |
720 | 738 |
| 739 INSTANTIATE_TEST_CASE_P( |
| 740 PrecacheFetcherResourceSelectionTest, |
| 741 PrecacheFetcherResourceSelectionTest, |
| 742 testing::Values(PrecacheFetcherResourceSelectionTest::DeprecatedBitset(), |
| 743 PrecacheFetcherResourceSelectionTest::Bitset())); |
| 744 |
721 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { | 745 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { |
722 SetDefaultFlags(); | 746 SetDefaultFlags(); |
723 | 747 |
724 PrecacheConfigurationSettings config; | 748 PrecacheConfigurationSettings config; |
725 config.set_top_sites_count(3); | 749 config.set_top_sites_count(3); |
726 | 750 |
727 std::unique_ptr<PrecacheUnfinishedWork> initial_work( | 751 std::unique_ptr<PrecacheUnfinishedWork> initial_work( |
728 new PrecacheUnfinishedWork()); | 752 new PrecacheUnfinishedWork()); |
729 initial_work->add_top_host()->set_hostname("manifest1.com"); | 753 initial_work->add_top_host()->set_hostname("manifest1.com"); |
730 initial_work->add_top_host()->set_hostname("manifest2.com"); | 754 initial_work->add_top_host()->set_hostname("manifest2.com"); |
(...skipping 1206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 1961 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
1938 | 1962 |
1939 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1963 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
1940 | 1964 |
1941 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 2); | 1965 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 2); |
1942 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 2); | 1966 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 2); |
1943 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 2); | 1967 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 2); |
1944 } | 1968 } |
1945 | 1969 |
1946 } // namespace precache | 1970 } // namespace precache |
OLD | NEW |