Index: components/precache/core/precache_database_unittest.cc |
diff --git a/components/precache/core/precache_database_unittest.cc b/components/precache/core/precache_database_unittest.cc |
index a4e7e4651b957759b0d294a5f7d67cc96813b372..5ad8f6c9f569077826f13df0f37fbe891e803f4e 100644 |
--- a/components/precache/core/precache_database_unittest.cc |
+++ b/components/precache/core/precache_database_unittest.cc |
@@ -32,9 +32,12 @@ using base::Bucket; |
using net::HttpResponseInfo; |
const GURL kURL("http://url.com"); |
+const int kReferrerID = 1; |
const base::TimeDelta kLatency = base::TimeDelta::FromMilliseconds(5); |
const base::Time kFetchTime = base::Time() + base::TimeDelta::FromHours(1000); |
const base::Time kOldFetchTime = kFetchTime - base::TimeDelta::FromDays(1); |
+const base::Time kNewFetchTime = |
+ base::Time() + base::TimeDelta::FromHours(2000); |
const int64_t kSize = 5000; |
const int64_t kFreshnessBucket10K = 9089; |
// One of the possible CacheEntryStatus for when the fetch was served from the |
@@ -93,7 +96,7 @@ class PrecacheDatabaseTest : public testing::Test { |
ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
base::FilePath db_path = scoped_temp_dir_.path().Append( |
base::FilePath(FILE_PATH_LITERAL("precache_database"))); |
- precache_database_->Init(db_path); |
+ ASSERT_TRUE(precache_database_->Init(db_path)); |
} |
std::map<GURL, base::Time> GetActualURLTableMap() { |
@@ -109,6 +112,8 @@ class PrecacheDatabaseTest : public testing::Test { |
return &precache_database_->precache_url_table_; |
} |
+ void Flush() { precache_database_->Flush(); } |
+ |
// Convenience methods for recording different types of URL fetches. These |
// exist to improve the readability of the tests. |
void RecordPrecacheFromNetwork(const GURL& url, |
@@ -168,7 +173,9 @@ void PrecacheDatabaseTest::RecordPrecacheFromNetwork( |
int64_t size) { |
const HttpResponseInfo info = CreateHttpResponseInfo( |
false /* was_cached */, false /* network_accessed */); |
- precache_database_->RecordURLPrefetch(url, latency, fetch_time, info, size); |
+ precache_database_->RecordURLPrefetchMetrics(info, latency); |
+ precache_database_->RecordURLPrefetch(url, std::string(), fetch_time, |
+ info.was_cached, size); |
} |
void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url, |
@@ -176,8 +183,10 @@ void PrecacheDatabaseTest::RecordPrecacheFromCache(const GURL& url, |
int64_t size) { |
const HttpResponseInfo info = CreateHttpResponseInfo( |
true /* was_cached */, false /* network_accessed */); |
- precache_database_->RecordURLPrefetch(url, base::TimeDelta() /* latency */, |
- fetch_time, info, size); |
+ precache_database_->RecordURLPrefetchMetrics(info, |
+ base::TimeDelta() /* latency */); |
+ precache_database_->RecordURLPrefetch(url, std::string(), fetch_time, |
+ info.was_cached, size); |
} |
void PrecacheDatabaseTest::RecordFetchFromNetwork(const GURL& url, |
@@ -250,7 +259,7 @@ TEST_F(PrecacheDatabaseTest, PrecacheOverNetwork) { |
} |
TEST_F(PrecacheDatabaseTest, PrecacheFromCacheWithURLTableEntry) { |
- precache_url_table()->AddURL(kURL, kOldFetchTime); |
+ precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
RecordPrecacheFromCache(kURL, kFetchTime, kSize); |
// The URL table entry should have been updated to have |kFetchTime| as the |
@@ -313,7 +322,7 @@ TEST_F(PrecacheDatabaseTest, FetchOverNetwork_Cellular) { |
} |
TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { |
- precache_url_table()->AddURL(kURL, kOldFetchTime); |
+ precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
RecordFetchFromNetwork(kURL, kLatency, kFetchTime, kSize); |
// The URL table entry should have been deleted. |
@@ -328,7 +337,7 @@ TEST_F(PrecacheDatabaseTest, FetchOverNetworkWithURLTableEntry) { |
} |
TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { |
- precache_url_table()->AddURL(kURL, kOldFetchTime); |
+ precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
RecordFetchFromCache(kURL, kFetchTime, kSize); |
// The URL table entry should have been deleted. |
@@ -344,7 +353,7 @@ TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_NonCellular) { |
} |
TEST_F(PrecacheDatabaseTest, FetchFromCacheWithURLTableEntry_Cellular) { |
- precache_url_table()->AddURL(kURL, kOldFetchTime); |
+ precache_url_table()->AddURL(kURL, kReferrerID, true, kOldFetchTime); |
RecordFetchFromCacheCellular(kURL, kFetchTime, kSize); |
// The URL table entry should have been deleted. |
@@ -377,8 +386,10 @@ TEST_F(PrecacheDatabaseTest, DeleteExpiredPrecacheHistory) { |
const base::Time k59DaysAgo = kToday - base::TimeDelta::FromDays(59); |
const base::Time k61DaysAgo = kToday - base::TimeDelta::FromDays(61); |
- precache_url_table()->AddURL(GURL("http://expired-precache.com"), k61DaysAgo); |
- precache_url_table()->AddURL(GURL("http://old-precache.com"), k59DaysAgo); |
+ precache_url_table()->AddURL(GURL("http://expired-precache.com"), kReferrerID, |
+ true, k61DaysAgo); |
+ precache_url_table()->AddURL(GURL("http://old-precache.com"), kReferrerID, |
+ true, k59DaysAgo); |
precache_database_->DeleteExpiredPrecacheHistory(kToday); |
@@ -481,6 +492,131 @@ TEST_F(PrecacheDatabaseTest, PrecacheFreshnessPrefetch) { |
ElementsAre(Bucket(kFreshnessBucket10K, 1))); |
} |
+TEST_F(PrecacheDatabaseTest, UpdateAndGetReferrerHost) { |
+ // Invalid ID should be returned for referrer host that does not exist. |
+ EXPECT_EQ(PrecacheReferrerHostEntry::kInvalidId, |
+ precache_database_->GetReferrerHost(std::string()).id); |
+ EXPECT_EQ(PrecacheReferrerHostEntry::kInvalidId, |
+ precache_database_->GetReferrerHost("not_created_host.com").id); |
+ |
+ // Create a new entry. |
+ precache_database_->UpdatePrecacheReferrerHost("foo.com", 1, kFetchTime); |
+ Flush(); |
+ auto actual_entry = precache_database_->GetReferrerHost("foo.com"); |
+ EXPECT_EQ("foo.com", actual_entry.referrer_host); |
+ EXPECT_EQ(1, actual_entry.manifest_id); |
+ EXPECT_EQ(kFetchTime, actual_entry.time); |
+ |
+ // Update the existing entry. |
+ precache_database_->UpdatePrecacheReferrerHost("foo.com", 2, kNewFetchTime); |
+ Flush(); |
+ actual_entry = precache_database_->GetReferrerHost("foo.com"); |
+ EXPECT_EQ("foo.com", actual_entry.referrer_host); |
+ EXPECT_EQ(2, actual_entry.manifest_id); |
+ EXPECT_EQ(kNewFetchTime, actual_entry.time); |
+} |
+ |
+TEST_F(PrecacheDatabaseTest, GetURLListForReferrerHost) { |
+ precache_database_->UpdatePrecacheReferrerHost("foo.com", 1, kFetchTime); |
+ precache_database_->UpdatePrecacheReferrerHost("bar.com", 2, kNewFetchTime); |
+ precache_database_->UpdatePrecacheReferrerHost("foobar.com", 3, |
+ kNewFetchTime); |
+ precache_database_->UpdatePrecacheReferrerHost("empty.com", 3, kNewFetchTime); |
+ |
+ struct test_resource_info { |
+ std::string url; |
+ bool is_network_fetched; |
+ bool is_cellular_fetched; |
+ bool expected_in_used; |
+ }; |
+ |
+ const struct { |
+ std::string hostname; |
+ std::vector<test_resource_info> resource_info; |
+ } tests[] = { |
+ { |
+ "foo.com", |
+ { |
+ {"http://foo.com/from-cache.js", false, false, true}, |
+ {"http://some-cdn.com/from-network.js", true, false, false}, |
+ {"http://foo.com/from-cache-cellular.js", false, true, true}, |
+ {"http://foo.com/from-network-cellular.js", true, true, false}, |
+ }, |
+ }, |
+ { |
+ "bar.com", |
+ { |
+ {"http://bar.com/a.js", false, false, true}, |
+ {"http://some-cdn.com/b.js", false, true, true}, |
+ }, |
+ }, |
+ { |
+ "foobar.com", |
+ { |
+ {"http://some-cdn.com/not-used.js", true, true, false}, |
+ }, |
+ }, |
+ { |
+ "empty.com", {}, |
+ }, |
+ }; |
+ // Add precached resources. |
+ for (const auto& test : tests) { |
+ for (const auto& resource : test.resource_info) { |
+ precache_database_->RecordURLPrefetch(GURL(resource.url), test.hostname, |
+ base::Time(), false, kSize); |
+ } |
+ } |
+ // Update some resources as used due to user browsing. |
+ for (const auto& test : tests) { |
+ for (const auto& resource : test.resource_info) { |
+ if (!resource.is_network_fetched && !resource.is_cellular_fetched) { |
+ RecordFetchFromCache(GURL(resource.url), kFetchTime, kSize); |
+ } else if (!resource.is_network_fetched && resource.is_cellular_fetched) { |
+ RecordFetchFromCacheCellular(GURL(resource.url), kFetchTime, kSize); |
+ } else if (resource.is_network_fetched && !resource.is_cellular_fetched) { |
+ RecordFetchFromNetwork(GURL(resource.url), kLatency, kFetchTime, kSize); |
+ } else if (resource.is_network_fetched && resource.is_cellular_fetched) { |
+ RecordFetchFromNetworkCellular(GURL(resource.url), kLatency, kFetchTime, |
+ kSize); |
+ } |
+ } |
+ } |
+ Flush(); |
+ // Verify the used and unused resources. |
+ for (const auto& test : tests) { |
+ std::vector<GURL> expected_used_urls, expected_unused_urls; |
+ for (const auto& resource : test.resource_info) { |
+ if (resource.expected_in_used) { |
+ expected_used_urls.push_back(GURL(resource.url)); |
+ } else { |
+ expected_unused_urls.push_back(GURL(resource.url)); |
+ } |
+ } |
+ std::vector<GURL> actual_used_urls, actual_unused_urls; |
+ auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; |
+ EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
+ precache_database_->GetURLListForReferrerHost( |
+ referrer_id, &actual_used_urls, &actual_unused_urls); |
+ EXPECT_THAT(expected_used_urls, ::testing::ContainerEq(actual_used_urls)); |
+ EXPECT_THAT(expected_unused_urls, |
+ ::testing::ContainerEq(actual_unused_urls)); |
+ } |
+ // Subsequent manifest updates should clear the used and unused resources. |
+ for (const auto& test : tests) { |
+ precache_database_->UpdatePrecacheReferrerHost(test.hostname, 100, |
+ kNewFetchTime); |
+ Flush(); |
+ std::vector<GURL> actual_used_urls, actual_unused_urls; |
+ auto referrer_id = precache_database_->GetReferrerHost(test.hostname).id; |
+ EXPECT_NE(PrecacheReferrerHostEntry::kInvalidId, referrer_id); |
+ precache_database_->GetURLListForReferrerHost( |
+ referrer_id, &actual_used_urls, &actual_unused_urls); |
+ EXPECT_TRUE(actual_used_urls.empty()); |
+ EXPECT_TRUE(actual_unused_urls.empty()); |
+ } |
+} |
+ |
} // namespace |
} // namespace precache |