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

Unified Diff: components/precache/core/precache_fetcher_unittest.cc

Issue 2300703004: Fix precache issue with cancel and resume (Closed)
Patch Set: Addressed sclittle comments Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/precache/core/precache_fetcher.cc ('k') | components/precache/core/precache_url_table.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « components/precache/core/precache_fetcher.cc ('k') | components/precache/core/precache_url_table.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698