| 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> |
| 11 | 11 |
| 12 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" |
| 12 #include "base/containers/hash_tables.h" | 14 #include "base/containers/hash_tables.h" |
| 13 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
| 14 #include "base/files/scoped_temp_dir.h" | 16 #include "base/files/scoped_temp_dir.h" |
| 15 #include "base/message_loop/message_loop.h" | 17 #include "base/message_loop/message_loop.h" |
| 16 #include "base/metrics/histogram_base.h" | 18 #include "base/metrics/histogram_base.h" |
| 17 #include "base/test/histogram_tester.h" | 19 #include "base/test/histogram_tester.h" |
| 18 #include "base/time/time.h" | 20 #include "base/time/time.h" |
| 19 #include "components/history/core/browser/history_constants.h" | 21 #include "components/history/core/browser/history_constants.h" |
| 20 #include "net/http/http_response_headers.h" | 22 #include "net/http/http_response_headers.h" |
| 21 #include "net/http/http_response_info.h" | 23 #include "net/http/http_response_info.h" |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 | 258 |
| 257 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); | 259 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); |
| 258 | 260 |
| 259 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); | 261 ExpectNewSample("Precache.DownloadedPrecacheMotivated", kSize); |
| 260 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); | 262 ExpectNewSample("Precache.Latency.Prefetch", kLatency.InMilliseconds()); |
| 261 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); | 263 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); |
| 262 ExpectNoOtherSamples(); | 264 ExpectNoOtherSamples(); |
| 263 } | 265 } |
| 264 | 266 |
| 265 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { | 267 TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { |
| 266 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); | 268 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false); |
| 267 RecordPrecacheFromCache(kURL, kFetchTime, kSize); | 269 RecordPrecacheFromCache(kURL, kFetchTime, kSize); |
| 268 | 270 |
| 269 // The URL table entry should have been updated to have |kFetchTime| as the | 271 // The URL table entry should have been updated to have |kFetchTime| as the |
| 270 // timestamp. | 272 // timestamp. |
| 271 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); | 273 EXPECT_EQ(BuildURLTableMap(kURL, kFetchTime), GetActualURLTableMap()); |
| 272 | 274 |
| 273 ExpectNewSample("Precache.Latency.Prefetch", 0); | 275 ExpectNewSample("Precache.Latency.Prefetch", 0); |
| 274 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); | 276 ExpectNewSample("Precache.Freshness.Prefetch", kFreshnessBucket10K); |
| 275 ExpectNoOtherSamples(); | 277 ExpectNoOtherSamples(); |
| 276 } | 278 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); | 321 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); |
| 320 ExpectNewSample("Precache.DownloadedNonPrecache.Cellular", kSize); | 322 ExpectNewSample("Precache.DownloadedNonPrecache.Cellular", kSize); |
| 321 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); | 323 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); |
| 322 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); | 324 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); |
| 323 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", | 325 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", |
| 324 kLatency.InMilliseconds()); | 326 kLatency.InMilliseconds()); |
| 325 ExpectNoOtherSamples(); | 327 ExpectNoOtherSamples(); |
| 326 } | 328 } |
| 327 | 329 |
| 328 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { | 330 TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { |
| 329 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); | 331 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false); |
| 330 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); | 332 RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); |
| 331 | 333 |
| 332 // The URL table entry should have been deleted. | 334 // The URL table entry should have been deleted. |
| 333 EXPECT_TRUE(GetActualURLTableMap().empty()); | 335 EXPECT_TRUE(GetActualURLTableMap().empty()); |
| 334 | 336 |
| 335 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); | 337 ExpectNewSample("Precache.DownloadedNonPrecache", kSize); |
| 336 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); | 338 ExpectNewSample("Precache.Latency.NonPrefetch", kLatency.InMilliseconds()); |
| 337 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", | 339 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", |
| 338 kLatency.InMilliseconds()); | 340 kLatency.InMilliseconds()); |
| 339 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); | 341 ExpectNewSample("Precache.CacheStatus.NonPrefetch", kFromNetwork); |
| 340 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", | 342 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", |
| 341 kFromNetwork); | 343 kFromNetwork); |
| 342 ExpectNoOtherSamples(); | 344 ExpectNoOtherSamples(); |
| 343 } | 345 } |
| 344 | 346 |
| 345 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { | 347 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { |
| 346 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); | 348 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false); |
| 347 RecordFetchFromCache(kURL, kFetchTime, kSize); | 349 RecordFetchFromCache(kURL, kFetchTime, kSize); |
| 348 | 350 |
| 349 // The URL table entry should have been deleted. | 351 // The URL table entry should have been deleted. |
| 350 EXPECT_TRUE(GetActualURLTableMap().empty()); | 352 EXPECT_TRUE(GetActualURLTableMap().empty()); |
| 351 | 353 |
| 352 ExpectNewSample("Precache.Latency.NonPrefetch", 0); | 354 ExpectNewSample("Precache.Latency.NonPrefetch", 0); |
| 353 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); | 355 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); |
| 354 ExpectNewSample("Precache.CacheStatus.NonPrefetch", | 356 ExpectNewSample("Precache.CacheStatus.NonPrefetch", |
| 355 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 357 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
| 356 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", | 358 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", |
| 357 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 359 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
| 358 ExpectNewSample("Precache.Saved", kSize); | 360 ExpectNewSample("Precache.Saved", kSize); |
| 359 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K); | 361 ExpectNewSample("Precache.Saved.Freshness", kFreshnessBucket10K); |
| 360 ExpectNoOtherSamples(); | 362 ExpectNoOtherSamples(); |
| 361 } | 363 } |
| 362 | 364 |
| 363 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { | 365 TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { |
| 364 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); | 366 precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime, false); |
| 365 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); | 367 RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); |
| 366 | 368 |
| 367 // The URL table entry should have been deleted. | 369 // The URL table entry should have been deleted. |
| 368 EXPECT_TRUE(GetActualURLTableMap().empty()); | 370 EXPECT_TRUE(GetActualURLTableMap().empty()); |
| 369 | 371 |
| 370 ExpectNewSample("Precache.Latency.NonPrefetch", 0); | 372 ExpectNewSample("Precache.Latency.NonPrefetch", 0); |
| 371 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); | 373 ExpectNewSample("Precache.Latency.NonPrefetch.NonTopHosts", 0); |
| 372 ExpectNewSample("Precache.CacheStatus.NonPrefetch", | 374 ExpectNewSample("Precache.CacheStatus.NonPrefetch", |
| 373 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 375 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
| 374 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", | 376 ExpectNewSample("Precache.CacheStatus.NonPrefetch.FromPrecache", |
| (...skipping 15 matching lines...) Expand all Loading... |
| 390 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); | 392 HttpResponseInfo::CacheEntryStatus::ENTRY_USED); |
| 391 ExpectNoOtherSamples(); | 393 ExpectNoOtherSamples(); |
| 392 } | 394 } |
| 393 | 395 |
| 394 TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) { | 396 TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) { |
| 395 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000); | 397 const base::Time kToday = base::Time() + base::TimeDelta::FromDays(1000); |
| 396 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59); | 398 const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59); |
| 397 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61); | 399 const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61); |
| 398 | 400 |
| 399 precache_url_table()->AddURL(GURL("http://expired-precache.com"), kReferrerID, | 401 precache_url_table()->AddURL(GURL("http://expired-precache.com"), kReferrerID, |
| 400 true, k61DaysAgo); | 402 true, k61DaysAgo, false); |
| 401 precache_url_table()->AddURL(GURL("http://old-precache.com"), kReferrerID, | 403 precache_url_table()->AddURL(GURL("http://old-precache.com"), kReferrerID, |
| 402 true, k59DaysAgo); | 404 true, k59DaysAgo, false); |
| 403 | 405 |
| 404 precache_database_->DeleteExpiredPrecacheHistory(kToday); | 406 precache_database_->DeleteExpiredPrecacheHistory(kToday); |
| 405 | 407 |
| 406 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo), | 408 EXPECT_EQ(BuildURLTableMap(GURL("http://old-precache.com"), k59DaysAgo), |
| 407 GetActualURLTableMap()); | 409 GetActualURLTableMap()); |
| 408 } | 410 } |
| 409 | 411 |
| 410 TEST_F(PrecacheDatabaseTest, SampleInteraction) { | 412 TEST_F(PrecacheDatabaseTest, SampleInteraction) { |
| 411 const GURL kURL1("http://url1.com"); | 413 const GURL kURL1("http://url1.com"); |
| 412 const int64_t kSize1 = 1; | 414 const int64_t kSize1 = 1; |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 RecordFetchFromCacheCellular(GURL(resource.url), kFetchTime, kSize); | 595 RecordFetchFromCacheCellular(GURL(resource.url), kFetchTime, kSize); |
| 594 } else if (resource.is_network_fetched && !resource.is_cellular_fetched) { | 596 } else if (resource.is_network_fetched && !resource.is_cellular_fetched) { |
| 595 RecordFetchFromNetwork(GURL(resource.url), kLatency, kFetchTime, kSize); | 597 RecordFetchFromNetwork(GURL(resource.url), kLatency, kFetchTime, kSize); |
| 596 } else if (resource.is_network_fetched && resource.is_cellular_fetched) { | 598 } else if (resource.is_network_fetched && resource.is_cellular_fetched) { |
| 597 RecordFetchFromNetworkCellular(GURL(resource.url), kLatency, kFetchTime, | 599 RecordFetchFromNetworkCellular(GURL(resource.url), kLatency, kFetchTime, |
| 598 kSize); | 600 kSize); |
| 599 } | 601 } |
| 600 } | 602 } |
| 601 } | 603 } |
| 602 Flush(); | 604 Flush(); |
| 603 // Verify the used and unused resources. | 605 // Verify the used and downloaded resources. |
| 604 for (const auto& test : tests) { | 606 for (const auto& test : tests) { |
| 605 std::vector<GURL> expected_used_urls, expected_unused_urls; | 607 std::vector<GURL> expected_used_urls, expected_downloaded_urls; |
| 606 for (const auto& resource : test.resource_info) { | 608 for (const auto& resource : test.resource_info) { |
| 607 if (resource.expected_in_used) { | 609 if (resource.expected_in_used) { |
| 608 expected_used_urls.push_back(GURL(resource.url)); | 610 expected_used_urls.push_back(GURL(resource.url)); |
| 609 } else { | |
| 610 expected_unused_urls.push_back(GURL(resource.url)); | |
| 611 } | 611 } |
| 612 expected_downloaded_urls.push_back(GURL(resource.url)); |
| 612 } | 613 } |
| 613 std::vector<GURL> actual_used_urls, actual_unused_urls; | 614 std::vector<GURL> actual_used_urls, actual_downloaded_urls; |
| 614 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; | 615 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; |
| 615 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); | 616 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
| 616 precache_database_->GetURLListForReferrerHost( | 617 precache_database_->GetURLListForReferrerHost( |
| 617 referrer_id, &actual_used_urls, &actual_unused_urls); | 618 referrer_id, &actual_used_urls, &actual_downloaded_urls); |
| 618 EXPECT_THAT(expected_used_urls, ::testing::ContainerEq(actual_used_urls)); | 619 EXPECT_THAT(actual_used_urls, ::testing::ContainerEq(expected_used_urls)); |
| 619 EXPECT_THAT(expected_unused_urls, | 620 EXPECT_THAT(actual_downloaded_urls, |
| 620 ::testing::ContainerEq(actual_unused_urls)); | 621 ::testing::ContainerEq(expected_downloaded_urls)) |
| 622 << "Host: " << test.hostname; |
| 621 } | 623 } |
| 622 // Subsequent manifest updates should clear the used and unused resources. | 624 // Subsequent manifest updates should clear the used and downloaded resources. |
| 623 for (const auto& test : tests) { | 625 for (const auto& test : tests) { |
| 624 precache_database_->UpdatePrecacheReferrerHost(test.hostname, 100, | 626 precache_database_->UpdatePrecacheReferrerHost(test.hostname, 100, |
| 625 kNewFetchTime); | 627 kNewFetchTime); |
| 626 Flush(); | 628 Flush(); |
| 627 std::vector<GURL> actual_used_urls, actual_unused_urls; | 629 std::vector<GURL> actual_used_urls, actual_downloaded_urls; |
| 628 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; | 630 auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; |
| 629 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); | 631 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
| 630 precache_database_->GetURLListForReferrerHost( | 632 precache_database_->GetURLListForReferrerHost( |
| 631 referrer_id, &actual_used_urls, &actual_unused_urls); | 633 referrer_id, &actual_used_urls, &actual_downloaded_urls); |
| 632 EXPECT_TRUE(actual_used_urls.empty()); | 634 EXPECT_THAT(actual_used_urls, ::testing::IsEmpty()); |
| 635 EXPECT_THAT(actual_downloaded_urls, ::testing::IsEmpty()); |
| 633 } | 636 } |
| 634 // Resources that were precached previously and not seen in user browsing | 637 // Resources that were precached previously and not seen in user browsing |
| 635 // should be still marked as precached. | 638 // should be still marked as precached. |
| 636 std::map<GURL, base::Time> expected_url_table_map; | 639 std::map<GURL, base::Time> expected_url_table_map; |
| 637 for (const auto& test : tests) { | 640 for (const auto& test : tests) { |
| 638 for (const auto& resource : test.resource_info) { | 641 for (const auto& resource : test.resource_info) { |
| 639 if (!resource.is_user_browsed) | 642 if (!resource.is_user_browsed) |
| 640 expected_url_table_map[GURL(resource.url)] = kPrecacheTime; | 643 expected_url_table_map[GURL(resource.url)] = kPrecacheTime; |
| 641 } | 644 } |
| 642 } | 645 } |
| 643 EXPECT_EQ(expected_url_table_map, GetActualURLTableMap()); | 646 EXPECT_EQ(expected_url_table_map, GetActualURLTableMap()); |
| 644 } | 647 } |
| 645 | 648 |
| 649 TEST_F(PrecacheDatabaseTest, GetURLListForReferrerHostReportsDownloadedOnce) { |
| 650 precache_database_->UpdatePrecacheReferrerHost("foo.com", 1, kFetchTime); |
| 651 // Add two resources that shouldn't appear in downloaded. |
| 652 Flush(); // We need to write the referrer_host_id. |
| 653 const std::string already_reported_and_not_refetch = |
| 654 "http://foo.com/already-reported-and-not-refetch.js"; |
| 655 precache_database_->RecordURLPrefetch(GURL(already_reported_and_not_refetch), |
| 656 "foo.com", kPrecacheTime, false, kSize); |
| 657 const std::string already_reported_and_in_cache = |
| 658 "http://foo.com/already-reported-and-in-cache.js"; |
| 659 precache_database_->RecordURLPrefetch(GURL(already_reported_and_in_cache), |
| 660 "foo.com", kPrecacheTime, false, kSize); |
| 661 const std::string already_reported_but_refetch = |
| 662 "http://foo.com/already-reported-but-refetch.js"; |
| 663 precache_database_->RecordURLPrefetch(GURL(already_reported_but_refetch), |
| 664 "foo.com", kPrecacheTime, false, kSize); |
| 665 { |
| 666 // Let's mark existing resources as is_download_reported = 1 by calling |
| 667 // GetURLListForReferrerHost. |
| 668 std::vector<GURL> unused_a, unused_b; |
| 669 auto id = precache_database_->GetReferrerHost("foo.com").id; |
| 670 ASSERT_NE(PrecacheReferrerHostEntry::kInvalidId, id); |
| 671 precache_database_->GetURLListForReferrerHost(id, &unused_a, &unused_b); |
| 672 } |
| 673 |
| 674 precache_database_->RecordURLPrefetch(GURL(already_reported_and_in_cache), |
| 675 "foo.com", kPrecacheTime, |
| 676 true /* was_cached */, kSize); |
| 677 precache_database_->RecordURLPrefetch(GURL(already_reported_but_refetch), |
| 678 "foo.com", kPrecacheTime, |
| 679 false /* was_cached */, kSize); |
| 680 Flush(); |
| 681 |
| 682 // Only the refetch resource should be reported as downloaded this time |
| 683 // around. |
| 684 std::vector<GURL> _, actual_downloaded_urls; |
| 685 auto referrer_id = precache_database_->GetReferrerHost("foo.com").id; |
| 686 EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
| 687 precache_database_->GetURLListForReferrerHost(referrer_id, &_, |
| 688 &actual_downloaded_urls); |
| 689 EXPECT_THAT(actual_downloaded_urls, |
| 690 ElementsAre(GURL(already_reported_but_refetch))); |
| 691 } |
| 692 |
| 646 } // namespace | 693 } // namespace |
| 647 | 694 |
| 648 } // namespace precache | 695 } // namespace precache |
| OLD | NEW |