Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/files/file_enumerator.h" | 10 #include "base/files/file_enumerator.h" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/files/scoped_temp_dir.h" | 12 #include "base/files/scoped_temp_dir.h" |
| 13 #include "base/memory/ref_counted_memory.h" | 13 #include "base/memory/ref_counted_memory.h" |
| 14 #include "base/path_service.h" | 14 #include "base/path_service.h" |
| 15 #include "base/strings/stringprintf.h" | |
| 16 #include "build/build_config.h" | |
|
jkrcal
2017/07/06 17:01:48
"build/build_config.h" has been enforced by a pres
| |
| 17 #include "components/history/core/browser/history_backend_client.h" | |
| 15 #include "components/history/core/browser/thumbnail_database.h" | 18 #include "components/history/core/browser/thumbnail_database.h" |
| 16 #include "components/history/core/test/database_test_utils.h" | 19 #include "components/history/core/test/database_test_utils.h" |
| 17 #include "sql/connection.h" | 20 #include "sql/connection.h" |
| 18 #include "sql/recovery.h" | 21 #include "sql/recovery.h" |
| 19 #include "sql/test/scoped_error_expecter.h" | 22 #include "sql/test/scoped_error_expecter.h" |
| 20 #include "sql/test/test_helpers.h" | 23 #include "sql/test/test_helpers.h" |
| 24 #include "testing/gmock/include/gmock/gmock.h" | |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 22 #include "third_party/sqlite/sqlite3.h" | 26 #include "third_party/sqlite/sqlite3.h" |
| 23 #include "url/gurl.h" | 27 #include "url/gurl.h" |
| 24 | 28 |
| 29 using testing::StrictMock; | |
| 30 using testing::Return; | |
| 31 | |
| 25 namespace history { | 32 namespace history { |
| 26 | 33 |
| 27 namespace { | 34 namespace { |
| 28 | 35 |
| 29 // Blobs for the bitmap tests. These aren't real bitmaps. Golden | 36 // Blobs for the bitmap tests. These aren't real bitmaps. Golden |
| 30 // database files store the same blobs (see VersionN tests). | 37 // database files store the same blobs (see VersionN tests). |
| 31 const unsigned char kBlob1[] = | 38 const unsigned char kBlob1[] = |
| 32 "12346102356120394751634516591348710478123649165419234519234512349134"; | 39 "12346102356120394751634516591348710478123649165419234519234512349134"; |
| 33 const unsigned char kBlob2[] = | 40 const unsigned char kBlob2[] = |
| 34 "goiwuegrqrcomizqyzkjalitbahxfjytrqvpqeroicxmnlkhlzunacxaneviawrtxcywhgef"; | 41 "goiwuegrqrcomizqyzkjalitbahxfjytrqvpqeroicxmnlkhlzunacxaneviawrtxcywhgef"; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 } | 169 } |
| 163 | 170 |
| 164 bool CompareIconMappingIconUrl(const IconMapping& a, const IconMapping& b) { | 171 bool CompareIconMappingIconUrl(const IconMapping& a, const IconMapping& b) { |
| 165 return a.icon_url < b.icon_url; | 172 return a.icon_url < b.icon_url; |
| 166 } | 173 } |
| 167 | 174 |
| 168 void SortMappingsByIconUrl(std::vector<IconMapping>* mappings) { | 175 void SortMappingsByIconUrl(std::vector<IconMapping>* mappings) { |
| 169 std::sort(mappings->begin(), mappings->end(), &CompareIconMappingIconUrl); | 176 std::sort(mappings->begin(), mappings->end(), &CompareIconMappingIconUrl); |
| 170 } | 177 } |
| 171 | 178 |
| 179 class MockHistoryBackendClient : public HistoryBackendClient { | |
| 180 public: | |
| 181 // MOCK_METHOD0(~HistoryBackendClient, void()); | |
| 182 MOCK_METHOD1(IsBookmarked, bool(const GURL& url)); | |
| 183 MOCK_METHOD1(GetBookmarks, void(std::vector<URLAndTitle>* bookmarks)); | |
| 184 MOCK_METHOD0(ShouldReportDatabaseError, bool()); | |
| 185 MOCK_METHOD1(IsWebSafe, bool(const GURL& url)); | |
| 186 | |
| 187 #if defined(OS_ANDROID) | |
| 188 MOCK_METHOD4(OnHistoryBackendInitialized, | |
| 189 void(HistoryBackend* history_backend, | |
| 190 HistoryDatabase* history_database, | |
| 191 ThumbnailDatabase* thumbnail_database, | |
| 192 const base::FilePath& history_dir)); | |
| 193 MOCK_METHOD2(OnHistoryBackendDestroyed, | |
| 194 void(HistoryBackend* history_backend, | |
| 195 const base::FilePath& history_dir)); | |
| 196 #endif // defined(OS_ANDROID) | |
| 197 }; | |
| 198 | |
| 172 } // namespace | 199 } // namespace |
| 173 | 200 |
| 174 class ThumbnailDatabaseTest : public testing::Test { | 201 class ThumbnailDatabaseTest : public testing::Test { |
| 175 public: | 202 public: |
| 176 ThumbnailDatabaseTest() {} | 203 ThumbnailDatabaseTest() {} |
| 177 ~ThumbnailDatabaseTest() override {} | 204 ~ThumbnailDatabaseTest() override {} |
| 178 | 205 |
| 179 // Initialize a thumbnail database instance from the SQL file at | 206 // Initialize a thumbnail database instance from the SQL file at |
| 180 // |golden_path| in the "History/" subdirectory of test data. | 207 // |golden_path| in the "History/" subdirectory of test data. |
| 181 std::unique_ptr<ThumbnailDatabase> LoadFromGolden(const char* golden_path) { | 208 std::unique_ptr<ThumbnailDatabase> LoadFromGolden(const char* golden_path) { |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 359 start + base::TimeDelta::FromDays(kFaviconUpdateLastRequestedAfterDays); | 386 start + base::TimeDelta::FromDays(kFaviconUpdateLastRequestedAfterDays); |
| 360 db.TouchOnDemandFavicon(url, end); | 387 db.TouchOnDemandFavicon(url, end); |
| 361 | 388 |
| 362 base::Time last_updated; | 389 base::Time last_updated; |
| 363 base::Time last_requested; | 390 base::Time last_requested; |
| 364 EXPECT_TRUE(db.GetFaviconBitmap(bitmap, &last_updated, &last_requested, | 391 EXPECT_TRUE(db.GetFaviconBitmap(bitmap, &last_updated, &last_requested, |
| 365 nullptr, nullptr)); | 392 nullptr, nullptr)); |
| 366 EXPECT_EQ(start, last_updated); // Does not mess with last_updated. | 393 EXPECT_EQ(start, last_updated); // Does not mess with last_updated. |
| 367 EXPECT_EQ(base::Time(), last_requested); // No update. | 394 EXPECT_EQ(base::Time(), last_requested); // No update. |
| 368 } | 395 } |
| 369 | 396 |
|
pkotwicz
2017/07/07 00:42:38
Please add a comment for each test case. For this
jkrcal
2017/07/07 08:45:16
Done.
| |
| 397 TEST_F(ThumbnailDatabaseTest, GetOldOnDemandFaviconsReturnsOld) { | |
| 398 StrictMock<MockHistoryBackendClient> mock_client; | |
| 399 ThumbnailDatabase db(&mock_client); | |
|
pkotwicz
2017/07/07 00:42:39
Does the test work if you pass in nullptr?
jkrcal
2017/07/07 08:45:16
Ah, sure. It was there to mock being bookmarked. N
| |
| 400 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); | |
| 401 db.BeginTransaction(); | |
| 402 | |
| 403 base::Time start; | |
| 404 ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); | |
| 405 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); | |
| 406 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); | |
| 407 | |
| 408 // Icon: old unused case. | |
| 409 GURL url("http://google.com"); | |
| 410 favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); | |
| 411 ASSERT_NE(0, icon); | |
| 412 FaviconBitmapID bitmap = db.AddFaviconBitmap( | |
| 413 icon, favicon, FaviconBitmapType::ON_DEMAND, start, gfx::Size()); | |
|
pkotwicz
2017/07/07 00:42:39
Nit: Can you use the 6 argument ThumbnailDatabase:
jkrcal
2017/07/07 08:45:16
Done.
| |
| 414 ASSERT_NE(0, bitmap); | |
| 415 ASSERT_NE(0, db.AddIconMapping(url, icon)); | |
| 416 | |
| 417 base::Time delete_older_than = start + base::TimeDelta::FromDays(7); | |
|
pkotwicz
2017/07/07 00:42:39
Might as well do:
"+ base::TimeDelta::FromSeconds
jkrcal
2017/07/07 08:45:17
Done.
| |
| 418 auto list = db.GetOldOnDemandFavicons(delete_older_than); | |
| 419 | |
| 420 // The icon is returned for deletion. | |
|
pkotwicz
2017/07/07 00:42:39
Nit: Don't mention deletion. The fact that the id
jkrcal
2017/07/07 08:45:16
Done.
| |
| 421 EXPECT_EQ(1u, list.size()); | |
| 422 EXPECT_EQ(icon, list[0].first); | |
| 423 EXPECT_EQ(url, list[0].second); | |
| 424 } | |
| 425 | |
|
pkotwicz
2017/07/07 00:42:39
For this test's comment, how about:
"Test that Th
jkrcal
2017/07/07 08:45:16
Done.
| |
| 426 TEST_F(ThumbnailDatabaseTest, GetOldOnDemandFaviconsReturnsExpired) { | |
| 427 StrictMock<MockHistoryBackendClient> mock_client; | |
| 428 ThumbnailDatabase db(&mock_client); | |
| 429 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); | |
| 430 db.BeginTransaction(); | |
| 431 | |
| 432 base::Time start; | |
| 433 ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); | |
| 434 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); | |
| 435 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); | |
| 436 | |
| 437 // Icon: standard favicon (not on-demand) but expired. | |
| 438 GURL url("http://google.com"); | |
| 439 favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); | |
| 440 ASSERT_NE(0, icon); | |
| 441 FaviconBitmapID bitmap = db.AddFaviconBitmap( | |
| 442 icon, favicon, FaviconBitmapType::ON_VISIT, start, gfx::Size()); | |
| 443 ASSERT_NE(0, bitmap); | |
| 444 ASSERT_NE(0, db.AddIconMapping(url, icon)); | |
| 445 ASSERT_NE(0, db.SetFaviconOutOfDate(icon)); | |
| 446 | |
| 447 // The threshold is ignored for expired icons. | |
| 448 auto list = db.GetOldOnDemandFavicons(/*threshold=*/base::Time()); | |
|
pkotwicz
2017/07/07 00:42:39
Maybe use base::Time::Now() instead?
jkrcal
2017/07/07 08:45:16
Done.
| |
| 449 | |
| 450 // The icon is returned for deletion. | |
| 451 EXPECT_EQ(1u, list.size()); | |
| 452 EXPECT_EQ(icon, list[0].first); | |
| 453 EXPECT_EQ(url, list[0].second); | |
| 454 } | |
| 455 | |
| 456 TEST_F(ThumbnailDatabaseTest, GetOldOnDemandFaviconsDoesNotReturnFresh) { | |
|
pkotwicz
2017/07/07 00:42:39
For this test's comment how about:
"Test that Thu
jkrcal
2017/07/07 08:45:16
Done.
| |
| 457 StrictMock<MockHistoryBackendClient> mock_client; | |
| 458 ThumbnailDatabase db(&mock_client); | |
| 459 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); | |
| 460 db.BeginTransaction(); | |
| 461 | |
| 462 base::Time start; | |
| 463 ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); | |
| 464 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); | |
| 465 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); | |
| 466 | |
| 467 // Icon: freshly used case. | |
| 468 GURL url("http://google.com"); | |
| 469 favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); | |
| 470 ASSERT_NE(0, icon); | |
| 471 FaviconBitmapID bitmap = db.AddFaviconBitmap( | |
| 472 icon, favicon, FaviconBitmapType::ON_DEMAND, start, gfx::Size()); | |
| 473 ASSERT_NE(0, bitmap); | |
| 474 ASSERT_NE(0, db.AddIconMapping(url, icon)); | |
| 475 | |
| 476 // Touch the icon 3 weeks later. | |
| 477 base::Time now = start + base::TimeDelta::FromDays(21); | |
| 478 EXPECT_TRUE(db.TouchOnDemandFavicon(url, now)); | |
| 479 | |
| 480 base::Time delete_older_than = start + base::TimeDelta::FromDays(7); | |
| 481 auto list = db.GetOldOnDemandFavicons(delete_older_than); | |
| 482 | |
| 483 // No icon is returned for deletion. | |
| 484 EXPECT_EQ(0u, list.size()); | |
|
pkotwicz
2017/07/07 00:42:39
Nit:
EXPECT_TRUE(list.empty());
jkrcal
2017/07/07 08:45:16
Done.
| |
| 485 } | |
| 486 | |
|
pkotwicz
2017/07/07 00:42:39
For this test's comment how about:
"Test that Thu
jkrcal
2017/07/07 08:45:16
Done.
| |
| 487 TEST_F(ThumbnailDatabaseTest, GetOldOnDemandFaviconsDoesNotDeleteStandard) { | |
| 488 StrictMock<MockHistoryBackendClient> mock_client; | |
| 489 ThumbnailDatabase db(&mock_client); | |
| 490 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); | |
| 491 db.BeginTransaction(); | |
| 492 | |
| 493 base::Time start; | |
| 494 ASSERT_TRUE(base::Time::FromUTCExploded({2017, 5, 0, 1, 0, 0, 0, 0}, &start)); | |
| 495 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); | |
| 496 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); | |
| 497 | |
| 498 // Icon: standard favicon (not on-demand). | |
| 499 GURL url("http://google.com"); | |
| 500 favicon_base::FaviconID icon = db.AddFavicon(url, favicon_base::FAVICON); | |
| 501 ASSERT_NE(0, icon); | |
| 502 FaviconBitmapID bitmap = db.AddFaviconBitmap( | |
| 503 icon, favicon, FaviconBitmapType::ON_VISIT, start, gfx::Size()); | |
| 504 ASSERT_NE(0, bitmap); | |
| 505 ASSERT_NE(0, db.AddIconMapping(url, icon)); | |
| 506 | |
| 507 base::Time delete_older_than = start + base::TimeDelta::FromDays(7); | |
| 508 auto list = db.GetOldOnDemandFavicons(delete_older_than); | |
| 509 | |
| 510 // No icon is returned for deletion. | |
| 511 EXPECT_EQ(0u, list.size()); | |
|
pkotwicz
2017/07/07 00:42:39
Nit:
EXPECT_TRUE(list.empty());
jkrcal
2017/07/07 08:45:16
Done.
| |
| 512 } | |
| 513 | |
| 370 TEST_F(ThumbnailDatabaseTest, DeleteIconMappings) { | 514 TEST_F(ThumbnailDatabaseTest, DeleteIconMappings) { |
| 371 ThumbnailDatabase db(NULL); | 515 ThumbnailDatabase db(NULL); |
| 372 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); | 516 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); |
| 373 db.BeginTransaction(); | 517 db.BeginTransaction(); |
| 374 | 518 |
| 375 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); | 519 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); |
| 376 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); | 520 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); |
| 377 | 521 |
| 378 GURL url("http://google.com"); | 522 GURL url("http://google.com"); |
| 379 favicon_base::FaviconID id = db.AddFavicon(url, favicon_base::TOUCH_ICON); | 523 favicon_base::FaviconID id = db.AddFavicon(url, favicon_base::TOUCH_ICON); |
| (...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1181 ThumbnailDatabase db(NULL); | 1325 ThumbnailDatabase db(NULL); |
| 1182 ASSERT_EQ(sql::INIT_OK, db.Init(db_path)); | 1326 ASSERT_EQ(sql::INIT_OK, db.Init(db_path)); |
| 1183 | 1327 |
| 1184 // Verify that the resulting schema is correct, whether it | 1328 // Verify that the resulting schema is correct, whether it |
| 1185 // involved razing the file or fixing things in place. | 1329 // involved razing the file or fixing things in place. |
| 1186 VerifyTablesAndColumns(&db.db_); | 1330 VerifyTablesAndColumns(&db.db_); |
| 1187 } | 1331 } |
| 1188 } | 1332 } |
| 1189 | 1333 |
| 1190 } // namespace history | 1334 } // namespace history |
| OLD | NEW |