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

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: Changed the histogram summary Created 4 years, 5 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 = false,
bengr 2016/07/21 00:03:27 Don't use default values.
jamartin 2016/07/25 23:23:07 Done.
49 bool network_accessed = false) {
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 precache_database_->RecordURLPrefetch(url, latency, fetch_time, info, size);
134 } 156 }
135 157
136 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url, 158 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url,
137 const base::Time& fetch_time, 159 const base::Time& fetch_time,
138 int64_t size) { 160 int64_t size) {
161 const HttpResponseInfo info = CreateHttpResponseInfo(
162 true /* was_cached */, false /* network_accessed */);
139 precache_database_->RecordURLPrefetch(url, base::TimeDelta() /* latency */, 163 precache_database_->RecordURLPrefetch(url, base::TimeDelta() /* latency */,
140 fetch_time, size, 164 fetch_time, info, size);
141 true /* was_cached */);
142 } 165 }
143 166
144 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, 167 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url,
145 base::TimeDelta latency, 168 base::TimeDelta latency,
146 const base::Time& fetch_time, 169 const base::Time& fetch_time,
147 int64_t size) { 170 int64_t size) {
148 precache_database_->RecordURLNonPrefetch( 171 const HttpResponseInfo info = CreateHttpResponseInfo();
149 url, latency, fetch_time, size, false /* was_cached */, 172 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size,
150 history::kMaxTopHosts, false /* is_connection_cellular */); 173 history::kMaxTopHosts,
174 false /* is_connection_cellular */);
151 } 175 }
152 176
153 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, 177 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url,
154 base::TimeDelta latency, 178 base::TimeDelta latency,
155 const base::Time& fetch_time, 179 const base::Time& fetch_time,
156 int64_t size, 180 int64_t size,
157 int host_rank) { 181 int host_rank) {
158 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, size, 182 const HttpResponseInfo info = CreateHttpResponseInfo();
159 false /* was_cached */, host_rank, 183 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size,
184 host_rank,
160 false /* is_connection_cellular */); 185 false /* is_connection_cellular */);
161 } 186 }
162 187
163 void PrecacheDatabaseTest::RecordFetchFromNetworkCellular( 188 void PrecacheDatabaseTest::RecordFetchFromNetworkCellular(
164 const GURL& url, 189 const GURL& url,
165 base::TimeDelta latency, 190 base::TimeDelta latency,
166 const base::Time& fetch_time, 191 const base::Time& fetch_time,
167 int64_t size) { 192 int64_t size) {
168 precache_database_->RecordURLNonPrefetch( 193 const HttpResponseInfo info = CreateHttpResponseInfo();
169 url, latency, fetch_time, size, false /* was_cached */, 194 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size,
170 history::kMaxTopHosts, true /* is_connection_cellular */); 195 history::kMaxTopHosts,
196 true /* is_connection_cellular */);
171 } 197 }
172 198
173 void PrecacheDatabaseTest::RecordFetchFromCache(const GURL& url, 199 void PrecacheDatabaseTest::RecordFetchFromCache(const GURL& url,
174 const base::Time& fetch_time, 200 const base::Time& fetch_time,
175 int64_t size) { 201 int64_t size) {
202 const HttpResponseInfo info = CreateHttpResponseInfo(true /* was_cached */);
176 precache_database_->RecordURLNonPrefetch( 203 precache_database_->RecordURLNonPrefetch(
177 url, base::TimeDelta() /* latency */, fetch_time, size, 204 url, base::TimeDelta() /* latency */, fetch_time, info, size,
178 true /* was_cached */, history::kMaxTopHosts, 205 history::kMaxTopHosts, false /* is_connection_cellular */);
179 false /* is_connection_cellular */);
180 } 206 }
181 207
182 void PrecacheDatabaseTest::RecordFetchFromCacheCellular( 208 void PrecacheDatabaseTest::RecordFetchFromCacheCellular(
183 const GURL& url, 209 const GURL& url,
184 const base::Time& fetch_time, 210 const base::Time& fetch_time,
185 int64_t size) { 211 int64_t size) {
212 const HttpResponseInfo info = CreateHttpResponseInfo(true /* was_cached */);
186 precache_database_->RecordURLNonPrefetch( 213 precache_database_->RecordURLNonPrefetch(
187 url, base::TimeDelta() /* latency */, fetch_time, size, 214 url, base::TimeDelta() /* latency */, fetch_time, info, size,
188 true /* was_cached */, history::kMaxTopHosts, 215 history::kMaxTopHosts, true /* is_connection_cellular */);
189 true /* is_connection_cellular */);
190 } 216 }
191 217
192 namespace { 218 namespace {
193 219
194 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) { 220 TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) {
195 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize); 221 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize);
196 222
197 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); 223 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
198 224
199 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); 225 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize);
200 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); 226 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds());
227 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
201 ExpectNoOtherSamples(); 228 ExpectNoOtherSamples();
202 } 229 }
203 230
204 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { 231 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) {
205 precache_url_table()->AddURL(kURL, kOldFetchTime); 232 precache_url_table()->AddURL(kURL, kOldFetchTime);
206 RecordPrecacheFromCache(kURL, kFetchTime, kSize); 233 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
207 234
208 // The URL table entry should have been updated to have |kFetchTime| as the 235 // The URL table entry should have been updated to have |kFetchTime| as the
209 // timestamp. 236 // timestamp.
210 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); 237 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap());
211 238
212 ExpectNewSample("Precache.Latency.Prefetch", 0); 239 ExpectNewSample("Precache.Latency.Prefetch", 0);
240 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
213 ExpectNoOtherSamples(); 241 ExpectNoOtherSamples();
214 } 242 }
215 243
216 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) { 244 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithoutURLTableEntry) {
217 RecordPrecacheFromCache(kURL, kFetchTime, kSize); 245 RecordPrecacheFromCache(kURL, kFetchTime, kSize);
218 246
219 EXPECT_TRUE(GetActualURLTableMap().empty()); 247 EXPECT_TRUE(GetActualURLTableMap().empty());
220 248
221 ExpectNewSample("Precache.Latency.Prefetch", 0); 249 ExpectNewSample("Precache.Latency.Prefetch", 0);
250 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K);
222 ExpectNoOtherSamples(); 251 ExpectNoOtherSamples();
223 } 252 }
224 253
225 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) { 254 TEST_F(PrecacheDatabaseTest, FetchOverNetwork_NonCellular) {
226 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); 255 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize);
227 256
228 EXPECT_TRUE(GetActualURLTableMap().empty()); 257 EXPECT_TRUE(GetActualURLTableMap().empty());
229 258
230 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); 259 ExpectNewSample("Precache.DownloadedNonPrecache", kSize);
231 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); 260 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { 305 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) {
277 precache_url_table()->AddURL(kURL, kOldFetchTime); 306 precache_url_table()->AddURL(kURL, kOldFetchTime);
278 RecordFetchFromCache(kURL, kFetchTime, kSize); 307 RecordFetchFromCache(kURL, kFetchTime, kSize);
279 308
280 // The URL table entry should have been deleted. 309 // The URL table entry should have been deleted.
281 EXPECT_TRUE(GetActualURLTableMap().empty()); 310 EXPECT_TRUE(GetActualURLTableMap().empty());
282 311
283 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 312 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
284 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 313 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
285 ExpectNewSample("Precache.Saved", kSize); 314 ExpectNewSample("Precache.Saved", kSize);
315 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K);
286 ExpectNoOtherSamples(); 316 ExpectNoOtherSamples();
287 } 317 }
288 318
289 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { 319 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) {
290 precache_url_table()->AddURL(kURL, kOldFetchTime); 320 precache_url_table()->AddURL(kURL, kOldFetchTime);
291 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); 321 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize);
292 322
293 // The URL table entry should have been deleted. 323 // The URL table entry should have been deleted.
294 EXPECT_TRUE(GetActualURLTableMap().empty()); 324 EXPECT_TRUE(GetActualURLTableMap().empty());
295 325
296 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 326 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
297 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 327 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
298 ExpectNewSample("Precache.Saved", kSize); 328 ExpectNewSample("Precache.Saved", kSize);
299 ExpectNewSample("Precache.Saved.Cellular", kSize); 329 ExpectNewSample("Precache.Saved.Cellular", kSize);
330 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K);
300 ExpectNoOtherSamples(); 331 ExpectNoOtherSamples();
301 } 332 }
302 333
303 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) { 334 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithoutURLTableEntry) {
304 RecordFetchFromCache(kURL, kFetchTime, kSize); 335 RecordFetchFromCache(kURL, kFetchTime, kSize);
305 336
306 EXPECT_TRUE(GetActualURLTableMap().empty()); 337 EXPECT_TRUE(GetActualURLTableMap().empty());
307 338
308 ExpectNewSample("Precache.Latency.NonPrefetch", 0); 339 ExpectNewSample("Precache.Latency.NonPrefetch", 0);
309 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); 340 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 EXPECT_THAT(histograms_.GetAllSamples("Precache.Latency.NonPrefetch"), 405 EXPECT_THAT(histograms_.GetAllSamples("Precache.Latency.NonPrefetch"),
375 ElementsAre(Bucket(0, 6), Bucket(kLatency.InMilliseconds(), 3))); 406 ElementsAre(Bucket(0, 6), Bucket(kLatency.InMilliseconds(), 3)));
376 407
377 EXPECT_THAT(histograms_.GetAllSamples("Precache.Saved"), 408 EXPECT_THAT(histograms_.GetAllSamples("Precache.Saved"),
378 ElementsAre(Bucket(kSize1, 1), Bucket(kSize3, 1))); 409 ElementsAre(Bucket(kSize1, 1), Bucket(kSize3, 1)));
379 410
380 EXPECT_THAT(histograms_.GetAllSamples("Precache.Saved.Cellular"), 411 EXPECT_THAT(histograms_.GetAllSamples("Precache.Saved.Cellular"),
381 ElementsAre(Bucket(kSize1, 1))); 412 ElementsAre(Bucket(kSize1, 1)));
382 } 413 }
383 414
415 TEST_F(PrecacheDatabaseTest, PrecacheFreshnessPrefetch) {
416 auto info = CreateHttpResponseInfo();
417 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize);
418
419 EXPECT_THAT(histograms_.GetAllSamples("Precache.Freshness.Prefetch"),
420 ElementsAre(Bucket(kFreshnessBucket10K, 1)));
421 }
422
384 } // namespace 423 } // namespace
385 424
386 } // namespace precache 425 } // namespace precache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698