Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: components/precache/core/precache_fetcher_unittest.cc

Issue 2403193002: Precache: Optionally rank resources-to-precache globally. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698