| Index: components/precache/core/precache_fetcher_unittest.cc
|
| diff --git a/components/precache/core/precache_fetcher_unittest.cc b/components/precache/core/precache_fetcher_unittest.cc
|
| index 4a86682e012c15d1311f45a15d52fa28522006a2..7a84efc49069b054cb04791522a90f34ef2379de 100644
|
| --- a/components/precache/core/precache_fetcher_unittest.cc
|
| +++ b/components/precache/core/precache_fetcher_unittest.cc
|
| @@ -1289,4 +1289,101 @@ TEST_F(PrecacheFetcherTest, SendUsedUnusedResourceHash) {
|
| }
|
| }
|
|
|
| +// Tests cancel precaching when all tophost manifests are fetched, but some
|
| +// resource fetches are pending.
|
| +TEST_F(PrecacheFetcherTest, CancelPrecachingAfterAllManifestFetch) {
|
| + SetDefaultFlags();
|
| +
|
| + const size_t kNumTopHosts = 5;
|
| + const size_t kNumResources = 5;
|
| + const size_t kMaxParallelFetches = 10;
|
| +
|
| + PrecacheConfigurationSettings config;
|
| + PrecacheManifest top_host_manifest[kNumTopHosts];
|
| + std::multiset<GURL> expected_requested_urls;
|
| + std::unique_ptr<PrecacheUnfinishedWork> cancelled_work;
|
| +
|
| + config.set_top_sites_count(kNumTopHosts);
|
| + factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
|
| + net::HTTP_OK, net::URLRequestStatus::SUCCESS);
|
| + expected_requested_urls.insert(GURL(kConfigURL));
|
| +
|
| + std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
|
| + new PrecacheUnfinishedWork());
|
| + unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
|
| +
|
| + for (size_t i = 0; i < kNumTopHosts; ++i) {
|
| + const std::string top_host_url = base::StringPrintf("top-host-%zu.com", i);
|
| + unfinished_work->add_top_host()->set_hostname(top_host_url);
|
| +
|
| + for (size_t j = 0; j < kNumResources; ++j) {
|
| + const std::string resource_url =
|
| + base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j);
|
| + top_host_manifest[i].add_resource()->set_url(resource_url);
|
| + factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK,
|
| + net::URLRequestStatus::SUCCESS);
|
| + if (i < kNumTopHosts - 1)
|
| + expected_requested_urls.insert(GURL(resource_url));
|
| + }
|
| + factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host_url),
|
| + top_host_manifest[i].SerializeAsString(),
|
| + net::HTTP_OK, net::URLRequestStatus::SUCCESS);
|
| + expected_requested_urls.insert(GURL(kManifestURLPrefix + top_host_url));
|
| + }
|
| +
|
| + {
|
| + uint32_t remaining_tries = 100;
|
| + PrecacheFetcher precache_fetcher(
|
| + request_context_.get(), GURL(), std::string(),
|
| + std::move(unfinished_work), kExperimentID,
|
| + precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
|
| + precache_fetcher.Start();
|
| +
|
| + // Run the loop until all tophost manifest fetches are complete, but some
|
| + // resource fetches are pending.
|
| + while (--remaining_tries != 0 &&
|
| + (!precache_fetcher.top_hosts_to_fetch_.empty() ||
|
| + !precache_fetcher.unfinished_work_->has_config_settings() ||
|
| + precache_fetcher.resources_to_fetch_.empty())) {
|
| + base::RunLoop run_loop;
|
| + loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
|
| + run_loop.Run();
|
| + }
|
| +
|
| + // Cancel precaching.
|
| + cancelled_work = precache_fetcher.CancelPrecaching();
|
| + EXPECT_TRUE(precache_fetcher.top_hosts_to_fetch_.empty());
|
| + EXPECT_TRUE(precache_fetcher.resources_to_fetch_.empty());
|
| + }
|
| + EXPECT_NE(cancelled_work, nullptr);
|
| + EXPECT_TRUE(cancelled_work->top_host().empty());
|
| + EXPECT_EQ(static_cast<size_t>(cancelled_work->resource().size()),
|
| + kMaxParallelFetches + kNumResources);
|
| +
|
| + EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
|
| +
|
| + EXPECT_FALSE(precache_delegate_.was_on_done_called());
|
| +
|
| + // Continuing with the precache should only fetch the pending resources in the
|
| + // previous run.
|
| + expected_requested_urls.clear();
|
| + url_callback_.clear_requested_urls();
|
| + for (size_t i = 2; i < kNumTopHosts; ++i) {
|
| + for (size_t j = 0; j < kNumResources; ++j) {
|
| + expected_requested_urls.insert(GURL(
|
| + base::StringPrintf("http://top-host-%zu.com/resource-%zu", i, j)));
|
| + }
|
| + }
|
| + {
|
| + PrecacheFetcher precache_fetcher(
|
| + request_context_.get(), GURL(), std::string(),
|
| + std::move(cancelled_work), kExperimentID,
|
| + precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
|
| + precache_fetcher.Start();
|
| + base::RunLoop().RunUntilIdle();
|
| + }
|
| + EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
|
| + EXPECT_TRUE(precache_delegate_.was_on_done_called());
|
| +}
|
| +
|
| } // namespace precache
|
|
|