OLD | NEW |
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> |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "url/gurl.h" | 25 #include "url/gurl.h" |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 using ::testing::ContainerEq; | 29 using ::testing::ContainerEq; |
30 using ::testing::ElementsAre; | 30 using ::testing::ElementsAre; |
31 using base::Bucket; | 31 using base::Bucket; |
32 using net::HttpResponseInfo; | 32 using net::HttpResponseInfo; |
33 | 33 |
34 const GURL kURL("http://url.com"); | 34 const GURL kURL("http://url.com"); |
| 35 const int kReferrerID = 1; |
35 const base::TimeDelta kLatency = base::TimeDelta::FromMilliseconds(5); | 36 const base::TimeDelta kLatency = base::TimeDelta::FromMilliseconds(5); |
36 const base::Time kFetchTime = base::Time() + base::TimeDelta::FromHours(1000); | 37 const base::Time kFetchTime = base::Time() + base::TimeDelta::FromHours(1000); |
37 const base::Time kOldFetchTime = kFetchTime - base::TimeDelta::FromDays(1); | 38 const base::Time kOldFetchTime = kFetchTime - base::TimeDelta::FromDays(1); |
| 39 const base::Time kNewFetchTime = |
| 40 base::Time() + base::TimeDelta::FromHours(2000); |
38 const int64_t kSize = 5000; | 41 const int64_t kSize = 5000; |
39 const int64_t kFreshnessBucket10K = 9089; | 42 const int64_t kFreshnessBucket10K = 9089; |
40 // One of the possible CacheEntryStatus for when the fetch was served from the | 43 // One of the possible CacheEntryStatus for when the fetch was served from the |
41 // network. | 44 // network. |
42 const HttpResponseInfo::CacheEntryStatus kFromNetwork = | 45 const HttpResponseInfo::CacheEntryStatus kFromNetwork = |
43 HttpResponseInfo::CacheEntryStatus::ENTRY_UPDATED; | 46 HttpResponseInfo::CacheEntryStatus::ENTRY_UPDATED; |
44 | 47 |
45 std::map<GURL, base::Time> BuildURLTableMap(const GURL& url, | 48 std::map<GURL, base::Time> BuildURLTableMap(const GURL& url, |
46 const base::Time& precache_time) { | 49 const base::Time& precache_time) { |
47 std::map<GURL, base::Time> url_table_map; | 50 std::map<GURL, base::Time> url_table_map; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 PrecacheDatabaseTest() {} | 89 PrecacheDatabaseTest() {} |
87 ~PrecacheDatabaseTest() override {} | 90 ~PrecacheDatabaseTest() override {} |
88 | 91 |
89 protected: | 92 protected: |
90 void SetUp() override { | 93 void SetUp() override { |
91 precache_database_.reset(new PrecacheDatabase()); | 94 precache_database_.reset(new PrecacheDatabase()); |
92 | 95 |
93 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); | 96 ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
94 base::FilePath db_path = scoped_temp_dir_.path().Append( | 97 base::FilePath db_path = scoped_temp_dir_.path().Append( |
95 base::FilePath(FILE_PATH_LITERAL("precache_database"))); | 98 base::FilePath(FILE_PATH_LITERAL("precache_database"))); |
96 precache_database_->Init(db_path); | 99 ASSERT_TRUE(precache_database_->Init(db_path)); |
97 } | 100 } |
98 | 101 |
99 std::map<GURL, base::Time> GetActualURLTableMap() { | 102 std::map<GURL, base::Time> GetActualURLTableMap() { |
100 // Flush any buffered writes so that the URL table will be up to date. | 103 // Flush any buffered writes so that the URL table will be up to date. |
101 precache_database_->Flush(); | 104 precache_database_->Flush(); |
102 | 105 |
103 std::map<GURL, base::Time> url_table_map; | 106 std::map<GURL, base::Time> url_table_map; |
104 precache_url_table()->GetAllDataForTesting(&url_table_map); | 107 precache_url_table()->GetAllDataForTesting(&url_table_map); |
105 return url_table_map; | 108 return url_table_map; |
106 } | 109 } |
107 | 110 |
108 PrecacheURLTable* precache_url_table() { | 111 PrecacheURLTable* precache_url_table() { |
109 return &precache_database_->precache_url_table_; | 112 return &precache_database_->precache_url_table_; |
110 } | 113 } |
111 | 114 |
| 115 void Flush() { precache_database_->Flush(); } |
| 116 |
112 // Convenience methods for recording different types of URL fetches. These | 117 // Convenience methods for recording different types of URL fetches. These |
113 // exist to improve the readability of the tests. | 118 // exist to improve the readability of the tests. |
114 void RecordPrecacheFromNetwork(const GURL& url, | 119 void RecordPrecacheFromNetwork(const GURL& url, |
115 base::TimeDelta latency, | 120 base::TimeDelta latency, |
116 const base::Time& fetch_time, | 121 const base::Time& fetch_time, |
117 int64_t size); | 122 int64_t size); |
118 void RecordPrecacheFromCache(const GURL& url, | 123 void RecordPrecacheFromCache(const GURL& url, |
119 const base::Time& fetch_time, | 124 const base::Time& fetch_time, |
120 int64_t size); | 125 int64_t size); |
121 void RecordFetchFromNetwork(const GURL& url, | 126 void RecordFetchFromNetwork(const GURL& url, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 } | 166 } |
162 }; | 167 }; |
163 | 168 |
164 void PrecacheDatabaseTest::RecordPrecacheFromNetwork( | 169 void PrecacheDatabaseTest::RecordPrecacheFromNetwork( |
165 const GURL& url, | 170 const GURL& url, |
166 base::TimeDelta latency, | 171 base::TimeDelta latency, |
167 const base::Time& fetch_time, | 172 const base::Time& fetch_time, |
168 int64_t size) { | 173 int64_t size) { |
169 const HttpResponseInfo info = CreateHttpResponseInfo( | 174 const HttpResponseInfo info = CreateHttpResponseInfo( |
170 false /* was_cached */, false /* network_accessed */); | 175 false /* was_cached */, false /* network_accessed */); |
171 precache_database_->RecordURLPrefetch(url, latency, fetch_time, info, size); | 176 precache_database_->RecordURLPrefetchMetrics(info, latency); |
| 177 precache_database_->RecordURLPrefetch(url, std::string(), fetch_time, |
| 178 info.was_cached, size); |
172 } | 179 } |
173 | 180 |
174 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url, | 181 void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url, |
175 const base::Time& fetch_time, | 182 const base::Time& fetch_time, |
176 int64_t size) { | 183 int64_t size) { |
177 const HttpResponseInfo info = CreateHttpResponseInfo( | 184 const HttpResponseInfo info = CreateHttpResponseInfo( |
178 true /* was_cached */, false /* network_accessed */); | 185 true /* was_cached */, false /* network_accessed */); |
179 precache_database_->RecordURLPrefetch(url, base::TimeDelta() /* latency */, | 186 precache_database_->RecordURLPrefetchMetrics(info, |
180 fetch_time, info, size); | 187 base::TimeDelta() /* latency */); |
| 188 precache_database_->RecordURLPrefetch(url, std::string(), fetch_time, |
| 189 info.was_cached, size); |
181 } | 190 } |
182 | 191 |
183 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, | 192 void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, |
184 base::TimeDelta latency, | 193 base::TimeDelta latency, |
185 const base::Time& fetch_time, | 194 const base::Time& fetch_time, |
186 int64_t size) { | 195 int64_t size) { |
187 const HttpResponseInfo info = CreateHttpResponseInfo( | 196 const HttpResponseInfo info = CreateHttpResponseInfo( |
188 false /* was_cached */, false /* network_accessed */); | 197 false /* was_cached */, false /* network_accessed */); |
189 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size, | 198 precache_database_->RecordURLNonPrefetch(url, latency, fetch_time, info, size, |
190 history::kMaxTopHosts, | 199 history::kMaxTopHosts, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 | 252 |
244 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); | 253 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); |
245 | 254 |
246 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); | 255 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); |
247 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); | 256 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); |
248 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); | 257 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); |
249 ExpectNoOtherSamples(); | 258 ExpectNoOtherSamples(); |
250 } | 259 } |
251 | 260 |
252 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { | 261 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { |
253 precache_url_table()->AddURL(kURL, kOldFetchTime); | 262 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
254 RecordPrecacheFromCache(kURL, kFetchTime, kSize); | 263 RecordPrecacheFromCache(kURL, kFetchTime, kSize); |
255 | 264 |
256 // The URL table entry should have been updated to have |kFetchTime| as the | 265 // The URL table entry should have been updated to have |kFetchTime| as the |
257 // timestamp. | 266 // timestamp. |
258 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); | 267 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); |
259 | 268 |
260 ExpectNewSample("Precache.Latency.Prefetch", 0); | 269 ExpectNewSample("Precache.Latency.Prefetch", 0); |
261 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); | 270 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); |
262 ExpectNoOtherSamples(); | 271 ExpectNoOtherSamples(); |
263 } | 272 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); | 315 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); |
307 ExpectNewSample("Precache.DownloadedNonPrecache.Cellular", kSize); | 316 ExpectNewSample("Precache.DownloadedNonPrecache.Cellular", kSize); |
308 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); | 317 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); |
309 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); | 318 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); |
310 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", | 319 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", |
311 kLatency.InMilliseconds()); | 320 kLatency.InMilliseconds()); |
312 ExpectNoOtherSamples(); | 321 ExpectNoOtherSamples(); |
313 } | 322 } |
314 | 323 |
315 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { | 324 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { |
316 precache_url_table()->AddURL(kURL, kOldFetchTime); | 325 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
317 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); | 326 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); |
318 | 327 |
319 // The URL table entry should have been deleted. | 328 // The URL table entry should have been deleted. |
320 EXPECT_TRUE(GetActualURLTableMap().empty()); | 329 EXPECT_TRUE(GetActualURLTableMap().empty()); |
321 | 330 |
322 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); | 331 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); |
323 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); | 332 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); |
324 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", | 333 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", |
325 kLatency.InMilliseconds()); | 334 kLatency.InMilliseconds()); |
326 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); | 335 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); |
327 ExpectNoOtherSamples(); | 336 ExpectNoOtherSamples(); |
328 } | 337 } |
329 | 338 |
330 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { | 339 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { |
331 precache_url_table()->AddURL(kURL, kOldFetchTime); | 340 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
332 RecordFetchFromCache(kURL, kFetchTime, kSize); | 341 RecordFetchFromCache(kURL, kFetchTime, kSize); |
333 | 342 |
334 // The URL table entry should have been deleted. | 343 // The URL table entry should have been deleted. |
335 EXPECT_TRUE(GetActualURLTableMap().empty()); | 344 EXPECT_TRUE(GetActualURLTableMap().empty()); |
336 | 345 |
337 ExpectNewSample("Precache.Latency.NonPrefetch", 0); | 346 ExpectNewSample("Precache.Latency.NonPrefetch", 0); |
338 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); | 347 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); |
339 ExpectNewSample("Precache.CacheStatus.NonPrefetch", | 348 ExpectNewSample("Precache.CacheStatus.NonPrefetch", |
340 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 349 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
341 ExpectNewSample("Precache.Saved", kSize); | 350 ExpectNewSample("Precache.Saved", kSize); |
342 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K); | 351 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K); |
343 ExpectNoOtherSamples(); | 352 ExpectNoOtherSamples(); |
344 } | 353 } |
345 | 354 |
346 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { | 355 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { |
347 precache_url_table()->AddURL(kURL, kOldFetchTime); | 356 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
348 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); | 357 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); |
349 | 358 |
350 // The URL table entry should have been deleted. | 359 // The URL table entry should have been deleted. |
351 EXPECT_TRUE(GetActualURLTableMap().empty()); | 360 EXPECT_TRUE(GetActualURLTableMap().empty()); |
352 | 361 |
353 ExpectNewSample("Precache.Latency.NonPrefetch", 0); | 362 ExpectNewSample("Precache.Latency.NonPrefetch", 0); |
354 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); | 363 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); |
355 ExpectNewSample("Precache.CacheStatus.NonPrefetch", | 364 ExpectNewSample("Precache.CacheStatus.NonPrefetch", |
356 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 365 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
357 ExpectNewSample("Precache.Saved", kSize); | 366 ExpectNewSample("Precache.Saved", kSize); |
(...skipping 12 matching lines...) Expand all Loading... |
370 ExpectNewSample("Precache.CacheStatus.NonPrefetch", | 379 ExpectNewSample("Precache.CacheStatus.NonPrefetch", |
371 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 380 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
372 ExpectNoOtherSamples(); | 381 ExpectNoOtherSamples(); |
373 } | 382 } |
374 | 383 |
375 TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) { | 384 TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) { |
376 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000); | 385 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000); |
377 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59); | 386 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59); |
378 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61); | 387 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61); |
379 | 388 |
380 precache_url_table()->AddURL(GURL("http://expired-precache.com"), k61DaysAgo); | 389 precache_url_table()->AddURL(GURL("http://expired-precache.com"), kReferrerID, |
381 precache_url_table()->AddURL(GURL("http://old-precache.com"), k59DaysAgo); | 390 true, k61DaysAgo); |
| 391 precache_url_table()->AddURL(GURL("http://old-precache.com"), kReferrerID, |
| 392 true, k59DaysAgo); |
382 | 393 |
383 precache_database_->DeleteExpiredPrecacheHistory(kToday); | 394 precache_database_->DeleteExpiredPrecacheHistory(kToday); |
384 | 395 |
385 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo), | 396 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo), |
386 GetActualURLTableMap()); | 397 GetActualURLTableMap()); |
387 } | 398 } |
388 | 399 |
389 TEST_F(PrecacheDatabaseTest, SampleInteraction) { | 400 TEST_F(PrecacheDatabaseTest, SampleInteraction) { |
390 const GURL kURL1("http://url1.com"); | 401 const GURL kURL1("http://url1.com"); |
391 const int64_t kSize1 = 1; | 402 const int64_t kSize1 = 1; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 | 485 |
475 TEST_F(PrecacheDatabaseTest, PrecacheFreshnessPrefetch) { | 486 TEST_F(PrecacheDatabaseTest, PrecacheFreshnessPrefetch) { |
476 auto info = CreateHttpResponseInfo(false /* was_cached */, | 487 auto info = CreateHttpResponseInfo(false /* was_cached */, |
477 false /* network_accessed */); | 488 false /* network_accessed */); |
478 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize); | 489 RecordPrecacheFromNetwork(kURL, kLatency, kFetchTime, kSize); |
479 | 490 |
480 EXPECT_THAT(histograms_.GetAllSamples("Precache.Freshness.Prefetch"), | 491 EXPECT_THAT(histograms_.GetAllSamples("Precache.Freshness.Prefetch"), |
481 ElementsAre(Bucket(kFreshnessBucket10K, 1))); | 492 ElementsAre(Bucket(kFreshnessBucket10K, 1))); |
482 } | 493 } |
483 | 494 |
| 495 TEST_F(PrecacheDatabaseTest, UpdateAndGetReferrerHost) { |
| 496 // Invalid ID should be returned for referrer host that does not exist. |
| 497 EXPECT_EQ(PrecacheReferrerHostEntry::kInvalidId, |
| 498 precache_database_->GetReferrerHost(std::string()).id); |
| 499 EXPECT_EQ(PrecacheReferrerHostEntry::kInvalidId, |
| 500 precache_database_->GetReferrerHost("not_created_host.com").id); |
| 501 |
| 502 // Create a new entry. |
| 503 precache_database_->UpdatePrecacheReferrerHost("foo.com", 1, kFetchTime); |
| 504 Flush(); |
| 505 auto actual_entry = precache_database_->GetReferrerHost("foo.com"); |
| 506 EXPECT_EQ("foo.com", actual_entry.referrer_host); |
| 507 EXPECT_EQ(1, actual_entry.manifest_id); |
| 508 EXPECT_EQ(kFetchTime, actual_entry.time); |
| 509 |
| 510 // Update the existing entry. |
| 511 precache_database_->UpdatePrecacheReferrerHost("foo.com", 2, kNewFetchTime); |
| 512 Flush(); |
| 513 actual_entry = precache_database_->GetReferrerHost("foo.com"); |
| 514 EXPECT_EQ("foo.com", actual_entry.referrer_host); |
| 515 EXPECT_EQ(2, actual_entry.manifest_id); |
| 516 EXPECT_EQ(kNewFetchTime, actual_entry.time); |
| 517 } |
| 518 |
| 519 TEST_F(PrecacheDatabaseTest, GetURLListForReferrerHost) { |
| 520 precache_database_->UpdatePrecacheReferrerHost("foo.com", 1, kFetchTime); |
| 521 precache_database_->UpdatePrecacheReferrerHost("bar.com", 2, kNewFetchTime); |
| 522 precache_database_->UpdatePrecacheReferrerHost("foobar.com", 3, |
| 523 kNewFetchTime); |
| 524 precache_database_->UpdatePrecacheReferrerHost("empty.com", 3, kNewFetchTime); |
| 525 |
| 526 struct test_resource_info { |
| 527 std::string url; |
| 528 bool is_network_fetched; |
| 529 bool is_cellular_fetched; |
| 530 bool expected_in_used; |
| 531 }; |
| 532 |
| 533 const struct { |
| 534 std::string hostname; |
| 535 std::vector<test_resource_info> resource_info; |
| 536 } tests[] = { |
| 537 { |
| 538 "foo.com", |
| 539 { |
| 540 {"http://foo.com/from-cache.js", false, false, true}, |
| 541 {"http://some-cdn.com/from-network.js", true, false, false}, |
| 542 {"http://foo.com/from-cache-cellular.js", false, true, true}, |
| 543 {"http://foo.com/from-network-cellular.js", true, true, false}, |
| 544 }, |
| 545 }, |
| 546 { |
| 547 "bar.com", |
| 548 { |
| 549 {"http://bar.com/a.js", false, false, true}, |
| 550 {"http://some-cdn.com/b.js", false, true, true}, |
| 551 }, |
| 552 }, |
| 553 { |
| 554 "foobar.com", |
| 555 { |
| 556 {"http://some-cdn.com/not-used.js", true, true, false}, |
| 557 }, |
| 558 }, |
| 559 { |
| 560 "empty.com", {}, |
| 561 }, |
| 562 }; |
| 563 // Add precached resources. |
| 564 for (const auto& test : tests) { |
| 565 for (const auto& resource : test.resource_info) { |
| 566 precache_database_->RecordURLPrefetch(GURL(resource.url), test.hostname, |
| 567 base::Time(), false, kSize); |
| 568 } |
| 569 } |
| 570 // Update some resources as used due to user browsing. |
| 571 for (const auto& test : tests) { |
| 572 for (const auto& resource : test.resource_info) { |
| 573 if (!resource.is_network_fetched && !resource.is_cellular_fetched) { |
| 574 RecordFetchFromCache(GURL(resource.url), kFetchTime, kSize); |
| 575 } else if (!resource.is_network_fetched && resource.is_cellular_fetched) { |
| 576 RecordFetchFromCacheCellular(GURL(resource.url), kFetchTime, kSize); |
| 577 } else if (resource.is_network_fetched && !resource.is_cellular_fetched) { |
| 578 RecordFetchFromNetwork(GURL(resource.url), kLatency, kFetchTime, kSize); |
| 579 } else if (resource.is_network_fetched && resource.is_cellular_fetched) { |
| 580 RecordFetchFromNetworkCellular(GURL(resource.url), kLatency, kFetchTime, |
| 581 kSize); |
| 582 } |
| 583 } |
| 584 } |
| 585 Flush(); |
| 586 // Verify the used and unused resources. |
| 587 for (const auto& test : tests) { |
| 588 std::vector<GURL> expected_used_urls, expected_unused_urls; |
| 589 for (const auto& resource : test.resource_info) { |
| 590 if (resource.expected_in_used) { |
| 591 expected_used_urls.push_back(GURL(resource.url)); |
| 592 } else { |
| 593 expected_unused_urls.push_back(GURL(resource.url)); |
| 594 } |
| 595 } |
| 596 std::vector<GURL> actual_used_urls, actual_unused_urls; |
| 597 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; |
| 598 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
| 599 precache_database_->GetURLListForReferrerHost( |
| 600 referrer_id, &actual_used_urls, &actual_unused_urls); |
| 601 EXPECT_THAT(expected_used_urls, ::testing::ContainerEq(actual_used_urls)); |
| 602 EXPECT_THAT(expected_unused_urls, |
| 603 ::testing::ContainerEq(actual_unused_urls)); |
| 604 } |
| 605 // Subsequent manifest updates should clear the used and unused resources. |
| 606 for (const auto& test : tests) { |
| 607 precache_database_->UpdatePrecacheReferrerHost(test.hostname, 100, |
| 608 kNewFetchTime); |
| 609 Flush(); |
| 610 std::vector<GURL> actual_used_urls, actual_unused_urls; |
| 611 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; |
| 612 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
| 613 precache_database_->GetURLListForReferrerHost( |
| 614 referrer_id, &actual_used_urls, &actual_unused_urls); |
| 615 EXPECT_TRUE(actual_used_urls.empty()); |
| 616 EXPECT_TRUE(actual_unused_urls.empty()); |
| 617 } |
| 618 } |
| 619 |
484 } // namespace | 620 } // namespace |
485 | 621 |
486 } // namespace precache | 622 } // namespace precache |
OLD | NEW |