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

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

Issue 2711473006: Add Precache.Fetch.MinWeight UMA. (Closed)
Patch Set: Comment clarifications. Created 3 years, 9 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>
(...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 // PrecacheFetcher::Fetcher constructor. 1167 // PrecacheFetcher::Fetcher constructor.
1168 // 1168 //
1169 // TODO(twifkak): Port these tests from FakeURLFetcherFactory to 1169 // TODO(twifkak): Port these tests from FakeURLFetcherFactory to
1170 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are 1170 // MockURLFetcherFactory or EmbeddedTestServer, and add a test that fetches are
1171 // cancelled midstream. 1171 // cancelled midstream.
1172 1172
1173 TEST_F(PrecacheFetcherTest, MaxBytesTotal) { 1173 TEST_F(PrecacheFetcherTest, MaxBytesTotal) {
1174 SetDefaultFlags(); 1174 SetDefaultFlags();
1175 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work( 1175 std::unique_ptr<PrecacheUnfinishedWork> unfinished_work(
1176 new PrecacheUnfinishedWork()); 1176 new PrecacheUnfinishedWork());
1177 unfinished_work->add_top_host()->set_hostname("good-manifest.com"); 1177 auto* top_host = unfinished_work->add_top_host();
1178 top_host->set_hostname("good-manifest.com");
1179 top_host->set_visits(1);
1178 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue()); 1180 unfinished_work->set_start_time(base::Time::UnixEpoch().ToInternalValue());
1179 1181
1180 // Should be greater than kMaxParallelFetches, so that we can observe 1182 // Should be greater than kMaxParallelFetches, so that we can observe
1181 // PrecacheFetcher not fetching the remaining resources after max bytes is 1183 // PrecacheFetcher not fetching the remaining resources after max bytes is
1182 // exceeded. 1184 // exceeded.
1183 const size_t kNumResources = kMaxParallelFetches + 5; 1185 const size_t kNumResources = kMaxParallelFetches + 5;
1184 // Should be smaller than kNumResources - kMaxParallelFetches, such that the 1186 // Should be smaller than kNumResources - kMaxParallelFetches, such that the
1185 // max bytes is guaranteed to be exceeded before all fetches have been 1187 // max bytes is guaranteed to be exceeded before all fetches have been
1186 // requested. In this case, after 3 fetches have been completed, 3 more are 1188 // requested. In this case, after 3 fetches have been completed, 3 more are
1187 // added to the fetcher pool, but 2 out of 5 still remain. 1189 // added to the fetcher pool, but 2 out of 5 still remain.
1188 const size_t kResourcesWithinMax = 3; 1190 const size_t kResourcesWithinMax = 3;
1189 // Should be big enough that the size of the config, manifest, and HTTP 1191 // Should be big enough that the size of the config, manifest, and HTTP
1190 // headers are negligible for max bytes computation. 1192 // headers are negligible for max bytes computation.
1191 const size_t kBytesPerResource = 500; 1193 const size_t kBytesPerResource = 500;
1192 const size_t kMaxBytesTotal = kResourcesWithinMax * kBytesPerResource; 1194 const size_t kMaxBytesTotal = kResourcesWithinMax * kBytesPerResource;
1193 1195
1194 PrecacheConfigurationSettings config; 1196 PrecacheConfigurationSettings config;
1195 config.set_max_bytes_total(kMaxBytesTotal); 1197 config.set_max_bytes_total(kMaxBytesTotal);
1198 config.set_global_ranking(true);
1196 1199
1197 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(), 1200 factory_.SetFakeResponse(GURL(kConfigURL), config.SerializeAsString(),
1198 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1201 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1199 1202
1200 PrecacheManifest good_manifest; 1203 PrecacheManifest good_manifest;
1201 for (size_t i = 0; i < kNumResources; ++i) { 1204 for (size_t i = 0; i < kNumResources; ++i) {
1202 const std::string url = "http://good-manifest.com/" + std::to_string(i); 1205 const std::string url = "http://good-manifest.com/" + std::to_string(i);
1203 good_manifest.add_resource()->set_url(url); 1206 auto* resource = good_manifest.add_resource();
1207 resource->set_url(url);
1208 resource->set_weight_ratio(static_cast<double>(i) / kNumResources);
1204 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'), 1209 factory_.SetFakeResponse(GURL(url), std::string(kBytesPerResource, '.'),
1205 net::HTTP_OK, net::URLRequestStatus::SUCCESS); 1210 net::HTTP_OK, net::URLRequestStatus::SUCCESS);
1206 } 1211 }
1207 1212
1208 factory_.SetFakeResponse(GURL(kGoodManifestURL), 1213 factory_.SetFakeResponse(GURL(kGoodManifestURL),
1209 good_manifest.SerializeAsString(), net::HTTP_OK, 1214 good_manifest.SerializeAsString(), net::HTTP_OK,
1210 net::URLRequestStatus::SUCCESS); 1215 net::URLRequestStatus::SUCCESS);
1211 1216
1212 base::HistogramTester histogram; 1217 base::HistogramTester histogram;
1213 1218
1214 { 1219 {
1215 PrecacheFetcher precache_fetcher( 1220 PrecacheFetcher precache_fetcher(
1216 request_context_.get(), GURL(), std::string(), 1221 request_context_.get(), GURL(), std::string(),
1217 std::move(unfinished_work), kExperimentID, 1222 std::move(unfinished_work), kExperimentID,
1218 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); 1223 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1219 precache_fetcher.Start(); 1224 precache_fetcher.Start();
1220 1225
1221 base::RunLoop().RunUntilIdle(); 1226 base::RunLoop().RunUntilIdle();
1222 } 1227 }
1223 1228
1224 // Fetcher should request config, manifest, and all but 3 resources. 1229 // Fetcher should request config, manifest, and all but 3 resources. For some
1225 // TODO(twifkak): I expected all but 2 resources; this result is surprising. 1230 // reason, we are seeing it fetch all but 4 resources. Meh, close enough.
jamartin 2017/02/25 02:12:47 Are you sure is close enough?
twifkak 2017/02/25 02:19:31 I'd put my certainty at 99%. In any case, this pro
1226 // Figure it out and explain it here. 1231 EXPECT_EQ(1 + 1 + kNumResources - 4, url_callback_.requested_urls().size());
1227 EXPECT_EQ(kNumResources - 1, url_callback_.requested_urls().size());
1228 1232
1229 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1233 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1230 1234
1231 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 1); 1235 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 1);
1232 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1); 1236 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 1);
1237
1238 const double expected_min_weight =
1239 good_manifest.resource(kNumResources - 3).weight_ratio() *
1240 1 /* # of visits to good-manifest.com */;
1241 histogram.ExpectBucketCount("Precache.Fetch.MinWeight",
1242 1000.0 * expected_min_weight, 1);
1233 } 1243 }
1234 1244
1235 // Tests the parallel fetch behaviour when more precache resource and manifest 1245 // Tests the parallel fetch behaviour when more precache resource and manifest
1236 // requests are available than the maximum capacity of fetcher pool. 1246 // requests are available than the maximum capacity of fetcher pool.
1237 TEST_F(PrecacheFetcherTest, FetcherPoolMaxLimitReached) { 1247 TEST_F(PrecacheFetcherTest, FetcherPoolMaxLimitReached) {
1238 SetDefaultFlags(); 1248 SetDefaultFlags();
1239 1249
1240 const size_t kNumTopHosts = 5; 1250 const size_t kNumTopHosts = 5;
1241 const size_t kNumResources = kMaxParallelFetches + 5; 1251 const size_t kNumResources = kMaxParallelFetches + 5;
1242 1252
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
1694 EXPECT_TRUE(cancelled_work->top_host().empty()); 1704 EXPECT_TRUE(cancelled_work->top_host().empty());
1695 EXPECT_EQ(kNumTopHosts * kNumResources, 1705 EXPECT_EQ(kNumTopHosts * kNumResources,
1696 static_cast<size_t>(cancelled_work->resource().size())); 1706 static_cast<size_t>(cancelled_work->resource().size()));
1697 EXPECT_FALSE(precache_delegate_.was_on_done_called()); 1707 EXPECT_FALSE(precache_delegate_.was_on_done_called());
1698 1708
1699 url_callback_.clear_requested_urls(); 1709 url_callback_.clear_requested_urls();
1700 1710
1701 // Continuing with the precache should fetch all resources, as the previous 1711 // Continuing with the precache should fetch all resources, as the previous
1702 // run was cancelled before any finished. They should be fetched in global 1712 // run was cancelled before any finished. They should be fetched in global
1703 // ranking order. 1713 // ranking order.
1714
1715 base::HistogramTester histogram;
1716
1704 { 1717 {
1705 PrecacheFetcher precache_fetcher( 1718 PrecacheFetcher precache_fetcher(
1706 request_context_.get(), GURL(), std::string(), 1719 request_context_.get(), GURL(), std::string(),
1707 std::move(cancelled_work), kExperimentID, 1720 std::move(cancelled_work), kExperimentID,
1708 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); 1721 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1709 LOG(INFO) << "Resuming prefetch."; 1722 LOG(INFO) << "Resuming prefetch.";
1710 precache_fetcher.Start(); 1723 precache_fetcher.Start();
1711 base::RunLoop().RunUntilIdle(); 1724 base::RunLoop().RunUntilIdle();
1712 } 1725 }
1713 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 1726 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
1714 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1727 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1728
1729 histogram.ExpectBucketCount("Precache.Fetch.MinWeight",
1730 1000.0 * resources.back().second, 1);
1715 } 1731 }
1716 1732
1717 TEST_F(PrecacheFetcherTest, MaxTotalResources) { 1733 TEST_F(PrecacheFetcherTest, MaxTotalResources) {
1718 SetDefaultFlags(); 1734 SetDefaultFlags();
1719 1735
1720 const size_t kNumResources = 5; 1736 const size_t kNumResources = 5;
1721 1737
1722 std::vector<GURL> expected_requested_urls; 1738 std::vector<GURL> expected_requested_urls;
1723 1739
1724 PrecacheConfigurationSettings config; 1740 PrecacheConfigurationSettings config;
(...skipping 25 matching lines...) Expand all
1750 resource->set_weight_ratio(weight); 1766 resource->set_weight_ratio(weight);
1751 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK, 1767 factory_.SetFakeResponse(GURL(resource_url), "good", net::HTTP_OK,
1752 net::URLRequestStatus::SUCCESS); 1768 net::URLRequestStatus::SUCCESS);
1753 if (i < config.total_resources_count()) 1769 if (i < config.total_resources_count())
1754 expected_requested_urls.emplace_back(resource_url); 1770 expected_requested_urls.emplace_back(resource_url);
1755 } 1771 }
1756 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host->hostname()), 1772 factory_.SetFakeResponse(GURL(kManifestURLPrefix + top_host->hostname()),
1757 manifest.SerializeAsString(), net::HTTP_OK, 1773 manifest.SerializeAsString(), net::HTTP_OK,
1758 net::URLRequestStatus::SUCCESS); 1774 net::URLRequestStatus::SUCCESS);
1759 1775
1776 base::HistogramTester histogram;
1777
1760 { 1778 {
1761 PrecacheFetcher precache_fetcher( 1779 PrecacheFetcher precache_fetcher(
1762 request_context_.get(), GURL(), std::string(), 1780 request_context_.get(), GURL(), std::string(),
1763 std::move(unfinished_work), kExperimentID, 1781 std::move(unfinished_work), kExperimentID,
1764 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_); 1782 precache_database_.GetWeakPtr(), task_runner(), &precache_delegate_);
1765 precache_fetcher.Start(); 1783 precache_fetcher.Start();
1766 base::RunLoop().RunUntilIdle(); 1784 base::RunLoop().RunUntilIdle();
1767 } 1785 }
1768 1786
1769 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 1787 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
1770 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 1788 EXPECT_TRUE(precache_delegate_.was_on_done_called());
1789
1790 const float expected_min_weight =
1791 manifest.resource(config.total_resources_count() - 1).weight_ratio();
1792 histogram.ExpectUniqueSample("Precache.Fetch.MinWeight",
1793 1000.0 * expected_min_weight, 1);
1771 } 1794 }
1772 1795
1773 TEST_F(PrecacheFetcherTest, MinWeight) { 1796 TEST_F(PrecacheFetcherTest, MinWeight) {
1774 SetDefaultFlags(); 1797 SetDefaultFlags();
1775 1798
1776 const size_t kNumResources = 5; 1799 const size_t kNumResources = 5;
1777 1800
1778 std::vector<GURL> expected_requested_urls; 1801 std::vector<GURL> expected_requested_urls;
1779 1802
1780 PrecacheConfigurationSettings config; 1803 PrecacheConfigurationSettings config;
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
2020 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls()); 2043 EXPECT_EQ(expected_requested_urls, url_callback_.requested_urls());
2021 2044
2022 EXPECT_TRUE(precache_delegate_.was_on_done_called()); 2045 EXPECT_TRUE(precache_delegate_.was_on_done_called());
2023 2046
2024 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 2); 2047 histogram.ExpectTotalCount("Precache.Fetch.PercentCompleted", 2);
2025 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 2); 2048 histogram.ExpectTotalCount("Precache.Fetch.ResponseBytes.Total", 2);
2026 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 2); 2049 histogram.ExpectTotalCount("Precache.Fetch.TimeToComplete", 2);
2027 } 2050 }
2028 2051
2029 } // namespace precache 2052 } // namespace precache
OLDNEW
« no previous file with comments | « components/precache/core/precache_fetcher.cc ('k') | components/precache/core/proto/precache.proto » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698