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> |
11 #include <set> | 11 #include <set> |
12 #include <string> | 12 #include <string> |
13 #include <utility> | |
13 #include <vector> | 14 #include <vector> |
14 | 15 |
15 #include "base/bind.h" | 16 #include "base/bind.h" |
16 #include "base/callback.h" | 17 #include "base/callback.h" |
17 #include "base/command_line.h" | 18 #include "base/command_line.h" |
18 #include "base/compiler_specific.h" | 19 #include "base/compiler_specific.h" |
19 #include "base/files/file_path.h" | 20 #include "base/files/file_path.h" |
20 #include "base/files/scoped_temp_dir.h" | 21 #include "base/files/scoped_temp_dir.h" |
21 #include "base/memory/ptr_util.h" | 22 #include "base/memory/ptr_util.h" |
22 #include "base/memory/ref_counted.h" | 23 #include "base/memory/ref_counted.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
83 std::unique_ptr<net::FakeURLFetcher> CreateURLFetcher( | 84 std::unique_ptr<net::FakeURLFetcher> CreateURLFetcher( |
84 const GURL& url, | 85 const GURL& url, |
85 net::URLFetcherDelegate* delegate, | 86 net::URLFetcherDelegate* delegate, |
86 const std::string& response_data, | 87 const std::string& response_data, |
87 net::HttpStatusCode response_code, | 88 net::HttpStatusCode response_code, |
88 net::URLRequestStatus::Status status) { | 89 net::URLRequestStatus::Status status) { |
89 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher( | 90 std::unique_ptr<net::FakeURLFetcher> fetcher(new net::FakeURLFetcher( |
90 url, delegate, response_data, response_code, status)); | 91 url, delegate, response_data, response_code, status)); |
91 | 92 |
92 total_response_bytes_ += response_data.size(); | 93 total_response_bytes_ += response_data.size(); |
93 requested_urls_.insert(url); | 94 requested_urls_.push_back(url); |
94 | 95 |
95 return fetcher; | 96 return fetcher; |
96 } | 97 } |
97 | 98 |
98 const std::multiset<GURL>& requested_urls() const { return requested_urls_; } | 99 const std::vector<GURL>& requested_urls() const { return requested_urls_; } |
99 | 100 |
100 void clear_requested_urls() { requested_urls_.clear(); } | 101 void clear_requested_urls() { requested_urls_.clear(); } |
101 | 102 |
102 int total_response_bytes() const { return total_response_bytes_; } | 103 int total_response_bytes() const { return total_response_bytes_; } |
103 | 104 |
104 private: | 105 private: |
105 // Multiset with one entry for each URL requested. | 106 std::vector<GURL> requested_urls_; |
106 std::multiset<GURL> requested_urls_; | |
107 int total_response_bytes_; | 107 int total_response_bytes_; |
108 }; | 108 }; |
109 | 109 |
110 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate { | 110 class TestPrecacheDelegate : public PrecacheFetcher::PrecacheDelegate { |
111 public: | 111 public: |
112 TestPrecacheDelegate() | 112 TestPrecacheDelegate() |
113 : on_done_was_called_(false) {} | 113 : on_done_was_called_(false) {} |
114 | 114 |
115 void OnDone() override { on_done_was_called_ = true; } | 115 void OnDone() override { |
116 LOG(INFO) << "OnDone"; | |
117 on_done_was_called_ = true; | |
118 } | |
116 | 119 |
117 bool was_on_done_called() const { | 120 bool was_on_done_called() const { |
118 return on_done_was_called_; | 121 return on_done_was_called_; |
119 } | 122 } |
120 | 123 |
121 private: | 124 private: |
122 bool on_done_was_called_; | 125 bool on_done_was_called_; |
123 }; | 126 }; |
124 | 127 |
125 class MockURLFetcherFactory : public net::URLFetcherFactory { | 128 class MockURLFetcherFactory : public net::URLFetcherFactory { |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
381 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 384 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
382 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); | 385 switches::kPrecacheManifestURLPrefix, kManifestURLPrefix); |
383 } | 386 } |
384 | 387 |
385 // Posts a task to check if more parallel fetches of precache manifest and | 388 // Posts a task to check if more parallel fetches of precache manifest and |
386 // resource URLs were attempted beyond the fetcher pool maximum defined | 389 // resource URLs were attempted beyond the fetcher pool maximum defined |
387 // capacity. The task will be posted repeatedly until such condition is met. | 390 // capacity. The task will be posted repeatedly until such condition is met. |
388 void CheckUntilParallelFetchesBeyondCapacity( | 391 void CheckUntilParallelFetchesBeyondCapacity( |
389 const PrecacheFetcher* precache_fetcher) { | 392 const PrecacheFetcher* precache_fetcher) { |
390 if (!precache_fetcher->pool_.IsAvailable() && | 393 if (!precache_fetcher->pool_.IsAvailable() && |
391 !precache_fetcher->top_hosts_to_fetch_.empty() && | 394 (!precache_fetcher->top_hosts_to_fetch_.empty() || |
392 !precache_fetcher->resources_to_fetch_.empty()) { | 395 !precache_fetcher->resources_to_fetch_.empty())) { |
393 parallel_fetches_beyond_capacity_ = true; | 396 parallel_fetches_beyond_capacity_ = true; |
394 return; | 397 return; |
395 } | 398 } |
396 | 399 |
397 // Check again after allowing the message loop to process some messages. | 400 // Check again after allowing the message loop to process some messages. |
398 loop_.task_runner()->PostTask( | 401 loop_.task_runner()->PostTask( |
399 FROM_HERE, | 402 FROM_HERE, |
400 base::Bind( | 403 base::Bind( |
401 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity, | 404 &PrecacheFetcherTest::CheckUntilParallelFetchesBeyondCapacity, |
402 base::Unretained(this), precache_fetcher)); | 405 base::Unretained(this), precache_fetcher)); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
461 net::URLRequestStatus::SUCCESS); | 464 net::URLRequestStatus::SUCCESS); |
462 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), | 465 factory_.SetFakeResponse(GURL(kForcedStartingURLManifestURL), |
463 PrecacheManifest().SerializeAsString(), net::HTTP_OK, | 466 PrecacheManifest().SerializeAsString(), net::HTTP_OK, |
464 net::URLRequestStatus::SUCCESS); | 467 net::URLRequestStatus::SUCCESS); |
465 | 468 |
466 base::HistogramTester histogram; | 469 base::HistogramTester histogram; |
467 | 470 |
468 { | 471 { |
469 PrecacheFetcher precache_fetcher( | 472 PrecacheFetcher precache_fetcher( |
470 request_context_.get(), GURL(), std::string(), | 473 request_context_.get(), GURL(), std::string(), |
471 std::move(unfinished_work), kExperimentID, | 474 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
472 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 475 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
473 precache_fetcher.Start(); | 476 precache_fetcher.Start(); |
474 | 477 |
475 base::RunLoop().RunUntilIdle(); | 478 base::RunLoop().RunUntilIdle(); |
476 | 479 |
477 // Destroy the PrecacheFetcher after it has finished, to record metrics. | 480 // Destroy the PrecacheFetcher after it has finished, to record metrics. |
478 } | 481 } |
479 | 482 |
480 std::multiset<GURL> expected_requested_urls; | 483 std::vector<GURL> expected_requested_urls; |
481 expected_requested_urls.insert(GURL(kConfigURL)); | 484 expected_requested_urls.emplace_back(kConfigURL); |
482 expected_requested_urls.insert(GURL(kManifestFetchFailureURL)); | 485 expected_requested_urls.emplace_back(kManifestFetchFailureURL); |
483 expected_requested_urls.insert(GURL(kBadManifestURL)); | 486 expected_requested_urls.emplace_back(kBadManifestURL); |
484 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 487 expected_requested_urls.emplace_back(kGoodManifestURL); |
485 expected_requested_urls.insert(GURL(kResourceFetchFailureURL)); | 488 expected_requested_urls.emplace_back(kForcedStartingURLManifestURL); |
486 expected_requested_urls.insert(GURL(kGoodResourceURL)); | 489 expected_requested_urls.emplace_back(kResourceFetchFailureURL); |
487 expected_requested_urls.insert(GURL(kForcedStartingURLManifestURL)); | 490 expected_requested_urls.emplace_back(kGoodResourceURL); |
488 | 491 |
489 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 492 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
490 | 493 |
491 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 494 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
492 | 495 |
493 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 496 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
494 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 497 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
495 url_callback_.total_response_bytes(), 1); | 498 url_callback_.total_response_bytes(), 1); |
496 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 499 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
497 } | 500 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
530 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, | 533 factory_.SetFakeResponse(GURL(kGoodResourceURLB), "good URL B", net::HTTP_OK, |
531 net::URLRequestStatus::SUCCESS); | 534 net::URLRequestStatus::SUCCESS); |
532 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, | 535 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, |
533 net::URLRequestStatus::SUCCESS); | 536 net::URLRequestStatus::SUCCESS); |
534 | 537 |
535 base::HistogramTester histogram; | 538 base::HistogramTester histogram; |
536 | 539 |
537 { | 540 { |
538 PrecacheFetcher precache_fetcher( | 541 PrecacheFetcher precache_fetcher( |
539 request_context_.get(), GURL(), std::string(), | 542 request_context_.get(), GURL(), std::string(), |
540 std::move(unfinished_work), kExperimentID, | 543 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
541 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 544 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
542 precache_fetcher.Start(); | 545 precache_fetcher.Start(); |
543 | 546 |
544 base::RunLoop().RunUntilIdle(); | 547 base::RunLoop().RunUntilIdle(); |
545 | 548 |
546 // Destroy the PrecacheFetcher after it has finished, to record metrics. | 549 // Destroy the PrecacheFetcher after it has finished, to record metrics. |
547 } | 550 } |
548 | 551 |
549 std::multiset<GURL> expected_requested_urls; | 552 std::vector<GURL> expected_requested_urls; |
550 expected_requested_urls.insert(GURL(kConfigURL)); | 553 expected_requested_urls.emplace_back(kConfigURL); |
551 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 554 expected_requested_urls.emplace_back(kGoodManifestURL); |
552 expected_requested_urls.insert(GURL(kGoodResourceURL)); | 555 expected_requested_urls.emplace_back(kGoodResourceURL); |
553 expected_requested_urls.insert(GURL(kGoodResourceURLB)); | 556 expected_requested_urls.emplace_back(kGoodResourceURLB); |
554 expected_requested_urls.insert(GURL(kGoodResourceURLD)); | 557 expected_requested_urls.emplace_back(kGoodResourceURLD); |
555 | 558 |
556 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 559 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
557 | 560 |
558 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 561 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
559 | 562 |
560 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 563 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
561 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 564 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
562 url_callback_.total_response_bytes(), 1); | 565 url_callback_.total_response_bytes(), 1); |
563 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 566 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
564 } | 567 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
603 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK, | 606 factory_.SetFakeResponse(GURL(kGoodResourceURLC), "good URL C", net::HTTP_OK, |
604 net::URLRequestStatus::SUCCESS); | 607 net::URLRequestStatus::SUCCESS); |
605 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, | 608 factory_.SetFakeResponse(GURL(kGoodResourceURLD), "good URL D", net::HTTP_OK, |
606 net::URLRequestStatus::SUCCESS); | 609 net::URLRequestStatus::SUCCESS); |
607 | 610 |
608 base::HistogramTester histogram; | 611 base::HistogramTester histogram; |
609 | 612 |
610 { | 613 { |
611 PrecacheFetcher precache_fetcher( | 614 PrecacheFetcher precache_fetcher( |
612 request_context_.get(), GURL(), std::string(), | 615 request_context_.get(), GURL(), std::string(), |
613 std::move(unfinished_work), kExperimentID, | 616 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
614 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 617 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
615 precache_fetcher.Start(); | 618 precache_fetcher.Start(); |
616 | 619 |
617 base::RunLoop().RunUntilIdle(); | 620 base::RunLoop().RunUntilIdle(); |
618 | 621 |
619 // Destroy the PrecacheFetcher after it has finished, to record metrics. | 622 // Destroy the PrecacheFetcher after it has finished, to record metrics. |
620 } | 623 } |
621 | 624 |
622 std::multiset<GURL> expected_requested_urls; | 625 std::vector<GURL> expected_requested_urls; |
623 expected_requested_urls.insert(GURL(kConfigURL)); | 626 expected_requested_urls.emplace_back(kConfigURL); |
624 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 627 expected_requested_urls.emplace_back(kGoodManifestURL); |
625 expected_requested_urls.insert(GURL(kGoodResourceURL)); | 628 expected_requested_urls.emplace_back(kGoodResourceURL); |
626 expected_requested_urls.insert(GURL(kGoodResourceURLA)); | 629 expected_requested_urls.emplace_back(kGoodResourceURLA); |
627 expected_requested_urls.insert(GURL(kGoodResourceURLB)); | 630 expected_requested_urls.emplace_back(kGoodResourceURLB); |
628 expected_requested_urls.insert(GURL(kGoodResourceURLC)); | 631 expected_requested_urls.emplace_back(kGoodResourceURLC); |
629 expected_requested_urls.insert(GURL(kGoodResourceURLD)); | 632 expected_requested_urls.emplace_back(kGoodResourceURLD); |
630 | 633 |
631 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 634 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
632 | 635 |
633 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 636 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
634 | 637 |
635 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 638 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
636 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 639 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
637 url_callback_.total_response_bytes(), 1); | 640 url_callback_.total_response_bytes(), 1); |
638 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 641 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
639 } | 642 } |
640 | 643 |
641 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { | 644 TEST_F(PrecacheFetcherTest, PrecachePauseResume) { |
642 SetDefaultFlags(); | 645 SetDefaultFlags(); |
643 | 646 |
644 PrecacheConfigurationSettings config; | 647 PrecacheConfigurationSettings config; |
645 config.set_top_sites_count(3); | 648 config.set_top_sites_count(3); |
646 | 649 |
647 std::unique_ptr<PrecacheUnfinishedWork> initial_work( | 650 std::unique_ptr<PrecacheUnfinishedWork> initial_work( |
648 new PrecacheUnfinishedWork()); | 651 new PrecacheUnfinishedWork()); |
649 initial_work->add_top_host()->set_hostname("manifest1.com"); | 652 initial_work->add_top_host()->set_hostname("manifest1.com"); |
650 initial_work->add_top_host()->set_hostname("manifest2.com"); | 653 initial_work->add_top_host()->set_hostname("manifest2.com"); |
651 initial_work->set_start_time( | 654 initial_work->set_start_time( |
652 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue()); | 655 (base::Time::Now() - base::TimeDelta::FromHours(1)).ToInternalValue()); |
653 | 656 |
654 PrecacheFetcher first_fetcher(request_context_.get(), GURL(), std::string(), | 657 PrecacheFetcher first_fetcher( |
655 std::move(initial_work), kExperimentID, | 658 request_context_.get(), GURL(), std::string(), false /* global_ranking */, |
656 precache_database_.GetWeakPtr(), task_runner(), | 659 std::move(initial_work), kExperimentID, precache_database_.GetWeakPtr(), |
657 &precache_delegate_); | 660 task_runner(), &precache_delegate_); |
658 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 661 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
659 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 662 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
660 first_fetcher.Start(); | 663 first_fetcher.Start(); |
661 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work = | 664 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work = |
662 first_fetcher.CancelPrecaching(); | 665 first_fetcher.CancelPrecaching(); |
663 | 666 |
664 std::multiset<GURL> expected_requested_urls; | 667 std::vector<GURL> expected_requested_urls; |
665 expected_requested_urls.insert(GURL(kConfigURL)); | 668 expected_requested_urls.emplace_back(kConfigURL); |
666 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 669 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
667 | 670 |
668 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 671 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
669 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 672 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
670 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK, | 673 factory_.SetFakeResponse(GURL(kBadManifestURL), "bad protobuf", net::HTTP_OK, |
671 net::URLRequestStatus::SUCCESS); | 674 net::URLRequestStatus::SUCCESS); |
672 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"), | 675 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest1.com"), |
673 "bad protobuf", net::HTTP_OK, | 676 "bad protobuf", net::HTTP_OK, |
674 net::URLRequestStatus::SUCCESS); | 677 net::URLRequestStatus::SUCCESS); |
675 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"), | 678 factory_.SetFakeResponse(GURL("http://manifest-url-prefix.com/manifest2.com"), |
676 "bad protobuf", net::HTTP_OK, | 679 "bad protobuf", net::HTTP_OK, |
677 net::URLRequestStatus::SUCCESS); | 680 net::URLRequestStatus::SUCCESS); |
678 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, | 681 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, |
679 net::URLRequestStatus::SUCCESS); | 682 net::URLRequestStatus::SUCCESS); |
680 | 683 |
681 url_callback_.clear_requested_urls(); | 684 url_callback_.clear_requested_urls(); |
682 PrecacheFetcher second_fetcher(request_context_.get(), GURL(), std::string(), | 685 PrecacheFetcher second_fetcher( |
683 std::move(unfinished_work), kExperimentID, | 686 request_context_.get(), GURL(), std::string(), false /* global_ranking */, |
684 precache_database_.GetWeakPtr(), task_runner(), | 687 std::move(unfinished_work), kExperimentID, |
685 &precache_delegate_); | 688 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
686 second_fetcher.Start(); | 689 second_fetcher.Start(); |
687 base::RunLoop().RunUntilIdle(); | 690 base::RunLoop().RunUntilIdle(); |
688 expected_requested_urls.insert( | 691 expected_requested_urls.emplace_back( |
689 GURL("http://manifest-url-prefix.com/manifest1.com")); | 692 "http://manifest-url-prefix.com/manifest1.com"); |
690 expected_requested_urls.insert( | 693 expected_requested_urls.emplace_back( |
691 GURL("http://manifest-url-prefix.com/manifest2.com")); | 694 "http://manifest-url-prefix.com/manifest2.com"); |
692 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 695 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
693 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 696 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
694 } | 697 } |
695 | 698 |
696 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) { | 699 TEST_F(PrecacheFetcherTest, ResumeWithConfigOnly) { |
697 SetDefaultFlags(); | 700 SetDefaultFlags(); |
698 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 701 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
699 new PrecacheUnfinishedWork()); | 702 new PrecacheUnfinishedWork()); |
700 unfinished_work->mutable_config_settings()->add_forced_site( | 703 unfinished_work->mutable_config_settings()->add_forced_site( |
701 "good-manifest.com"); | 704 "good-manifest.com"); |
702 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); | 705 unfinished_work->set_start_time(base::Time::Now().ToInternalValue()); |
703 PrecacheManifest good_manifest; | 706 PrecacheManifest good_manifest; |
704 good_manifest.add_resource()->set_url(kGoodResourceURL); | 707 good_manifest.add_resource()->set_url(kGoodResourceURL); |
705 | 708 |
706 factory_.SetFakeResponse(GURL(kGoodManifestURL), | 709 factory_.SetFakeResponse(GURL(kGoodManifestURL), |
707 good_manifest.SerializeAsString(), net::HTTP_OK, | 710 good_manifest.SerializeAsString(), net::HTTP_OK, |
708 net::URLRequestStatus::SUCCESS); | 711 net::URLRequestStatus::SUCCESS); |
709 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, | 712 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, |
710 net::URLRequestStatus::SUCCESS); | 713 net::URLRequestStatus::SUCCESS); |
711 { | 714 { |
712 PrecacheFetcher precache_fetcher( | 715 PrecacheFetcher precache_fetcher( |
713 request_context_.get(), GURL(), std::string(), | 716 request_context_.get(), GURL(), std::string(), |
714 std::move(unfinished_work), kExperimentID, | 717 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
715 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 718 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
716 precache_fetcher.Start(); | 719 precache_fetcher.Start(); |
717 | 720 |
718 base::RunLoop().RunUntilIdle(); | 721 base::RunLoop().RunUntilIdle(); |
719 } | 722 } |
720 | 723 |
721 std::multiset<GURL> expected_requested_urls; | 724 std::vector<GURL> expected_requested_urls; |
722 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 725 expected_requested_urls.emplace_back(kGoodManifestURL); |
723 expected_requested_urls.insert(GURL(kGoodResourceURL)); | 726 expected_requested_urls.emplace_back(kGoodResourceURL); |
724 | 727 |
725 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 728 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
726 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 729 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
727 | |
728 } | 730 } |
729 | 731 |
730 | 732 |
731 TEST_F(PrecacheFetcherTest, CustomURLs) { | 733 TEST_F(PrecacheFetcherTest, CustomURLs) { |
732 SetDefaultFlags(); | 734 SetDefaultFlags(); |
733 | 735 |
734 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 736 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
735 new PrecacheUnfinishedWork()); | 737 new PrecacheUnfinishedWork()); |
736 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); | 738 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); |
737 | 739 |
738 PrecacheConfigurationSettings config; | 740 PrecacheConfigurationSettings config; |
739 | 741 |
740 PrecacheManifest good_manifest; | 742 PrecacheManifest good_manifest; |
741 good_manifest.add_resource()->set_url(kGoodResourceURL); | 743 good_manifest.add_resource()->set_url(kGoodResourceURL); |
742 | 744 |
743 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(), | 745 factory_.SetFakeResponse(GURL(kCustomConfigURL), config.SerializeAsString(), |
744 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 746 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
745 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL), | 747 factory_.SetFakeResponse(GURL(kCustomGoodManifestURL), |
746 good_manifest.SerializeAsString(), net::HTTP_OK, | 748 good_manifest.SerializeAsString(), net::HTTP_OK, |
747 net::URLRequestStatus::SUCCESS); | 749 net::URLRequestStatus::SUCCESS); |
748 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, | 750 factory_.SetFakeResponse(GURL(kGoodResourceURL), "good", net::HTTP_OK, |
749 net::URLRequestStatus::SUCCESS); | 751 net::URLRequestStatus::SUCCESS); |
750 | 752 |
751 PrecacheFetcher precache_fetcher( | 753 PrecacheFetcher precache_fetcher( |
752 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix, | 754 request_context_.get(), GURL(kCustomConfigURL), kCustomManifestURLPrefix, |
753 std::move(unfinished_work), kExperimentID, | 755 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
754 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 756 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
755 precache_fetcher.Start(); | 757 precache_fetcher.Start(); |
756 | 758 |
757 base::RunLoop().RunUntilIdle(); | 759 base::RunLoop().RunUntilIdle(); |
758 | 760 |
759 std::multiset<GURL> expected_requested_urls; | 761 std::vector<GURL> expected_requested_urls; |
760 expected_requested_urls.insert(GURL(kCustomConfigURL)); | 762 expected_requested_urls.emplace_back(kCustomConfigURL); |
761 expected_requested_urls.insert(GURL(kCustomGoodManifestURL)); | 763 expected_requested_urls.emplace_back(kCustomGoodManifestURL); |
762 expected_requested_urls.insert(GURL(kGoodResourceURL)); | 764 expected_requested_urls.emplace_back(kGoodResourceURL); |
763 | 765 |
764 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 766 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
765 | 767 |
766 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 768 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
767 } | 769 } |
768 | 770 |
769 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { | 771 TEST_F(PrecacheFetcherTest, ConfigFetchFailure) { |
770 SetDefaultFlags(); | 772 SetDefaultFlags(); |
771 | 773 |
772 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 774 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
773 new PrecacheUnfinishedWork()); | 775 new PrecacheUnfinishedWork()); |
774 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); | 776 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); |
775 | 777 |
776 factory_.SetFakeResponse(GURL(kConfigURL), "", | 778 factory_.SetFakeResponse(GURL(kConfigURL), "", |
777 net::HTTP_INTERNAL_SERVER_ERROR, | 779 net::HTTP_INTERNAL_SERVER_ERROR, |
778 net::URLRequestStatus::FAILED); | 780 net::URLRequestStatus::FAILED); |
779 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, | 781 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, |
780 net::URLRequestStatus::SUCCESS); | 782 net::URLRequestStatus::SUCCESS); |
781 | 783 |
782 PrecacheFetcher precache_fetcher( | 784 PrecacheFetcher precache_fetcher( |
783 request_context_.get(), GURL(), std::string(), std::move(unfinished_work), | 785 request_context_.get(), GURL(), std::string(), false /* global_ranking */, |
784 kExperimentID, precache_database_.GetWeakPtr(), task_runner(), | 786 std::move(unfinished_work), kExperimentID, |
785 &precache_delegate_); | 787 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
786 precache_fetcher.Start(); | 788 precache_fetcher.Start(); |
787 | 789 |
788 base::RunLoop().RunUntilIdle(); | 790 base::RunLoop().RunUntilIdle(); |
789 | 791 |
790 std::multiset<GURL> expected_requested_urls; | 792 std::vector<GURL> expected_requested_urls; |
791 expected_requested_urls.insert(GURL(kConfigURL)); | 793 expected_requested_urls.emplace_back(kConfigURL); |
792 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 794 expected_requested_urls.emplace_back(kGoodManifestURL); |
793 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 795 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
794 | 796 |
795 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 797 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
796 } | 798 } |
797 | 799 |
798 TEST_F(PrecacheFetcherTest, BadConfig) { | 800 TEST_F(PrecacheFetcherTest, BadConfig) { |
799 SetDefaultFlags(); | 801 SetDefaultFlags(); |
800 | 802 |
801 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 803 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
802 new PrecacheUnfinishedWork()); | 804 new PrecacheUnfinishedWork()); |
803 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); | 805 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); |
804 | 806 |
805 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK, | 807 factory_.SetFakeResponse(GURL(kConfigURL), "bad protobuf", net::HTTP_OK, |
806 net::URLRequestStatus::SUCCESS); | 808 net::URLRequestStatus::SUCCESS); |
807 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, | 809 factory_.SetFakeResponse(GURL(kGoodManifestURL), "", net::HTTP_OK, |
808 net::URLRequestStatus::SUCCESS); | 810 net::URLRequestStatus::SUCCESS); |
809 | 811 |
810 PrecacheFetcher precache_fetcher( | 812 PrecacheFetcher precache_fetcher( |
811 request_context_.get(), GURL(), std::string(), std::move(unfinished_work), | 813 request_context_.get(), GURL(), std::string(), false /* global_ranking */, |
812 kExperimentID, precache_database_.GetWeakPtr(), task_runner(), | 814 std::move(unfinished_work), kExperimentID, |
813 &precache_delegate_); | 815 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
814 precache_fetcher.Start(); | 816 precache_fetcher.Start(); |
815 | 817 |
816 base::RunLoop().RunUntilIdle(); | 818 base::RunLoop().RunUntilIdle(); |
817 | 819 |
818 std::multiset<GURL> expected_requested_urls; | 820 std::vector<GURL> expected_requested_urls; |
819 expected_requested_urls.insert(GURL(kConfigURL)); | 821 expected_requested_urls.emplace_back(kConfigURL); |
820 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 822 expected_requested_urls.emplace_back(kGoodManifestURL); |
821 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 823 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
822 | 824 |
823 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 825 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
824 } | 826 } |
825 | 827 |
826 TEST_F(PrecacheFetcherTest, Cancel) { | 828 TEST_F(PrecacheFetcherTest, Cancel) { |
827 SetDefaultFlags(); | 829 SetDefaultFlags(); |
828 | 830 |
829 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 831 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
830 new PrecacheUnfinishedWork()); | 832 new PrecacheUnfinishedWork()); |
831 unfinished_work->add_top_host()->set_hostname("starting-url.com"); | 833 unfinished_work->add_top_host()->set_hostname("starting-url.com"); |
832 | 834 |
833 PrecacheConfigurationSettings config; | 835 PrecacheConfigurationSettings config; |
834 config.set_top_sites_count(1); | 836 config.set_top_sites_count(1); |
835 | 837 |
836 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 838 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
837 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 839 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
838 | 840 |
839 base::HistogramTester histogram; | 841 base::HistogramTester histogram; |
840 | 842 |
841 { | 843 { |
842 PrecacheFetcher precache_fetcher( | 844 PrecacheFetcher precache_fetcher( |
843 request_context_.get(), GURL(), std::string(), | 845 request_context_.get(), GURL(), std::string(), |
844 std::move(unfinished_work), kExperimentID, | 846 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
845 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 847 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
846 precache_fetcher.Start(); | 848 precache_fetcher.Start(); |
847 | 849 |
848 // Destroy the PrecacheFetcher, to cancel precaching. No metrics | 850 // Destroy the PrecacheFetcher, to cancel precaching. No metrics |
849 // should be recorded because this should not cause OnDone to be | 851 // should be recorded because this should not cause OnDone to be |
850 // called on the precache delegate. | 852 // called on the precache delegate. |
851 } | 853 } |
852 | 854 |
853 base::RunLoop().RunUntilIdle(); | 855 base::RunLoop().RunUntilIdle(); |
854 | 856 |
855 std::multiset<GURL> expected_requested_urls; | 857 std::vector<GURL> expected_requested_urls; |
856 expected_requested_urls.insert(GURL(kConfigURL)); | 858 expected_requested_urls.emplace_back(kConfigURL); |
857 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 859 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
858 | 860 |
859 EXPECT_FALSE(precache_delegate_.was_on_done_called()); | 861 EXPECT_FALSE(precache_delegate_.was_on_done_called()); |
860 | 862 |
861 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0); | 863 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 0); |
862 } | 864 } |
863 | 865 |
864 #if defined(PRECACHE_CONFIG_SETTINGS_URL) | 866 #if defined(PRECACHE_CONFIG_SETTINGS_URL) |
865 | 867 |
866 // If the default precache configuration settings URL is defined, then test that | 868 // If the default precache configuration settings URL is defined, then test that |
867 // it works with the PrecacheFetcher. | 869 // it works with the PrecacheFetcher. |
868 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { | 870 TEST_F(PrecacheFetcherTest, PrecacheUsingDefaultConfigSettingsURL) { |
869 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 871 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
870 new PrecacheUnfinishedWork()); | 872 new PrecacheUnfinishedWork()); |
871 unfinished_work->add_top_host()->set_hostname("starting-url.com"); | 873 unfinished_work->add_top_host()->set_hostname("starting-url.com"); |
872 | 874 |
873 PrecacheConfigurationSettings config; | 875 PrecacheConfigurationSettings config; |
874 config.set_top_sites_count(0); | 876 config.set_top_sites_count(0); |
875 | 877 |
876 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), | 878 factory_.SetFakeResponse(GURL(PRECACHE_CONFIG_SETTINGS_URL), |
877 config.SerializeAsString(), net::HTTP_OK, | 879 config.SerializeAsString(), net::HTTP_OK, |
878 net::URLRequestStatus::SUCCESS); | 880 net::URLRequestStatus::SUCCESS); |
879 | 881 |
880 PrecacheFetcher precache_fetcher( | 882 PrecacheFetcher precache_fetcher( |
881 request_context_.get(), GURL(), std::string(), std::move(unfinished_work), | 883 request_context_.get(), GURL(), std::string(), false /* global_ranking */, |
882 kExperimentID, precache_database_.GetWeakPtr(), task_runner(), | 884 std::move(unfinished_work), kExperimentID, |
883 &precache_delegate_); | 885 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
884 precache_fetcher.Start(); | 886 precache_fetcher.Start(); |
885 | 887 |
886 base::RunLoop().RunUntilIdle(); | 888 base::RunLoop().RunUntilIdle(); |
887 | 889 |
888 std::multiset<GURL> expected_requested_urls; | 890 std::vector<GURL> expected_requested_urls; |
889 expected_requested_urls.insert(GURL(PRECACHE_CONFIG_SETTINGS_URL)); | 891 expected_requested_urls.emplace_back(PRECACHE_CONFIG_SETTINGS_URL); |
890 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 892 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
891 | 893 |
892 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 894 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
893 } | 895 } |
894 | 896 |
895 #endif // PRECACHE_CONFIG_SETTINGS_URL | 897 #endif // PRECACHE_CONFIG_SETTINGS_URL |
896 | 898 |
897 #if defined(PRECACHE_MANIFEST_URL_PREFIX) | 899 #if defined(PRECACHE_MANIFEST_URL_PREFIX) |
898 | 900 |
899 // If the default precache manifest URL prefix is defined, then test that it | 901 // If the default precache manifest URL prefix is defined, then test that it |
(...skipping 10 matching lines...) Expand all Loading... | |
910 config.set_top_sites_count(1); | 912 config.set_top_sites_count(1); |
911 | 913 |
912 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); | 914 GURL manifest_url(PRECACHE_MANIFEST_URL_PREFIX "starting-url.com"); |
913 | 915 |
914 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 916 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
915 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 917 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
916 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), | 918 factory_.SetFakeResponse(manifest_url, PrecacheManifest().SerializeAsString(), |
917 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 919 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
918 | 920 |
919 PrecacheFetcher precache_fetcher( | 921 PrecacheFetcher precache_fetcher( |
920 request_context_.get(), GURL(), std::string(), std::move(unfinished_work), | 922 request_context_.get(), GURL(), std::string(), false /* global_ranking */, |
921 kExperimentID, precache_database_.GetWeakPtr(), task_runner(), | 923 std::move(unfinished_work), kExperimentID, |
922 &precache_delegate_); | 924 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
923 precache_fetcher.Start(); | 925 precache_fetcher.Start(); |
924 | 926 |
925 base::RunLoop().RunUntilIdle(); | 927 base::RunLoop().RunUntilIdle(); |
926 | 928 |
927 std::multiset<GURL> expected_requested_urls; | 929 std::vector<GURL> expected_requested_urls; |
928 expected_requested_urls.insert(GURL(kConfigURL)); | 930 expected_requested_urls.emplace_back(kConfigURL); |
929 expected_requested_urls.insert(manifest_url); | 931 expected_requested_urls.push_back(manifest_url); |
930 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 932 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
931 | 933 |
932 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 934 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
933 } | 935 } |
934 | 936 |
935 #endif // PRECACHE_MANIFEST_URL_PREFIX | 937 #endif // PRECACHE_MANIFEST_URL_PREFIX |
936 | 938 |
937 TEST_F(PrecacheFetcherTest, TopResourcesCount) { | 939 TEST_F(PrecacheFetcherTest, TopResourcesCount) { |
938 SetDefaultFlags(); | 940 SetDefaultFlags(); |
939 | 941 |
(...skipping 18 matching lines...) Expand all Loading... | |
958 good_manifest.SerializeAsString(), net::HTTP_OK, | 960 good_manifest.SerializeAsString(), net::HTTP_OK, |
959 net::URLRequestStatus::SUCCESS); | 961 net::URLRequestStatus::SUCCESS); |
960 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", | 962 factory_.SetFakeResponse(GURL("http://good-manifest.com/retrieved"), "good", |
961 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 963 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
962 | 964 |
963 base::HistogramTester histogram; | 965 base::HistogramTester histogram; |
964 | 966 |
965 { | 967 { |
966 PrecacheFetcher precache_fetcher( | 968 PrecacheFetcher precache_fetcher( |
967 request_context_.get(), GURL(), std::string(), | 969 request_context_.get(), GURL(), std::string(), |
968 std::move(unfinished_work), kExperimentID, | 970 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
969 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 971 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
970 precache_fetcher.Start(); | 972 precache_fetcher.Start(); |
971 | 973 |
972 base::RunLoop().RunUntilIdle(); | 974 base::RunLoop().RunUntilIdle(); |
973 | 975 |
974 // Destroy the PrecacheFetcher after it has finished, to record metrics. | 976 // Destroy the PrecacheFetcher after it has finished, to record metrics. |
975 } | 977 } |
976 | 978 |
977 std::multiset<GURL> expected_requested_urls; | 979 std::vector<GURL> expected_requested_urls; |
978 expected_requested_urls.insert(GURL(kConfigURL)); | 980 expected_requested_urls.emplace_back(kConfigURL); |
979 expected_requested_urls.insert(GURL(kGoodManifestURL)); | 981 expected_requested_urls.emplace_back(kGoodManifestURL); |
980 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); | 982 expected_requested_urls.emplace_back("http://good-manifest.com/retrieved"); |
981 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); | 983 expected_requested_urls.emplace_back("http://good-manifest.com/retrieved"); |
982 expected_requested_urls.insert(GURL("http://good-manifest.com/retrieved")); | 984 expected_requested_urls.emplace_back("http://good-manifest.com/retrieved"); |
983 | 985 |
984 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 986 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
985 | 987 |
986 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 988 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
987 | 989 |
988 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); | 990 histogram.ExpectUniqueSample("Precache.Fetch.PercentCompleted", 100, 1); |
989 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", | 991 histogram.ExpectUniqueSample("Precache.Fetch.ResponseBytes.Total", |
990 url_callback_.total_response_bytes(), 1); | 992 url_callback_.total_response_bytes(), 1); |
991 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 993 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
992 } | 994 } |
(...skipping 15 matching lines...) Expand all Loading... | |
1008 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are | 1010 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are |
1009 // cancelled midstream. | 1011 // cancelled midstream. |
1010 | 1012 |
1011 TEST_F(PrecacheFetcherTest, MaxBytesTotal) { | 1013 TEST_F(PrecacheFetcherTest, MaxBytesTotal) { |
1012 SetDefaultFlags(); | 1014 SetDefaultFlags(); |
1013 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 1015 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
1014 new PrecacheUnfinishedWork()); | 1016 new PrecacheUnfinishedWork()); |
1015 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); | 1017 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); |
1016 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 1018 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
1017 | 1019 |
1018 const size_t kNumResources = 15; // > kMaxParallelFetches. | 1020 const size_t kNumResources = kMaxParallelFetches + 5; |
bengr
2016/10/14 21:52:19
Please add comments to explain the magic of "5" he
twifkak
2016/10/14 22:41:45
OK, did my best. I don't fully understand this tes
| |
1019 const size_t kMaxBytesTotal = 1000; | 1021 const size_t kMaxBytesTotal = 1000; |
1020 const size_t kBytesPerResource = kMaxBytesTotal / 3; | 1022 const size_t kResourcesWithinMax = kMaxParallelFetches - 7; |
1021 // kBytesPerResource * kMaxParallelFeches > kMaxBytesTotal. | 1023 const size_t kBytesPerResource = kMaxBytesTotal / kResourcesWithinMax; |
1022 | 1024 |
1023 PrecacheConfigurationSettings config; | 1025 PrecacheConfigurationSettings config; |
1024 config.set_max_bytes_total(kMaxBytesTotal); | 1026 config.set_max_bytes_total(kMaxBytesTotal); |
1025 | 1027 |
1026 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 1028 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
1027 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1029 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1028 | 1030 |
1029 PrecacheManifest good_manifest; | 1031 PrecacheManifest good_manifest; |
1030 for (size_t i = 0; i < kNumResources; ++i) { | 1032 for (size_t i = 0; i < kNumResources; ++i) { |
1031 const std::string url = "http://good-manifest.com/" + std::to_string(i); | 1033 const std::string url = "http://good-manifest.com/" + std::to_string(i); |
1032 good_manifest.add_resource()->set_url(url); | 1034 good_manifest.add_resource()->set_url(url); |
1033 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'), | 1035 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'), |
1034 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1036 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1035 } | 1037 } |
1036 | 1038 |
1037 factory_.SetFakeResponse(GURL(kGoodManifestURL), | 1039 factory_.SetFakeResponse(GURL(kGoodManifestURL), |
1038 good_manifest.SerializeAsString(), net::HTTP_OK, | 1040 good_manifest.SerializeAsString(), net::HTTP_OK, |
1039 net::URLRequestStatus::SUCCESS); | 1041 net::URLRequestStatus::SUCCESS); |
1040 | 1042 |
1041 base::HistogramTester histogram; | 1043 base::HistogramTester histogram; |
1042 | 1044 |
1043 { | 1045 { |
1044 PrecacheFetcher precache_fetcher( | 1046 PrecacheFetcher precache_fetcher( |
1045 request_context_.get(), GURL(), std::string(), | 1047 request_context_.get(), GURL(), std::string(), |
1046 std::move(unfinished_work), kExperimentID, | 1048 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1047 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1049 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1048 precache_fetcher.Start(); | 1050 precache_fetcher.Start(); |
1049 | 1051 |
1050 base::RunLoop().RunUntilIdle(); | 1052 base::RunLoop().RunUntilIdle(); |
1051 } | 1053 } |
1052 | 1054 |
1053 // We don't know which will make it and which won't due to the parallelism in | 1055 // We don't know which will make it and which won't due to the parallelism in |
1054 // the pool of Fetchers. | 1056 // the pool of Fetchers. |
1055 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); | 1057 EXPECT_GT(kNumResources, url_callback_.requested_urls().size()); |
1056 | 1058 |
1057 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1059 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
1058 | 1060 |
1059 // good-manifest.com will not have been completed. | 1061 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 1); |
1060 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), | |
1061 ElementsAre(base::Bucket(0, 1))); | |
1062 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 1062 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
1063 } | 1063 } |
1064 | 1064 |
1065 // Tests the parallel fetch behaviour when more precache resource and manifest | 1065 // Tests the parallel fetch behaviour when more precache resource and manifest |
1066 // requests are available than the maximum capacity of fetcher pool. | 1066 // requests are available than the maximum capacity of fetcher pool. |
1067 TEST_F(PrecacheFetcherTest, FetcherPoolMaxLimitReached) { | 1067 TEST_F(PrecacheFetcherTest, FetcherPoolMaxLimitReached) { |
1068 SetDefaultFlags(); | 1068 SetDefaultFlags(); |
1069 | 1069 |
1070 const size_t kNumTopHosts = 5; | 1070 const size_t kNumTopHosts = 5; |
1071 const size_t kNumResources = 15; | 1071 const size_t kNumResources = kMaxParallelFetches + 5; |
1072 | 1072 |
1073 PrecacheConfigurationSettings config; | 1073 PrecacheConfigurationSettings config; |
1074 PrecacheManifest top_host_manifest[kNumTopHosts]; | 1074 std::vector<GURL> expected_requested_urls; |
1075 std::multiset<GURL> expected_requested_urls; | |
1076 | 1075 |
1077 config.set_top_sites_count(kNumTopHosts); | 1076 config.set_top_sites_count(kNumTopHosts); |
1078 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 1077 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
1079 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1078 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1080 expected_requested_urls.insert(GURL(kConfigURL)); | 1079 expected_requested_urls.emplace_back(kConfigURL); |
1081 | 1080 |
1082 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 1081 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
1083 new PrecacheUnfinishedWork()); | 1082 new PrecacheUnfinishedWork()); |
1084 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 1083 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
1085 | 1084 |
1086 for (size_t i = 0; i < kNumTopHosts; ++i) { | 1085 for (size_t i = 0; i < kNumTopHosts; ++i) { |
1087 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | 1086 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); |
1087 expected_requested_urls.emplace_back(kManifestURLPrefix + top_host_url); | |
1088 } | |
1089 | |
1090 for (size_t i = 0; i < kNumTopHosts; ++i) { | |
1091 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | |
1088 unfinished_work->add_top_host()->set_hostname(top_host_url); | 1092 unfinished_work->add_top_host()->set_hostname(top_host_url); |
1089 | 1093 |
1094 PrecacheManifest manifest; | |
1090 for (size_t j = 0; j < kNumResources; ++j) { | 1095 for (size_t j = 0; j < kNumResources; ++j) { |
1091 const std::string resource_url = | 1096 const std::string resource_url = |
1092 base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j); | 1097 base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j); |
1093 top_host_manifest[i].add_resource()->set_url(resource_url); | 1098 manifest.add_resource()->set_url(resource_url); |
1094 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, | 1099 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, |
1095 net::URLRequestStatus::SUCCESS); | 1100 net::URLRequestStatus::SUCCESS); |
1096 expected_requested_urls.insert(GURL(resource_url)); | 1101 expected_requested_urls.emplace_back(resource_url); |
1097 } | 1102 } |
1098 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), | 1103 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), |
1099 top_host_manifest[i].SerializeAsString(), | 1104 manifest.SerializeAsString(), net::HTTP_OK, |
1100 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1105 net::URLRequestStatus::SUCCESS); |
1101 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url)); | |
1102 } | 1106 } |
1103 | 1107 |
1104 base::HistogramTester histogram; | 1108 base::HistogramTester histogram; |
1105 | 1109 |
1106 { | 1110 { |
1107 PrecacheFetcher precache_fetcher( | 1111 PrecacheFetcher precache_fetcher( |
1108 request_context_.get(), GURL(), std::string(), | 1112 request_context_.get(), GURL(), std::string(), |
1109 std::move(unfinished_work), kExperimentID, | 1113 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1110 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1114 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1111 precache_fetcher.Start(); | 1115 precache_fetcher.Start(); |
1112 | 1116 |
1113 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size()); | 1117 EXPECT_GT(kNumResources, precache_fetcher.pool_.max_size()); |
1114 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher); | 1118 CheckUntilParallelFetchesBeyondCapacity(&precache_fetcher); |
1115 | 1119 |
1116 base::RunLoop().RunUntilIdle(); | 1120 base::RunLoop().RunUntilIdle(); |
1117 | 1121 |
1118 // Destroy the PrecacheFetcher after it has finished, to record metrics. | 1122 // Destroy the PrecacheFetcher after it has finished, to record metrics. |
1119 } | 1123 } |
(...skipping 21 matching lines...) Expand all Loading... | |
1141 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 1145 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
1142 | 1146 |
1143 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, | 1147 factory_.SetFakeResponse(GURL(kConfigURL), "", net::HTTP_OK, |
1144 net::URLRequestStatus::SUCCESS); | 1148 net::URLRequestStatus::SUCCESS); |
1145 | 1149 |
1146 base::HistogramTester histogram; | 1150 base::HistogramTester histogram; |
1147 | 1151 |
1148 { | 1152 { |
1149 PrecacheFetcher precache_fetcher( | 1153 PrecacheFetcher precache_fetcher( |
1150 request_context_.get(), GURL(), std::string(), | 1154 request_context_.get(), GURL(), std::string(), |
1151 std::move(unfinished_work), kExperimentID, | 1155 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1152 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1156 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1153 precache_fetcher.Start(); | 1157 precache_fetcher.Start(); |
1154 | 1158 |
1155 base::RunLoop().RunUntilIdle(); | 1159 base::RunLoop().RunUntilIdle(); |
1156 } | 1160 } |
1157 | 1161 |
1158 // The config is fetched, but not the invalid manifest URL. | 1162 // The config is fetched, but not the invalid manifest URL. |
1159 EXPECT_EQ(1UL, url_callback_.requested_urls().size()); | 1163 EXPECT_EQ(1UL, url_callback_.requested_urls().size()); |
1160 | 1164 |
1161 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1165 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
(...skipping 19 matching lines...) Expand all Loading... | |
1181 | 1185 |
1182 factory_.SetFakeResponse(GURL(kBadManifestURL), | 1186 factory_.SetFakeResponse(GURL(kBadManifestURL), |
1183 bad_manifest.SerializeAsString(), net::HTTP_OK, | 1187 bad_manifest.SerializeAsString(), net::HTTP_OK, |
1184 net::URLRequestStatus::SUCCESS); | 1188 net::URLRequestStatus::SUCCESS); |
1185 | 1189 |
1186 base::HistogramTester histogram; | 1190 base::HistogramTester histogram; |
1187 | 1191 |
1188 { | 1192 { |
1189 PrecacheFetcher precache_fetcher( | 1193 PrecacheFetcher precache_fetcher( |
1190 request_context_.get(), GURL(), std::string(), | 1194 request_context_.get(), GURL(), std::string(), |
1191 std::move(unfinished_work), kExperimentID, | 1195 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1192 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1196 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1193 precache_fetcher.Start(); | 1197 precache_fetcher.Start(); |
1194 | 1198 |
1195 base::RunLoop().RunUntilIdle(); | 1199 base::RunLoop().RunUntilIdle(); |
1196 } | 1200 } |
1197 | 1201 |
1198 // The config and manifest are fetched, but not the invalid resource URL. | 1202 // The config and manifest are fetched, but not the invalid resource URL. |
1199 EXPECT_EQ(2UL, url_callback_.requested_urls().size()); | 1203 EXPECT_EQ(2UL, url_callback_.requested_urls().size()); |
1200 | 1204 |
1201 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1205 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
1202 | 1206 |
1203 // bad-manifest.com will have been completed. | 1207 // bad-manifest.com will have been completed. |
1204 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), | 1208 EXPECT_THAT(histogram.GetAllSamples("Precache.Fetch.PercentCompleted"), |
1205 ElementsAre(base::Bucket(100, 1))); | 1209 ElementsAre(base::Bucket(0, 1))); |
1206 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 1210 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
1207 } | 1211 } |
1208 | 1212 |
1209 TEST(PrecacheFetcherStandaloneTest, GetResourceURLBase64Hash) { | 1213 TEST(PrecacheFetcherStandaloneTest, GetResourceURLBase64Hash) { |
1210 // Expected base64 hash for some selected URLs. | 1214 // Expected base64 hash for some selected URLs. |
1211 EXPECT_EQ("dVSI/sC1cGk=", PrecacheFetcher::GetResourceURLBase64HashForTesting( | 1215 EXPECT_EQ("dVSI/sC1cGk=", PrecacheFetcher::GetResourceURLBase64HashForTesting( |
1212 {GURL("http://used-resource-1/a.js")})); | 1216 {GURL("http://used-resource-1/a.js")})); |
1213 EXPECT_EQ("B/Jc6JvusZQ=", PrecacheFetcher::GetResourceURLBase64HashForTesting( | 1217 EXPECT_EQ("B/Jc6JvusZQ=", PrecacheFetcher::GetResourceURLBase64HashForTesting( |
1214 {GURL("http://used-resource-1/b.js")})); | 1218 {GURL("http://used-resource-1/b.js")})); |
1215 EXPECT_EQ("CmvACGJ4k08=", PrecacheFetcher::GetResourceURLBase64HashForTesting( | 1219 EXPECT_EQ("CmvACGJ4k08=", PrecacheFetcher::GetResourceURLBase64HashForTesting( |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1274 true)), | 1278 true)), |
1275 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1279 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1276 factory_.SetFakeResponse( | 1280 factory_.SetFakeResponse( |
1277 GURL(std::string(kManifestURLPrefix) + | 1281 GURL(std::string(kManifestURLPrefix) + |
1278 "top-host-3.com?manifest=1003&used_resources=&unused_resources="), | 1282 "top-host-3.com?manifest=1003&used_resources=&unused_resources="), |
1279 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1283 std::string(), net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1280 | 1284 |
1281 { | 1285 { |
1282 PrecacheFetcher precache_fetcher( | 1286 PrecacheFetcher precache_fetcher( |
1283 request_context_.get(), GURL(), std::string(), | 1287 request_context_.get(), GURL(), std::string(), |
1284 std::move(unfinished_work), kExperimentID, | 1288 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1285 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1289 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1286 precache_fetcher.Start(); | 1290 precache_fetcher.Start(); |
1287 | 1291 |
1288 base::RunLoop().RunUntilIdle(); | 1292 base::RunLoop().RunUntilIdle(); |
1289 } | 1293 } |
1290 } | 1294 } |
1291 | 1295 |
1296 TEST_F(PrecacheFetcherTest, GloballyRankResources) { | |
1297 SetDefaultFlags(); | |
1298 | |
1299 const size_t kNumTopHosts = 5; | |
1300 const size_t kNumResources = 5; | |
1301 | |
1302 PrecacheConfigurationSettings config; | |
1303 std::vector<GURL> expected_requested_urls; | |
1304 std::unique_ptr<PrecacheUnfinishedWork> cancelled_work; | |
1305 | |
1306 config.set_top_sites_count(kNumTopHosts); | |
1307 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | |
1308 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | |
1309 expected_requested_urls.emplace_back(kConfigURL); | |
1310 | |
1311 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | |
1312 new PrecacheUnfinishedWork()); | |
1313 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | |
1314 | |
1315 for (size_t i = 0; i < kNumTopHosts; ++i) { | |
1316 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | |
1317 expected_requested_urls.emplace_back(kManifestURLPrefix + top_host_url); | |
1318 } | |
1319 | |
1320 // Visit counts and weights are chosen in such a way that resource requests | |
1321 // between different hosts will be interleaved. | |
1322 std::vector<std::pair<std::string, float>> resources; | |
1323 for (size_t i = 0; i < kNumTopHosts; ++i) { | |
1324 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | |
1325 TopHost* top_host = unfinished_work->add_top_host(); | |
1326 top_host->set_hostname(top_host_url); | |
1327 top_host->set_visits(kNumTopHosts - i); | |
1328 | |
1329 PrecacheManifest manifest; | |
1330 for (size_t j = 0; j < kNumResources; ++j) { | |
1331 const float weight = 1 - static_cast<float>(j) / kNumResources; | |
1332 const std::string resource_url = | |
1333 base::StringPrintf("http://top-host-%zu.com/resource-%zu-weight-%.1f", | |
1334 i, j, top_host->visits() * weight); | |
1335 PrecacheResource* resource = manifest.add_resource(); | |
1336 resource->set_url(resource_url); | |
1337 resource->set_weight_ratio(weight); | |
1338 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, | |
1339 net::URLRequestStatus::SUCCESS); | |
1340 resources.emplace_back(resource_url, | |
1341 top_host->visits() * resource->weight_ratio()); | |
1342 } | |
1343 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), | |
1344 manifest.SerializeAsString(), net::HTTP_OK, | |
1345 net::URLRequestStatus::SUCCESS); | |
1346 } | |
1347 // Sort by descending weight. | |
1348 std::stable_sort(resources.begin(), resources.end(), | |
1349 [](const std::pair<std::string, float>& a, | |
1350 const std::pair<std::string, float>& b) { | |
1351 return a.second > b.second; | |
1352 }); | |
1353 for (const auto& resource : resources) | |
1354 expected_requested_urls.emplace_back(resource.first); | |
1355 | |
1356 { | |
1357 PrecacheFetcher precache_fetcher( | |
1358 request_context_.get(), GURL(), std::string(), | |
1359 true /* global_ranking */, std::move(unfinished_work), kExperimentID, | |
1360 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | |
1361 precache_fetcher.Start(); | |
1362 base::RunLoop().RunUntilIdle(); | |
1363 } | |
1364 | |
1365 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | |
1366 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | |
1367 } | |
1368 | |
1369 TEST_F(PrecacheFetcherTest, GloballyRankResourcesAfterPauseResume) { | |
1370 SetDefaultFlags(); | |
1371 | |
1372 const size_t kNumTopHosts = 5; | |
1373 const size_t kNumResources = 5; | |
1374 | |
1375 PrecacheConfigurationSettings config; | |
1376 std::vector<GURL> expected_requested_urls; | |
1377 std::unique_ptr<PrecacheUnfinishedWork> cancelled_work; | |
1378 | |
1379 config.set_top_sites_count(kNumTopHosts); | |
1380 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | |
1381 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | |
1382 | |
1383 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | |
1384 new PrecacheUnfinishedWork()); | |
1385 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | |
1386 | |
1387 // Visit counts and weights are chosen in such a way that resource requests | |
1388 // between different hosts will be interleaved. | |
1389 std::vector<std::pair<std::string, float>> resources; | |
1390 for (size_t i = 0; i < kNumTopHosts; ++i) { | |
1391 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | |
1392 TopHost* top_host = unfinished_work->add_top_host(); | |
1393 top_host->set_hostname(top_host_url); | |
1394 top_host->set_visits(kNumTopHosts - i); | |
1395 | |
1396 PrecacheManifest manifest; | |
1397 for (size_t j = 0; j < kNumResources; ++j) { | |
1398 const float weight = 1 - static_cast<float>(j) / kNumResources; | |
1399 const std::string resource_url = | |
1400 base::StringPrintf("http://top-host-%zu.com/resource-%zu-weight-%.1f", | |
1401 i, j, top_host->visits() * weight); | |
1402 PrecacheResource* resource = manifest.add_resource(); | |
1403 resource->set_url(resource_url); | |
1404 resource->set_weight_ratio(weight); | |
1405 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, | |
1406 net::URLRequestStatus::SUCCESS); | |
1407 resources.emplace_back(resource_url, | |
1408 top_host->visits() * resource->weight_ratio()); | |
1409 } | |
1410 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), | |
1411 manifest.SerializeAsString(), net::HTTP_OK, | |
1412 net::URLRequestStatus::SUCCESS); | |
1413 } | |
1414 // Sort by descending weight. | |
1415 std::stable_sort(resources.begin(), resources.end(), | |
1416 [](const std::pair<std::string, float>& a, | |
1417 const std::pair<std::string, float>& b) { | |
1418 return a.second > b.second; | |
1419 }); | |
1420 for (const auto& resource : resources) | |
1421 expected_requested_urls.emplace_back(resource.first); | |
1422 | |
1423 { | |
1424 uint32_t remaining_tries = 100; | |
1425 PrecacheFetcher precache_fetcher( | |
1426 request_context_.get(), GURL(), std::string(), | |
1427 true /* global_ranking */, std::move(unfinished_work), kExperimentID, | |
1428 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | |
1429 precache_fetcher.Start(); | |
1430 | |
1431 // Run the loop until all tophost manifest fetches are complete, but some | |
1432 // resource fetches are pending. | |
1433 while (--remaining_tries != 0 && | |
1434 (!precache_fetcher.top_hosts_to_fetch_.empty() || | |
1435 !precache_fetcher.top_hosts_fetching_.empty() || | |
1436 !precache_fetcher.unfinished_work_->has_config_settings() || | |
1437 precache_fetcher.resources_to_fetch_.empty())) { | |
1438 LOG(INFO) << "remaining_tries: " << remaining_tries; | |
1439 base::RunLoop run_loop; | |
1440 loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure()); | |
1441 run_loop.Run(); | |
1442 } | |
1443 | |
1444 // Cancel precaching. | |
1445 cancelled_work = precache_fetcher.CancelPrecaching(); | |
1446 EXPECT_TRUE(precache_fetcher.top_hosts_to_fetch_.empty()); | |
1447 EXPECT_TRUE(precache_fetcher.resources_to_fetch_.empty()); | |
1448 } | |
1449 EXPECT_NE(cancelled_work, nullptr); | |
1450 EXPECT_TRUE(cancelled_work->top_host().empty()); | |
1451 EXPECT_EQ(kNumTopHosts * kNumResources, | |
1452 static_cast<size_t>(cancelled_work->resource().size())); | |
1453 EXPECT_FALSE(precache_delegate_.was_on_done_called()); | |
1454 | |
1455 url_callback_.clear_requested_urls(); | |
1456 | |
1457 // Continuing with the precache should fetch all resources, as the previous | |
1458 // run was cancelled before any finished. They should be fetched in global | |
1459 // ranking order. | |
1460 { | |
1461 PrecacheFetcher precache_fetcher( | |
1462 request_context_.get(), GURL(), std::string(), | |
1463 true /* global_ranking */, std::move(cancelled_work), kExperimentID, | |
1464 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | |
1465 LOG(INFO) << "Resuming prefetch."; | |
1466 precache_fetcher.Start(); | |
1467 base::RunLoop().RunUntilIdle(); | |
1468 } | |
1469 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | |
1470 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | |
1471 } | |
1472 | |
1473 TEST_F(PrecacheFetcherTest, MaxTotalResources) { | |
1474 SetDefaultFlags(); | |
1475 | |
1476 const size_t kNumResources = 5; | |
1477 | |
1478 PrecacheConfigurationSettings config; | |
1479 std::vector<GURL> expected_requested_urls; | |
1480 | |
1481 config.set_total_resources_count(2); | |
1482 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | |
1483 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | |
1484 expected_requested_urls.emplace_back(kConfigURL); | |
1485 | |
1486 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | |
1487 new PrecacheUnfinishedWork()); | |
1488 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | |
1489 | |
1490 TopHost* top_host = unfinished_work->add_top_host(); | |
1491 top_host->set_hostname("top-host.com"); | |
1492 top_host->set_visits(1); | |
1493 | |
1494 expected_requested_urls.emplace_back(kManifestURLPrefix + | |
1495 top_host->hostname()); | |
1496 | |
1497 PrecacheManifest manifest; | |
1498 for (size_t i = 0; i < kNumResources; ++i) { | |
1499 const float weight = 1 - static_cast<float>(i) / kNumResources; | |
1500 const std::string resource_url = | |
1501 base::StringPrintf("http://top-host.com/resource-%zu-weight-%.1f", i, | |
1502 top_host->visits() * weight); | |
1503 PrecacheResource* resource = manifest.add_resource(); | |
1504 resource->set_url(resource_url); | |
1505 resource->set_weight_ratio(weight); | |
1506 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, | |
1507 net::URLRequestStatus::SUCCESS); | |
1508 if (i < config.total_resources_count()) | |
1509 expected_requested_urls.emplace_back(resource_url); | |
1510 } | |
1511 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host->hostname()), | |
1512 manifest.SerializeAsString(), net::HTTP_OK, | |
1513 net::URLRequestStatus::SUCCESS); | |
1514 | |
1515 { | |
1516 PrecacheFetcher precache_fetcher( | |
1517 request_context_.get(), GURL(), std::string(), | |
1518 true /* global_ranking */, std::move(unfinished_work), kExperimentID, | |
1519 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | |
1520 precache_fetcher.Start(); | |
1521 base::RunLoop().RunUntilIdle(); | |
1522 } | |
1523 | |
1524 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | |
1525 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | |
1526 } | |
1527 | |
1528 TEST_F(PrecacheFetcherTest, MinWeight) { | |
1529 SetDefaultFlags(); | |
1530 | |
1531 const size_t kNumResources = 5; | |
1532 | |
1533 PrecacheConfigurationSettings config; | |
1534 std::vector<GURL> expected_requested_urls; | |
1535 | |
1536 config.set_min_weight(3); | |
1537 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | |
1538 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | |
1539 expected_requested_urls.emplace_back(kConfigURL); | |
1540 | |
1541 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | |
1542 new PrecacheUnfinishedWork()); | |
1543 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | |
1544 | |
1545 TopHost* top_host = unfinished_work->add_top_host(); | |
1546 top_host->set_hostname("top-host.com"); | |
1547 top_host->set_visits(5); | |
1548 | |
1549 expected_requested_urls.emplace_back(kManifestURLPrefix + | |
1550 top_host->hostname()); | |
1551 | |
1552 PrecacheManifest manifest; | |
1553 for (size_t i = 0; i < kNumResources; ++i) { | |
1554 const float weight = 1 - static_cast<float>(i) / kNumResources; | |
1555 const std::string resource_url = | |
1556 base::StringPrintf("http://top-host.com/resource-%zu-weight-%.1f", i, | |
1557 top_host->visits() * weight); | |
1558 PrecacheResource* resource = manifest.add_resource(); | |
1559 resource->set_url(resource_url); | |
1560 resource->set_weight_ratio(weight); | |
1561 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, | |
1562 net::URLRequestStatus::SUCCESS); | |
1563 // If top_host->visits() * weight > config.min_weight(): | |
1564 if (i < 3) | |
1565 expected_requested_urls.emplace_back(resource_url); | |
1566 } | |
1567 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host->hostname()), | |
1568 manifest.SerializeAsString(), net::HTTP_OK, | |
1569 net::URLRequestStatus::SUCCESS); | |
1570 | |
1571 { | |
1572 PrecacheFetcher precache_fetcher( | |
1573 request_context_.get(), GURL(), std::string(), | |
1574 true /* global_ranking */, std::move(unfinished_work), kExperimentID, | |
1575 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | |
1576 precache_fetcher.Start(); | |
1577 base::RunLoop().RunUntilIdle(); | |
1578 } | |
1579 | |
1580 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | |
1581 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | |
1582 } | |
1583 | |
1292 // Tests cancel precaching when all tophost manifests are fetched, but some | 1584 // Tests cancel precaching when all tophost manifests are fetched, but some |
1293 // resource fetches are pending. | 1585 // resource fetches are pending. |
1294 TEST_F(PrecacheFetcherTest, CancelPrecachingAfterAllManifestFetch) { | 1586 TEST_F(PrecacheFetcherTest, CancelPrecachingAfterAllManifestFetch) { |
1295 SetDefaultFlags(); | 1587 SetDefaultFlags(); |
1296 | 1588 |
1297 const size_t kNumTopHosts = 5; | 1589 const size_t kNumTopHosts = 5; |
1298 const size_t kNumResources = 5; | 1590 const size_t kNumResources = 5; |
1299 const size_t kMaxParallelFetches = 10; | |
1300 | 1591 |
1301 PrecacheConfigurationSettings config; | 1592 PrecacheConfigurationSettings config; |
1302 PrecacheManifest top_host_manifest[kNumTopHosts]; | 1593 std::vector<GURL> expected_requested_urls; |
1303 std::multiset<GURL> expected_requested_urls; | |
1304 std::unique_ptr<PrecacheUnfinishedWork> cancelled_work; | 1594 std::unique_ptr<PrecacheUnfinishedWork> cancelled_work; |
1305 | 1595 |
1306 config.set_top_sites_count(kNumTopHosts); | 1596 config.set_top_sites_count(kNumTopHosts); |
1307 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 1597 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
1308 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1598 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1309 expected_requested_urls.insert(GURL(kConfigURL)); | 1599 expected_requested_urls.emplace_back(kConfigURL); |
1310 | 1600 |
1311 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 1601 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
1312 new PrecacheUnfinishedWork()); | 1602 new PrecacheUnfinishedWork()); |
1313 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 1603 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
1314 | 1604 |
1315 for (size_t i = 0; i < kNumTopHosts; ++i) { | 1605 for (size_t i = 0; i < kNumTopHosts; ++i) { |
1316 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | 1606 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); |
1317 unfinished_work->add_top_host()->set_hostname(top_host_url); | 1607 expected_requested_urls.emplace_back(kManifestURLPrefix + top_host_url); |
1608 } | |
1318 | 1609 |
1610 int num_resources = 0; | |
1611 for (size_t i = 0; i < kNumTopHosts; ++i) { | |
1612 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | |
1613 TopHost* top_host = unfinished_work->add_top_host(); | |
1614 top_host->set_hostname(top_host_url); | |
1615 top_host->set_visits(kNumTopHosts - i); | |
1616 | |
1617 PrecacheManifest manifest; | |
1319 for (size_t j = 0; j < kNumResources; ++j) { | 1618 for (size_t j = 0; j < kNumResources; ++j) { |
1320 const std::string resource_url = | 1619 const std::string resource_url = |
1321 base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j); | 1620 base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j); |
1322 top_host_manifest[i].add_resource()->set_url(resource_url); | 1621 PrecacheResource* resource = manifest.add_resource(); |
1622 resource->set_url(resource_url); | |
1623 resource->set_weight_ratio(1); | |
1323 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, | 1624 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, |
1324 net::URLRequestStatus::SUCCESS); | 1625 net::URLRequestStatus::SUCCESS); |
1325 if (i < kNumTopHosts - 1) | 1626 if (++num_resources <= kMaxParallelFetches) |
1326 expected_requested_urls.insert(GURL(resource_url)); | 1627 expected_requested_urls.emplace_back(resource_url); |
1327 } | 1628 } |
1328 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), | 1629 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url), |
1329 top_host_manifest[i].SerializeAsString(), | 1630 manifest.SerializeAsString(), net::HTTP_OK, |
1330 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1631 net::URLRequestStatus::SUCCESS); |
1331 expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url)); | |
1332 } | 1632 } |
1333 | 1633 |
1334 { | 1634 { |
1335 uint32_t remaining_tries = 100; | 1635 uint32_t remaining_tries = 100; |
1336 PrecacheFetcher precache_fetcher( | 1636 PrecacheFetcher precache_fetcher( |
1337 request_context_.get(), GURL(), std::string(), | 1637 request_context_.get(), GURL(), std::string(), |
1338 std::move(unfinished_work), kExperimentID, | 1638 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1339 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1639 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1340 precache_fetcher.Start(); | 1640 precache_fetcher.Start(); |
1341 | 1641 |
1342 // Run the loop until all tophost manifest fetches are complete, but some | 1642 // Run the loop until all tophost manifest fetches are complete, but some |
1343 // resource fetches are pending. | 1643 // resource fetches are pending. |
1344 while (--remaining_tries != 0 && | 1644 while (--remaining_tries != 0 && |
1345 (!precache_fetcher.top_hosts_to_fetch_.empty() || | 1645 (!precache_fetcher.top_hosts_to_fetch_.empty() || |
1646 !precache_fetcher.top_hosts_fetching_.empty() || | |
1346 !precache_fetcher.unfinished_work_->has_config_settings() || | 1647 !precache_fetcher.unfinished_work_->has_config_settings() || |
1347 precache_fetcher.resources_to_fetch_.empty())) { | 1648 precache_fetcher.resources_to_fetch_.empty())) { |
1649 LOG(INFO) << "remaining_tries: " << remaining_tries; | |
1348 base::RunLoop run_loop; | 1650 base::RunLoop run_loop; |
1349 loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure()); | 1651 loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure()); |
1350 run_loop.Run(); | 1652 run_loop.Run(); |
1351 } | 1653 } |
1352 | 1654 |
1353 // Cancel precaching. | 1655 // Cancel precaching. |
1354 cancelled_work = precache_fetcher.CancelPrecaching(); | 1656 cancelled_work = precache_fetcher.CancelPrecaching(); |
1355 EXPECT_TRUE(precache_fetcher.top_hosts_to_fetch_.empty()); | 1657 EXPECT_TRUE(precache_fetcher.top_hosts_to_fetch_.empty()); |
1356 EXPECT_TRUE(precache_fetcher.resources_to_fetch_.empty()); | 1658 EXPECT_TRUE(precache_fetcher.resources_to_fetch_.empty()); |
1357 } | 1659 } |
1358 EXPECT_NE(cancelled_work, nullptr); | 1660 ASSERT_NE(nullptr, cancelled_work); |
1359 EXPECT_TRUE(cancelled_work->top_host().empty()); | 1661 EXPECT_TRUE(cancelled_work->top_host().empty()); |
1360 EXPECT_EQ(static_cast<size_t>(cancelled_work->resource().size()), | 1662 EXPECT_EQ(kNumTopHosts * kNumResources, |
1361 kMaxParallelFetches + kNumResources); | 1663 static_cast<size_t>(cancelled_work->resource().size())); |
1362 | 1664 |
1363 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 1665 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
1364 | 1666 |
1365 EXPECT_FALSE(precache_delegate_.was_on_done_called()); | 1667 EXPECT_FALSE(precache_delegate_.was_on_done_called()); |
1366 | 1668 |
1367 // Continuing with the precache should only fetch the pending resources in the | 1669 // Continuing with the precache should fetch all resources, as the previous |
1368 // previous run. | 1670 // run was cancelled before any finished. |
1369 expected_requested_urls.clear(); | 1671 expected_requested_urls.clear(); |
1370 url_callback_.clear_requested_urls(); | 1672 url_callback_.clear_requested_urls(); |
1371 for (size_t i = 2; i < kNumTopHosts; ++i) { | 1673 for (size_t i = 0; i < kNumTopHosts; ++i) { |
1372 for (size_t j = 0; j < kNumResources; ++j) { | 1674 for (size_t j = 0; j < kNumResources; ++j) { |
1373 expected_requested_urls.insert(GURL( | 1675 expected_requested_urls.emplace_back( |
1374 base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j))); | 1676 base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j)); |
1375 } | 1677 } |
1376 } | 1678 } |
1377 { | 1679 { |
1378 PrecacheFetcher precache_fetcher( | 1680 PrecacheFetcher precache_fetcher( |
1379 request_context_.get(), GURL(), std::string(), | 1681 request_context_.get(), GURL(), std::string(), |
1380 std::move(cancelled_work), kExperimentID, | 1682 false /* global_ranking */, std::move(cancelled_work), kExperimentID, |
1381 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1683 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1684 LOG(INFO) << "Resuming prefetch."; | |
1382 precache_fetcher.Start(); | 1685 precache_fetcher.Start(); |
1383 base::RunLoop().RunUntilIdle(); | 1686 base::RunLoop().RunUntilIdle(); |
1384 } | 1687 } |
1385 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 1688 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
1386 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1689 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
1387 } | 1690 } |
1388 | 1691 |
1389 TEST_F(PrecacheFetcherTest, DailyQuota) { | 1692 TEST_F(PrecacheFetcherTest, DailyQuota) { |
1390 SetDefaultFlags(); | 1693 SetDefaultFlags(); |
1391 | 1694 |
1392 const size_t kNumTopHosts = 3; | 1695 const size_t kNumTopHosts = 3; |
1393 | 1696 |
1394 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( | 1697 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( |
1395 new PrecacheUnfinishedWork()); | 1698 new PrecacheUnfinishedWork()); |
1396 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); | 1699 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); |
1397 | 1700 |
1398 PrecacheConfigurationSettings config; | 1701 PrecacheConfigurationSettings config; |
1399 config.set_top_sites_count(kNumTopHosts); | 1702 config.set_top_sites_count(kNumTopHosts); |
1400 config.set_daily_quota_total(10000); | 1703 config.set_daily_quota_total(10000); |
1401 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), | 1704 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), |
1402 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1705 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1403 std::multiset<GURL> expected_requested_urls; | 1706 std::vector<GURL> expected_requested_urls; |
1404 expected_requested_urls.insert(GURL(kConfigURL)); | 1707 expected_requested_urls.emplace_back(kConfigURL); |
1405 | 1708 |
1406 for (size_t i = 0; i < kNumTopHosts; ++i) { | 1709 for (size_t i = 0; i < kNumTopHosts; ++i) { |
1407 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | 1710 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); |
1711 expected_requested_urls.emplace_back(std::string(kManifestURLPrefix) + | |
1712 top_host_url); | |
1713 } | |
1714 | |
1715 for (size_t i = 0; i < kNumTopHosts; ++i) { | |
1716 const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i); | |
1408 const std::string resource_url = | 1717 const std::string resource_url = |
1409 base::StringPrintf("http://top-host-%zu.com/resource.html", i); | 1718 base::StringPrintf("http://top-host-%zu.com/resource.html", i); |
1410 PrecacheManifest manifest; | 1719 PrecacheManifest manifest; |
1411 manifest.add_resource()->set_url(resource_url); | 1720 manifest.add_resource()->set_url(resource_url); |
1412 | 1721 |
1413 unfinished_work->add_top_host()->set_hostname(top_host_url); | 1722 unfinished_work->add_top_host()->set_hostname(top_host_url); |
1414 factory_.SetFakeResponse( | 1723 factory_.SetFakeResponse( |
1415 GURL(std::string(kManifestURLPrefix) + top_host_url), | 1724 GURL(std::string(kManifestURLPrefix) + top_host_url), |
1416 manifest.SerializeAsString(), net::HTTP_OK, | 1725 manifest.SerializeAsString(), net::HTTP_OK, |
1417 net::URLRequestStatus::SUCCESS); | 1726 net::URLRequestStatus::SUCCESS); |
1418 // Set a 5000 byte resource. | 1727 // Set a 5000 byte resource. |
1419 factory_.SetFakeResponse(GURL(resource_url), std::string(5000, 'a'), | 1728 factory_.SetFakeResponse(GURL(resource_url), std::string(5000, 'a'), |
1420 net::HTTP_OK, net::URLRequestStatus::SUCCESS); | 1729 net::HTTP_OK, net::URLRequestStatus::SUCCESS); |
1421 | 1730 |
1422 expected_requested_urls.insert( | 1731 expected_requested_urls.emplace_back(resource_url); |
1423 GURL((std::string(kManifestURLPrefix) + top_host_url))); | |
1424 expected_requested_urls.insert(GURL(resource_url)); | |
1425 } | 1732 } |
1426 | 1733 |
1427 base::HistogramTester histogram; | 1734 base::HistogramTester histogram; |
1428 | 1735 |
1429 { | 1736 { |
1430 PrecacheFetcher precache_fetcher( | 1737 PrecacheFetcher precache_fetcher( |
1431 request_context_.get(), GURL(), std::string(), | 1738 request_context_.get(), GURL(), std::string(), |
1432 std::move(unfinished_work), kExperimentID, | 1739 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1433 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1740 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1434 precache_fetcher.Start(); | 1741 precache_fetcher.Start(); |
1435 | 1742 |
1436 base::RunLoop().RunUntilIdle(); | 1743 base::RunLoop().RunUntilIdle(); |
1437 | 1744 |
1438 EXPECT_EQ(0U, precache_fetcher.quota_.remaining()); | 1745 EXPECT_EQ(0U, precache_fetcher.quota_.remaining()); |
1439 unfinished_work = precache_fetcher.CancelPrecaching(); | 1746 unfinished_work = precache_fetcher.CancelPrecaching(); |
1440 } | 1747 } |
1441 | 1748 |
1442 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 1749 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
1443 | 1750 |
1444 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1751 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
1445 | 1752 |
1753 EXPECT_EQ(0, unfinished_work->top_host_size()); | |
1754 EXPECT_EQ(1, unfinished_work->resource_size()); | |
1755 | |
1446 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 1); | 1756 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 1); |
1447 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 1); | 1757 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 1); |
1448 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); | 1758 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); |
1449 | 1759 |
1450 // Continuing with the precache when quota limit is reached, will not fetch | 1760 // Continuing with the precache when quota limit is reached, will not fetch |
1451 // any resources. | 1761 // any resources. |
1452 expected_requested_urls.clear(); | 1762 expected_requested_urls.clear(); |
1453 url_callback_.clear_requested_urls(); | 1763 url_callback_.clear_requested_urls(); |
1454 { | 1764 { |
1455 PrecacheFetcher precache_fetcher( | 1765 PrecacheFetcher precache_fetcher( |
1456 request_context_.get(), GURL(), std::string(), | 1766 request_context_.get(), GURL(), std::string(), |
1457 std::move(unfinished_work), kExperimentID, | 1767 false /* global_ranking */, std::move(unfinished_work), kExperimentID, |
1458 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); | 1768 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); |
1459 precache_fetcher.Start(); | 1769 precache_fetcher.Start(); |
1460 base::RunLoop().RunUntilIdle(); | 1770 base::RunLoop().RunUntilIdle(); |
1461 | 1771 |
1462 EXPECT_EQ(0U, precache_fetcher.quota_.remaining()); | 1772 EXPECT_EQ(0U, precache_fetcher.quota_.remaining()); |
1463 } | 1773 } |
1464 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); | 1774 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); |
1465 | 1775 |
1466 EXPECT_TRUE(precache_delegate_.was_on_done_called()); | 1776 EXPECT_TRUE(precache_delegate_.was_on_done_called()); |
1467 | 1777 |
1468 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 2); | 1778 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 2); |
1469 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 2); | 1779 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 2); |
1470 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 2); | 1780 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 2); |
1471 } | 1781 } |
1472 | 1782 |
1473 } // namespace precache | 1783 } // namespace precache |
OLD | NEW |