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

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

Issue 2146023003: Add UMA Precache.Freshness.Prefetch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added missing includes Created 4 years, 4 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_database.h" 5 #include "components/precache/core/precache_database.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <map> 9 #include <map>
10 #include <memory> 10 #include <memory>
11 11
12 #include "base/containers/hash_tables.h" 12 #include "base/containers/hash_tables.h"
13 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/files/scoped_temp_dir.h" 14 #include "base/files/scoped_temp_dir.h"
15 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
16 #include "base/metrics/histogram_base.h" 16 #include "base/metrics/histogram_base.h"
17 #include "base/test/histogram_tester.h" 17 #include "base/test/histogram_tester.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "components/history/core/browser/history_constants.h" 19 #include "components/history/core/browser/history_constants.h"
20 #include "net/http/http_response_headers.h"
21 #include "net/http/http_response_info.h"
22 #include "net/http/http_util.h"
20 #include "testing/gmock/include/gmock/gmock.h" 23 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
22 #include "url/gurl.h" 25 #include "url/gurl.h"
23 26
24 namespace { 27 namespace {
25 28
26 using ::testing::ContainerEq; 29 using ::testing::ContainerEq;
27 using ::testing::ElementsAre; 30 using ::testing::ElementsAre;
28 using base::Bucket; 31 using base::Bucket;
32 using net::HttpResponseInfo;
29 33
30 const GURL kURL("http://url.com"); 34 const GURL kURL("http://url.com");
31 const base::TimeDelta kLatency = base::TimeDelta::FromMilliseconds(5); 35 const base::TimeDelta kLatency = base::TimeDelta::FromMilliseconds(5);
32 const base::Time kFetchTime = base::Time() + base::TimeDelta::FromHours(1000); 36 const base::Time kFetchTime = base::Time() + base::TimeDelta::FromHours(1000);
33 const base::Time kOldFetchTime = kFetchTime - base::TimeDelta::FromDays(1); 37 const base::Time kOldFetchTime = kFetchTime - base::TimeDelta::FromDays(1);
34 const int64_t kSize = 5000; 38 const int64_t kSize = 5000;
39 const int64_t kFreshnessBucket10K = 9089;
35 40
36 std::map<GURL, base::Time> BuildURLTableMap(const GURL& url, 41 std::map<GURL, base::Time> BuildURLTableMap(const GURL& url,
37 const base::Time& precache_time) { 42 const base::Time& precache_time) {
38 std::map<GURL, base::Time> url_table_map; 43 std::map<GURL, base::Time> url_table_map;
39 url_table_map[url] = precache_time; 44 url_table_map[url] = precache_time;
40 return url_table_map; 45 return url_table_map;
41 } 46 }
42 47
48 HttpResponseInfo CreateHttpResponseInfo(bool was_cached,
49 bool network_accessed) {
50 HttpResponseInfo result;
51 result.was_cached = was_cached;
52 result.network_accessed = network_accessed;
53 std::string header(
54 "HTTP/1.1 200 OK\n"
55 "cache-control: max-age=10000\n\n");
56 result.headers = new net::HttpResponseHeaders(
57 net::HttpUtil::AssembleRawHeaders(header.c_str(), header.size()));
58 DCHECK_EQ(
59 10000,
60 result.headers->GetFreshnessLifetimes(base::Time()).freshness.InSeconds())
61 << "Error parsing the test headers: " << header;
62 return result;
63 }
64
43 } // namespace 65 } // namespace
44 66
45 namespace precache { 67 namespace precache {
46 68
47 class PrecacheDatabaseTest : public testing::Test { 69 class PrecacheDatabaseTest : public testing::Test {
48 public: 70 public:
49 PrecacheDatabaseTest() {} 71 PrecacheDatabaseTest() {}
50 ~PrecacheDatabaseTest() override {} 72 ~PrecacheDatabaseTest() override {}
51 73
52 protected: 74 protected:
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."), 144 EXPECT_THAT(histograms_.GetTotalCountsForPrefix("Precache."),
123 ContainerEq(expected_histogram_counts_)); 145 ContainerEq(expected_histogram_counts_));
124 } 146 }
125 }; 147 };
126 148
127 void PrecacheDatabaseTest::RecordPrecacheFromNetwork( 149 void PrecacheDatabaseTest::RecordPrecacheFromNetwork(
128 const GURL& url, 150 const GURL& url,
129 base::TimeDelta latency, 151 base::TimeDelta latency,
130 const base::Time& fetch_time, 152 const base::Time& fetch_time,
131 int64_t size) { 153 int64_t size) {
132 precache_database_->RecordURLPrefetch(url, latency, fetch_time, size, 154 const HttpResponseInfo info = CreateHttpResponseInfo(
133 false /* was_cached */); 155 false /* was_cached */, false /* network_accessed */);
156 precache_database_->RecordURLPrefetch(url, latency, fetch_time, info, size);
134 } 157 }
135 158
136 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url, 159 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url,
137 const base::Time& fetch_time, 160 const base::Time& fetch_time,
138 int64_t size) { 161 int64_t size) {
162 const HttpResponseInfo info = CreateHttpResponseInfo(
163 true /* was_cached */, false /* network_accessed */);
139 precache_database_->RecordURLPrefetch(url, base::TimeDelta() /* latency */, 164 precache_database_->RecordURLPrefetch(url, base::TimeDelta() /* latency */,
140 fetch_time, size, 165 fetch_time, info, size);
141 true /* was_cached */);
142 } 166 }
143 167
144 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, 168 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url,
145 base::TimeDelta latency, 169 base::TimeDelta latency,
146 const base::Time& fetch_time, 170 const base::Time& fetch_time,
147 int64_t size) { 171 int64_t size) {
148 precache_database_->RecordURLNonPrefetch( 172 const HttpResponseInfo info = CreateHttpResponseInfo(
149 url, latency, fetch_time, size, false /* was_cached */, 173 false /* was_cached */, false /* network_accessed */);
150 history::kMaxTopHosts, false /* is_connection_cellular */); 174 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size,
175 history::kMaxTopHosts,
176 false /* is_connection_cellular */);
151 } 177 }
152 178
153 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, 179 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url,
154 base::TimeDelta latency, 180 base::TimeDelta latency,
155 const base::Time& fetch_time, 181 const base::Time& fetch_time,
156 int64_t size, 182 int64_t size,
157 int host_rank) { 183 int host_rank) {
158 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, size, 184 const HttpResponseInfo info = CreateHttpResponseInfo(
159 false /* was_cached */, host_rank, 185 false /* was_cached */, false /* network_accessed */);
186 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size,
187 host_rank,
160 false /* is_connection_cellular */); 188 false /* is_connection_cellular */);
161 } 189 }
162 190
163 void PrecacheDatabaseTest::RecordFetchFromNetworkCellular( 191 void PrecacheDatabaseTest::RecordFetchFromNetworkCellular(
164 const GURL& url, 192 const GURL& url,
165 base::TimeDelta latency, 193 base::TimeDelta latency,
166 const base::Time& fetch_time, 194 const base::Time& fetch_time,
167 int64_t size) { 195 int64_t size) {
168 precache_database_->RecordURLNonPrefetch( 196 const HttpResponseInfo info = CreateHttpResponseInfo(
169 url, latency, fetch_time, size, false /* was_cached */, 197 false /* was_cached */, false /* network_accessed */);
170 history::kMaxTopHosts, true /* is_connection_cellular */); 198 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size,
199 history::kMaxTopHosts,
200 true /* is_connection_cellular */);
171 } 201 }
172 202
173 void PrecacheDatabaseTest::RecordFetchFromCache(const GURL& url, 203 void PrecacheDatabaseTest::RecordFetchFromCache(const GURL& url,
174 const base::Time& fetch_time, 204 const base::Time& fetch_time,
175 int64_t size) { 205 int64_t size) {
206 const HttpResponseInfo info = CreateHttpResponseInfo(
207 true /* was_cached */, false /* network_accessed */);
176 precache_database_->RecordURLNonPrefetch( 208 precache_database_->RecordURLNonPrefetch(
177 url, base::TimeDelta() /* latency */, fetch_time, size, 209 url, base::TimeDelta() /* latency */, fetch_time, info, size,
178 true /* was_cached */, history::kMaxTopHosts, 210 history::kMaxTopHosts, false /* is_connection_cellular */);
179 false /* is_connection_cellular */);
180 } 211 }
181 212
182 void PrecacheDatabaseTest::RecordFetchFromCacheCellular( 213 void PrecacheDatabaseTest::RecordFetchFromCacheCellular(
183 const GURL& url, 214 const GURL& url,
184 const base::Time& fetch_time, 215 const base::Time& fetch_time,
185 int64_t size) { 216 int64_t size) {
217 const HttpResponseInfo info = CreateHttpResponseInfo(
218 true /* was_cached */, false /* network_accessed */);
186 precache_database_->RecordURLNonPrefetch( 219 precache_database_->RecordURLNonPrefetch(
187 url, base::TimeDelta() /* latency */, fetch_time, size, 220 url, base::TimeDelta() /* latency */, fetch_time, info, size,
188 true /* was_cached */, history::kMaxTopHosts, 221 history::kMaxTopHosts, true /* is_connection_cellular */);
189 true /* is_connection_cellular */);
190 } 222 }
191 223
192 namespace { 224 namespace {
193 225
194 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) { 226 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) {
195 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize); 227 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize);
196 228
197 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); 229 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
198 230
199 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); 231 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize);
200 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); 232 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds());
233 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
201 ExpectNoOtherSamples(); 234 ExpectNoOtherSamples();
202 } 235 }
203 236
204 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { 237 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) {
205 precache_url_table()->AddURL(kURL, kOldFetchTime); 238 precache_url_table()->AddURL(kURL, kOldFetchTime);
206 RecordPrecacheFromCache(kURL, kFetchTime, kSize); 239 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
207 240
208 // The URL table entry should have been updated to have |kFetchTime| as the 241 // The URL table entry should have been updated to have |kFetchTime| as the
209 // timestamp. 242 // timestamp.
210 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); 243 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
211 244
212 ExpectNewSample("Precache.Latency.Prefetch", 0); 245 ExpectNewSample("Precache.Latency.Prefetch", 0);
246 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
213 ExpectNoOtherSamples(); 247 ExpectNoOtherSamples();
214 } 248 }
215 249
216 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) { 250 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) {
217 RecordPrecacheFromCache(kURL, kFetchTime, kSize); 251 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
218 252
219 EXPECT_TRUE(GetActualURLTableMap().empty()); 253 EXPECT_TRUE(GetActualURLTableMap().empty());
220 254
221 ExpectNewSample("Precache.Latency.Prefetch", 0); 255 ExpectNewSample("Precache.Latency.Prefetch", 0);
256 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
222 ExpectNoOtherSamples(); 257 ExpectNoOtherSamples();
223 } 258 }
224 259
225 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) { 260 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) {
226 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); 261 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize);
227 262
228 EXPECT_TRUE(GetActualURLTableMap().empty()); 263 EXPECT_TRUE(GetActualURLTableMap().empty());
229 264
230 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); 265 ExpectNewSample("Precache.DownloadedNonPrecache", kSize);
231 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); 266 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { 311 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) {
277 precache_url_table()->AddURL(kURL, kOldFetchTime); 312 precache_url_table()->AddURL(kURL, kOldFetchTime);
278 RecordFetchFromCache(kURL, kFetchTime, kSize); 313 RecordFetchFromCache(kURL, kFetchTime, kSize);
279 314
280 // The URL table entry should have been deleted. 315 // The URL table entry should have been deleted.
281 EXPECT_TRUE(GetActualURLTableMap().empty()); 316 EXPECT_TRUE(GetActualURLTableMap().empty());
282 317
283 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 318 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
284 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 319 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
285 ExpectNewSample("Precache.Saved", kSize); 320 ExpectNewSample("Precache.Saved", kSize);
321 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K);
286 ExpectNoOtherSamples(); 322 ExpectNoOtherSamples();
287 } 323 }
288 324
289 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { 325 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) {
290 precache_url_table()->AddURL(kURL, kOldFetchTime); 326 precache_url_table()->AddURL(kURL, kOldFetchTime);
291 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); 327 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize);
292 328
293 // The URL table entry should have been deleted. 329 // The URL table entry should have been deleted.
294 EXPECT_TRUE(GetActualURLTableMap().empty()); 330 EXPECT_TRUE(GetActualURLTableMap().empty());
295 331
296 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 332 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
297 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 333 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
298 ExpectNewSample("Precache.Saved", kSize); 334 ExpectNewSample("Precache.Saved", kSize);
299 ExpectNewSample("Precache.Saved.Cellular", kSize); 335 ExpectNewSample("Precache.Saved.Cellular", kSize);
336 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K);
300 ExpectNoOtherSamples(); 337 ExpectNoOtherSamples();
301 } 338 }
302 339
303 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) { 340 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) {
304 RecordFetchFromCache(kURL, kFetchTime, kSize); 341 RecordFetchFromCache(kURL, kFetchTime, kSize);
305 342
306 EXPECT_TRUE(GetActualURLTableMap().empty()); 343 EXPECT_TRUE(GetActualURLTableMap().empty());
307 344
308 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 345 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
309 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 346 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 RecordFetchFromCacheCellular(kURL, kTimeA, kSize); 440 RecordFetchFromCacheCellular(kURL, kTimeA, kSize);
404 RecordFetchFromNetworkCellular(kURL, kLatency, kTimeB, kSize); 441 RecordFetchFromNetworkCellular(kURL, kLatency, kTimeB, kSize);
405 RecordFetchFromNetworkCellular(kURL, kLatency, kTimeB, kSize); 442 RecordFetchFromNetworkCellular(kURL, kLatency, kTimeB, kSize);
406 RecordFetchFromCacheCellular(kURL, kTimeB, kSize); 443 RecordFetchFromCacheCellular(kURL, kTimeB, kSize);
407 RecordFetchFromCacheCellular(kURL, kTimeC, kSize); 444 RecordFetchFromCacheCellular(kURL, kTimeC, kSize);
408 445
409 EXPECT_THAT(histograms_.GetAllSamples("Precache.TimeSinceLastPrecache"), 446 EXPECT_THAT(histograms_.GetAllSamples("Precache.TimeSinceLastPrecache"),
410 ElementsAre(Bucket(0, 2), Bucket(2406, 3), Bucket(69347, 1))); 447 ElementsAre(Bucket(0, 2), Bucket(2406, 3), Bucket(69347, 1)));
411 } 448 }
412 449
450 TEST_F(PrecacheDatabaseTest, PrecacheFreshnessPrefetch) {
451 auto info = CreateHttpResponseInfo(false /* was_cached */,
452 false /* network_accessed */);
453 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize);
454
455 EXPECT_THAT(histograms_.GetAllSamples("Precache.Freshness.Prefetch"),
456 ElementsAre(Bucket(kFreshnessBucket10K, 1)));
457 }
458
413 } // namespace 459 } // namespace
414 460
415 } // namespace precache 461 } // namespace precache
OLDNEW
« no previous file with comments | « components/precache/core/precache_database.cc ('k') | components/precache/core/precache_url_table.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698