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

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

Powered by Google App Engine
This is Rietveld 408576698