Chromium Code Reviews| 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 |