Index: components/history/core/browser/thumbnail_database_unittest.cc |
diff --git a/components/history/core/browser/thumbnail_database_unittest.cc b/components/history/core/browser/thumbnail_database_unittest.cc |
index 0ece892cfe4f636598149b10c95caa3af283da1e..4dbd0c6f64e00039c9c134db30ee9858dd1d6d3f 100644 |
--- a/components/history/core/browser/thumbnail_database_unittest.cc |
+++ b/components/history/core/browser/thumbnail_database_unittest.cc |
@@ -85,7 +85,8 @@ void AddAndMapFaviconSimple(ThumbnailDatabase* db, |
scoped_refptr<base::RefCountedStaticMemory> data( |
new base::RefCountedStaticMemory(kBlob1, sizeof(kBlob1))); |
favicon_base::FaviconID favicon_id = |
- db->AddFavicon(icon_url, icon_type, data, base::Time::Now(), gfx::Size()); |
+ db->AddFavicon(icon_url, icon_type, data, FaviconBitmapType::ON_VISIT, |
+ base::Time::Now(), gfx::Size()); |
db->AddIconMapping(page_url, favicon_id); |
} |
@@ -213,7 +214,8 @@ TEST_F(ThumbnailDatabaseTest, AddIconMapping) { |
GURL url("http://google.com"); |
base::Time time = base::Time::Now(); |
favicon_base::FaviconID id = |
- db.AddFavicon(url, favicon_base::TOUCH_ICON, favicon, time, gfx::Size()); |
+ db.AddFavicon(url, favicon_base::TOUCH_ICON, favicon, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(0, id); |
EXPECT_NE(0, db.AddIconMapping(url, id)); |
@@ -224,37 +226,145 @@ TEST_F(ThumbnailDatabaseTest, AddIconMapping) { |
EXPECT_EQ(id, icon_mappings.front().icon_id); |
} |
-TEST_F(ThumbnailDatabaseTest, LastRequestedTime) { |
- ThumbnailDatabase db(NULL); |
+TEST_F(ThumbnailDatabaseTest, |
+ AddOnDemandFaviconBitmapCreatesCorrectTimestamps) { |
+ ThumbnailDatabase db(nullptr); |
ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); |
db.BeginTransaction(); |
+ base::Time add_time; |
+ ASSERT_TRUE( |
+ base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &add_time)); |
std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); |
scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); |
GURL url("http://google.com"); |
- base::Time now = base::Time::Now(); |
- favicon_base::FaviconID id = |
- db.AddFavicon(url, favicon_base::TOUCH_ICON, favicon, now, gfx::Size()); |
- ASSERT_NE(0, id); |
- |
- // Fetching the last requested time of a non-existent bitmap should fail. |
- base::Time last_requested = base::Time::UnixEpoch(); |
- EXPECT_FALSE(db.GetFaviconBitmap(id + 1, NULL, &last_requested, NULL, NULL)); |
- EXPECT_EQ(last_requested, base::Time::UnixEpoch()); // Remains unchanged. |
- |
- // Fetching the last requested time of a bitmap that has no last request |
- // should return a null timestamp. |
- last_requested = base::Time::UnixEpoch(); |
- EXPECT_TRUE(db.GetFaviconBitmap(id, NULL, &last_requested, NULL, NULL)); |
- EXPECT_TRUE(last_requested.is_null()); |
- |
- // Setting the last requested time of an existing bitmap should succeed, and |
- // the set time should be returned by the corresponding "Get". |
- last_requested = base::Time::UnixEpoch(); |
- EXPECT_TRUE(db.SetFaviconBitmapLastRequestedTime(id, now)); |
- EXPECT_TRUE(db.GetFaviconBitmap(id, NULL, &last_requested, NULL, NULL)); |
- EXPECT_EQ(last_requested, now); |
+ favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); |
+ ASSERT_NE(0, icon); |
+ FaviconBitmapID bitmap = db.AddFaviconBitmap( |
+ icon, favicon, FaviconBitmapType::ON_DEMAND, add_time, gfx::Size()); |
+ ASSERT_NE(0, bitmap); |
+ |
+ base::Time last_updated; |
+ base::Time last_requested; |
+ ASSERT_TRUE(db.GetFaviconBitmap(bitmap, &last_updated, &last_requested, |
+ nullptr, nullptr)); |
+ EXPECT_EQ(base::Time(), last_updated); |
+ EXPECT_EQ(add_time, last_requested); |
+} |
+ |
+TEST_F(ThumbnailDatabaseTest, AddFaviconBitmapCreatesCorrectTimestamps) { |
+ ThumbnailDatabase db(nullptr); |
+ ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); |
+ db.BeginTransaction(); |
+ |
+ base::Time add_time; |
+ ASSERT_TRUE( |
+ base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &add_time)); |
+ std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); |
+ scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); |
+ |
+ GURL url("http://google.com"); |
+ favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); |
+ ASSERT_NE(0, icon); |
+ FaviconBitmapID bitmap = db.AddFaviconBitmap( |
+ icon, favicon, FaviconBitmapType::ON_VISIT, add_time, gfx::Size()); |
+ ASSERT_NE(0, bitmap); |
+ |
+ base::Time last_updated; |
+ base::Time last_requested; |
+ ASSERT_TRUE(db.GetFaviconBitmap(bitmap, &last_updated, &last_requested, |
+ nullptr, nullptr)); |
+ EXPECT_EQ(add_time, last_updated); |
+ EXPECT_EQ(base::Time(), last_requested); |
+} |
+ |
+TEST_F(ThumbnailDatabaseTest, TouchUpdatesOnDemandFavicons) { |
+ ThumbnailDatabase db(nullptr); |
+ ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); |
+ db.BeginTransaction(); |
+ |
+ base::Time start; |
+ ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); |
+ std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); |
+ scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); |
+ |
+ // Create an on-demand favicon. |
+ GURL url("http://google.com"); |
+ favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); |
+ ASSERT_NE(0, icon); |
+ FaviconBitmapID bitmap = db.AddFaviconBitmap( |
+ icon, favicon, FaviconBitmapType::ON_DEMAND, start, gfx::Size()); |
+ ASSERT_NE(0, bitmap); |
+ |
+ base::Time end = |
+ start + base::TimeDelta::FromDays(kFaviconUpdateLastRequestedAfterDays); |
+ EXPECT_TRUE(db.TouchOnDemandFavicon(url, end)); |
+ |
+ base::Time last_updated; |
+ base::Time last_requested; |
+ EXPECT_TRUE(db.GetFaviconBitmap(bitmap, &last_updated, &last_requested, |
+ nullptr, nullptr)); |
+ // Does not mess with the last_updated field. |
+ EXPECT_EQ(base::Time(), last_updated); |
+ EXPECT_EQ(end, last_requested); // Updates the last_requested field. |
+} |
+ |
+TEST_F(ThumbnailDatabaseTest, TouchUpdatesOnlyInfrequently) { |
+ ThumbnailDatabase db(nullptr); |
+ ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); |
+ db.BeginTransaction(); |
+ |
+ base::Time start; |
+ ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); |
+ std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); |
+ scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); |
+ |
+ // Create an on-demand favicon. |
+ GURL url("http://google.com"); |
+ favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); |
+ ASSERT_NE(0, icon); |
+ FaviconBitmapID bitmap = db.AddFaviconBitmap( |
+ icon, favicon, FaviconBitmapType::ON_DEMAND, start, gfx::Size()); |
+ ASSERT_NE(0, bitmap); |
+ |
+ base::Time end = start + base::TimeDelta::FromMinutes(1); |
+ EXPECT_TRUE(db.TouchOnDemandFavicon(url, end)); |
+ |
+ base::Time last_requested; |
+ EXPECT_TRUE( |
+ db.GetFaviconBitmap(bitmap, nullptr, &last_requested, nullptr, nullptr)); |
+ EXPECT_EQ(start, last_requested); // No update. |
+} |
+ |
+TEST_F(ThumbnailDatabaseTest, TouchDoesNotUpdateStandardFavicons) { |
+ ThumbnailDatabase db(nullptr); |
+ ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); |
+ db.BeginTransaction(); |
+ |
+ base::Time start; |
+ ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); |
+ std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); |
+ scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); |
+ |
+ // Create a standard favicon. |
+ GURL url("http://google.com"); |
+ favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); |
+ EXPECT_NE(0, icon); |
+ FaviconBitmapID bitmap = db.AddFaviconBitmap( |
+ icon, favicon, FaviconBitmapType::ON_VISIT, start, gfx::Size()); |
+ EXPECT_NE(0, bitmap); |
+ |
+ base::Time end = |
+ start + base::TimeDelta::FromDays(kFaviconUpdateLastRequestedAfterDays); |
+ db.TouchOnDemandFavicon(url, end); |
+ |
+ base::Time last_updated; |
+ base::Time last_requested; |
+ EXPECT_TRUE(db.GetFaviconBitmap(bitmap, &last_updated, &last_requested, |
+ nullptr, nullptr)); |
+ EXPECT_EQ(start, last_updated); // Does not mess with last_updated. |
+ EXPECT_EQ(base::Time(), last_requested); // No update. |
} |
TEST_F(ThumbnailDatabaseTest, DeleteIconMappings) { |
@@ -268,7 +378,8 @@ TEST_F(ThumbnailDatabaseTest, DeleteIconMappings) { |
GURL url("http://google.com"); |
favicon_base::FaviconID id = db.AddFavicon(url, favicon_base::TOUCH_ICON); |
base::Time time = base::Time::Now(); |
- db.AddFaviconBitmap(id, favicon, time, gfx::Size()); |
+ db.AddFaviconBitmap(id, favicon, FaviconBitmapType::ON_VISIT, time, |
+ gfx::Size()); |
EXPECT_LT(0, db.AddIconMapping(url, id)); |
favicon_base::FaviconID id2 = db.AddFavicon(url, favicon_base::FAVICON); |
@@ -299,13 +410,16 @@ TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURL) { |
favicon_base::FaviconID id1 = db.AddFavicon(url, favicon_base::TOUCH_ICON); |
base::Time time = base::Time::Now(); |
- db.AddFaviconBitmap(id1, favicon, time, kSmallSize); |
- db.AddFaviconBitmap(id1, favicon, time, kLargeSize); |
+ db.AddFaviconBitmap(id1, favicon, FaviconBitmapType::ON_VISIT, time, |
+ kSmallSize); |
+ db.AddFaviconBitmap(id1, favicon, FaviconBitmapType::ON_VISIT, time, |
+ kLargeSize); |
EXPECT_LT(0, db.AddIconMapping(url, id1)); |
favicon_base::FaviconID id2 = db.AddFavicon(url, favicon_base::FAVICON); |
EXPECT_NE(id1, id2); |
- db.AddFaviconBitmap(id2, favicon, time, kSmallSize); |
+ db.AddFaviconBitmap(id2, favicon, FaviconBitmapType::ON_VISIT, time, |
+ kSmallSize); |
EXPECT_LT(0, db.AddIconMapping(url, id2)); |
std::vector<IconMapping> icon_mappings; |
@@ -341,19 +455,22 @@ TEST_F(ThumbnailDatabaseTest, RetainDataForPageUrls) { |
favicon_base::FaviconID kept_id1 = |
db.AddFavicon(kIconUrl1, favicon_base::FAVICON); |
- db.AddFaviconBitmap(kept_id1, favicon1, base::Time::Now(), kLargeSize); |
+ db.AddFaviconBitmap(kept_id1, favicon1, FaviconBitmapType::ON_VISIT, |
+ base::Time::Now(), kLargeSize); |
db.AddIconMapping(kPageUrl1, kept_id1); |
db.AddIconMapping(kPageUrl3, kept_id1); |
db.AddIconMapping(kPageUrl4, kept_id1); |
favicon_base::FaviconID unkept_id = |
db.AddFavicon(kIconUrl2, favicon_base::FAVICON); |
- db.AddFaviconBitmap(unkept_id, favicon1, base::Time::Now(), kLargeSize); |
+ db.AddFaviconBitmap(unkept_id, favicon1, FaviconBitmapType::ON_VISIT, |
+ base::Time::Now(), kLargeSize); |
db.AddIconMapping(kPageUrl2, unkept_id); |
favicon_base::FaviconID kept_id2 = |
db.AddFavicon(kIconUrl5, favicon_base::FAVICON); |
- db.AddFaviconBitmap(kept_id2, favicon2, base::Time::Now(), kLargeSize); |
+ db.AddFaviconBitmap(kept_id2, favicon2, FaviconBitmapType::ON_VISIT, |
+ base::Time::Now(), kLargeSize); |
db.AddIconMapping(kPageUrl5, kept_id2); |
// RetainDataForPageUrls() uses schema manipulations for efficiency. |
@@ -406,8 +523,8 @@ TEST_F(ThumbnailDatabaseTest, RetainDataForPageUrlsExpiresRetainedFavicons) { |
scoped_refptr<base::RefCountedStaticMemory> favicon1( |
new base::RefCountedStaticMemory(kBlob1, sizeof(kBlob1))); |
favicon_base::FaviconID kept_id = db.AddFavicon( |
- kIconUrl1, favicon_base::FAVICON, favicon1, base::Time::Now(), |
- gfx::Size()); |
+ kIconUrl1, favicon_base::FAVICON, favicon1, FaviconBitmapType::ON_VISIT, |
+ base::Time::Now(), gfx::Size()); |
db.AddIconMapping(kPageUrl1, kept_id); |
EXPECT_TRUE(db.RetainDataForPageUrls(std::vector<GURL>(1u, kPageUrl1))); |
@@ -439,8 +556,10 @@ TEST_F(ThumbnailDatabaseTest, DeleteFavicon) { |
GURL url("http://google.com"); |
favicon_base::FaviconID id = db.AddFavicon(url, favicon_base::FAVICON); |
base::Time last_updated = base::Time::Now(); |
- db.AddFaviconBitmap(id, favicon1, last_updated, kSmallSize); |
- db.AddFaviconBitmap(id, favicon2, last_updated, kLargeSize); |
+ db.AddFaviconBitmap(id, favicon1, FaviconBitmapType::ON_VISIT, last_updated, |
+ kSmallSize); |
+ db.AddFaviconBitmap(id, favicon2, FaviconBitmapType::ON_VISIT, last_updated, |
+ kLargeSize); |
EXPECT_TRUE(db.GetFaviconBitmaps(id, NULL)); |
@@ -461,8 +580,9 @@ TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLForReturnOrder) { |
GURL icon_url("http://google.com/favicon.ico"); |
base::Time time = base::Time::Now(); |
- favicon_base::FaviconID id = db.AddFavicon( |
- icon_url, favicon_base::FAVICON, favicon, time, gfx::Size()); |
+ favicon_base::FaviconID id = |
+ db.AddFavicon(icon_url, favicon_base::FAVICON, favicon, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(0, db.AddIconMapping(page_url, id)); |
std::vector<IconMapping> icon_mappings; |
EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, &icon_mappings)); |
@@ -477,8 +597,9 @@ TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLForReturnOrder) { |
scoped_refptr<base::RefCountedBytes> favicon2 = |
new base::RefCountedBytes(data); |
- favicon_base::FaviconID id2 = db.AddFavicon( |
- icon_url, favicon_base::TOUCH_ICON, favicon2, time, gfx::Size()); |
+ favicon_base::FaviconID id2 = |
+ db.AddFavicon(icon_url, favicon_base::TOUCH_ICON, favicon2, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(0, db.AddIconMapping(page_url, id2)); |
icon_mappings.clear(); |
@@ -494,11 +615,8 @@ TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLForReturnOrder) { |
new base::RefCountedBytes(data2); |
favicon_base::FaviconID id3 = |
- db.AddFavicon(icon_url, |
- favicon_base::TOUCH_PRECOMPOSED_ICON, |
- favicon3, |
- time, |
- gfx::Size()); |
+ db.AddFavicon(icon_url, favicon_base::TOUCH_PRECOMPOSED_ICON, favicon3, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(0, db.AddIconMapping(page_url, id3)); |
icon_mappings.clear(); |
@@ -548,31 +666,23 @@ TEST_F(ThumbnailDatabaseTest, HasMappingFor) { |
// Add a favicon which will have icon_mappings |
base::Time time = base::Time::Now(); |
- favicon_base::FaviconID id1 = db.AddFavicon(GURL("http://google.com"), |
- favicon_base::FAVICON, |
- favicon, |
- time, |
- gfx::Size()); |
+ favicon_base::FaviconID id1 = |
+ db.AddFavicon(GURL("http://google.com"), favicon_base::FAVICON, favicon, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(id1, 0); |
// Add another type of favicon |
time = base::Time::Now(); |
- favicon_base::FaviconID id2 = |
- db.AddFavicon(GURL("http://www.google.com/icon"), |
- favicon_base::TOUCH_ICON, |
- favicon, |
- time, |
- gfx::Size()); |
+ favicon_base::FaviconID id2 = db.AddFavicon( |
+ GURL("http://www.google.com/icon"), favicon_base::TOUCH_ICON, favicon, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(id2, 0); |
// Add 3rd favicon |
time = base::Time::Now(); |
- favicon_base::FaviconID id3 = |
- db.AddFavicon(GURL("http://www.google.com/icon"), |
- favicon_base::TOUCH_ICON, |
- favicon, |
- time, |
- gfx::Size()); |
+ favicon_base::FaviconID id3 = db.AddFavicon( |
+ GURL("http://www.google.com/icon"), favicon_base::TOUCH_ICON, favicon, |
+ FaviconBitmapType::ON_VISIT, time, gfx::Size()); |
EXPECT_NE(id3, 0); |
// Add 2 icon mapping |