Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: components/history/core/browser/thumbnail_database_unittest.cc

Issue 2823093002: Make FaviconService::GetRawFaviconForPageURL() select the best candidate among all the icon types (Closed)
Patch Set: Merge branch 'icon_type0' into icon_type Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
(...skipping 23 matching lines...) Expand all
34 "goiwuegrqrcomizqyzkjalitbahxfjytrqvpqeroicxmnlkhlzunacxaneviawrtxcywhgef"; 34 "goiwuegrqrcomizqyzkjalitbahxfjytrqvpqeroicxmnlkhlzunacxaneviawrtxcywhgef";
35 35
36 // Page and icon urls shared by tests. Present in golden database 36 // Page and icon urls shared by tests. Present in golden database
37 // files (see VersionN tests). 37 // files (see VersionN tests).
38 const GURL kPageUrl1 = GURL("http://google.com/"); 38 const GURL kPageUrl1 = GURL("http://google.com/");
39 const GURL kPageUrl2 = GURL("http://yahoo.com/"); 39 const GURL kPageUrl2 = GURL("http://yahoo.com/");
40 const GURL kPageUrl3 = GURL("http://www.google.com/"); 40 const GURL kPageUrl3 = GURL("http://www.google.com/");
41 const GURL kPageUrl4 = GURL("http://www.google.com/blank.html"); 41 const GURL kPageUrl4 = GURL("http://www.google.com/blank.html");
42 const GURL kPageUrl5 = GURL("http://www.bing.com/"); 42 const GURL kPageUrl5 = GURL("http://www.bing.com/");
43 43
44 const GURL kIconUrl1 = GURL("http://www.google.com/favicon.ico"); 44 const GURL kIconUrl1 = GURL("http://www.bing.com/favicon.ico");
45 const GURL kIconUrl2 = GURL("http://www.yahoo.com/favicon.ico"); 45 const GURL kIconUrl2 = GURL("http://www.duckduckgo.com/favicon.ico");
46 const GURL kIconUrl3 = GURL("http://www.google.com/touch.ico"); 46 const GURL kIconUrl3 = GURL("http://www.google.com/favicon.ico");
47 const GURL kIconUrl5 = GURL("http://www.bing.com/favicon.ico"); 47 const GURL kIconUrl4 = GURL("http://www.google.com/touch.ico");
48 const GURL kIconUrl5 = GURL("http://www.yahoo.com/favicon.ico");
48 49
49 const gfx::Size kSmallSize = gfx::Size(16, 16); 50 const gfx::Size kSmallSize = gfx::Size(16, 16);
50 const gfx::Size kLargeSize = gfx::Size(32, 32); 51 const gfx::Size kLargeSize = gfx::Size(32, 32);
51 52
52 // Verify that the up-to-date database has the expected tables and 53 // Verify that the up-to-date database has the expected tables and
53 // columns. Functional tests only check whether the things which 54 // columns. Functional tests only check whether the things which
54 // should be there are, but do not check if extraneous items are 55 // should be there are, but do not check if extraneous items are
55 // present. Any extraneous items have the potential to interact 56 // present. Any extraneous items have the potential to interact
56 // negatively with future schema changes. 57 // negatively with future schema changes.
57 void VerifyTablesAndColumns(sql::Connection* db) { 58 void VerifyTablesAndColumns(sql::Connection* db) {
(...skipping 11 matching lines...) Expand all
69 EXPECT_EQ(3u, sql::test::CountTableColumns(db, "favicons")); 70 EXPECT_EQ(3u, sql::test::CountTableColumns(db, "favicons"));
70 71
71 // [id], [icon_id], [last_updated], [image_data], [width], [height] and 72 // [id], [icon_id], [last_updated], [image_data], [width], [height] and
72 // [last_requested]. 73 // [last_requested].
73 EXPECT_EQ(7u, sql::test::CountTableColumns(db, "favicon_bitmaps")); 74 EXPECT_EQ(7u, sql::test::CountTableColumns(db, "favicon_bitmaps"));
74 75
75 // [id], [page_url], and [icon_id]. 76 // [id], [page_url], and [icon_id].
76 EXPECT_EQ(3u, sql::test::CountTableColumns(db, "icon_mapping")); 77 EXPECT_EQ(3u, sql::test::CountTableColumns(db, "icon_mapping"));
77 } 78 }
78 79
80 // Adds a favicon at |icon_url| with |icon_type| with default bitmap data and
81 // maps |page_url| to |icon_url|.
82 void AddFaviconAndMapSimple(ThumbnailDatabase* db,
mastiz 2017/04/20 08:55:59 Nit: s/Map/Mapping/? 'Map' can otherwise interpre
pkotwicz 2017/04/30 03:49:56 Done.
83 const GURL& page_url,
84 const GURL& icon_url,
85 favicon_base::IconType icon_type) {
86 scoped_refptr<base::RefCountedStaticMemory> data(
87 new base::RefCountedStaticMemory(kBlob1, sizeof(kBlob1)));
88 favicon_base::FaviconID favicon_id =
89 db->AddFavicon(icon_url, icon_type, data, base::Time::Now(), gfx::Size());
90 db->AddIconMapping(page_url, favicon_id);
91 }
92
79 void VerifyDatabaseEmpty(sql::Connection* db) { 93 void VerifyDatabaseEmpty(sql::Connection* db) {
80 size_t rows = 0; 94 size_t rows = 0;
81 EXPECT_TRUE(sql::test::CountTableRows(db, "favicons", &rows)); 95 EXPECT_TRUE(sql::test::CountTableRows(db, "favicons", &rows));
82 EXPECT_EQ(0u, rows); 96 EXPECT_EQ(0u, rows);
83 EXPECT_TRUE(sql::test::CountTableRows(db, "favicon_bitmaps", &rows)); 97 EXPECT_TRUE(sql::test::CountTableRows(db, "favicon_bitmaps", &rows));
84 EXPECT_EQ(0u, rows); 98 EXPECT_EQ(0u, rows);
85 EXPECT_TRUE(sql::test::CountTableRows(db, "icon_mapping", &rows)); 99 EXPECT_TRUE(sql::test::CountTableRows(db, "icon_mapping", &rows));
86 EXPECT_EQ(0u, rows); 100 EXPECT_EQ(0u, rows);
87 } 101 }
88 102
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 } 154 }
141 155
142 if (memcmp(favicon_bitmaps[0].bitmap_data->front(), 156 if (memcmp(favicon_bitmaps[0].bitmap_data->front(),
143 expected_icon_contents, expected_icon_contents_size)) { 157 expected_icon_contents, expected_icon_contents_size)) {
144 ADD_FAILURE() << "failed to match |expected_icon_contents|"; 158 ADD_FAILURE() << "failed to match |expected_icon_contents|";
145 return false; 159 return false;
146 } 160 }
147 return true; 161 return true;
148 } 162 }
149 163
164 bool CompareIconMappingIconUrl(const IconMapping& a, const IconMapping& b) {
165 return a.icon_url < b.icon_url;
166 }
167
168 void SortMappingsByIconUrl(std::vector<IconMapping>* mappings) {
169 std::sort(mappings->begin(), mappings->end(), &CompareIconMappingIconUrl);
170 }
171
150 } // namespace 172 } // namespace
151 173
152 class ThumbnailDatabaseTest : public testing::Test { 174 class ThumbnailDatabaseTest : public testing::Test {
153 public: 175 public:
154 ThumbnailDatabaseTest() {} 176 ThumbnailDatabaseTest() {}
155 ~ThumbnailDatabaseTest() override {} 177 ~ThumbnailDatabaseTest() override {}
156 178
157 // Initialize a thumbnail database instance from the SQL file at 179 // Initialize a thumbnail database instance from the SQL file at
158 // |golden_path| in the "History/" subdirectory of test data. 180 // |golden_path| in the "History/" subdirectory of test data.
159 std::unique_ptr<ThumbnailDatabase> LoadFromGolden(const char* golden_path) { 181 std::unique_ptr<ThumbnailDatabase> LoadFromGolden(const char* golden_path) {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 icon_mappings.clear(); 505 icon_mappings.clear();
484 EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, &icon_mappings)); 506 EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, &icon_mappings));
485 507
486 EXPECT_EQ(page_url, icon_mappings.front().page_url); 508 EXPECT_EQ(page_url, icon_mappings.front().page_url);
487 EXPECT_EQ(id3, icon_mappings.front().icon_id); 509 EXPECT_EQ(id3, icon_mappings.front().icon_id);
488 EXPECT_EQ(favicon_base::TOUCH_PRECOMPOSED_ICON, 510 EXPECT_EQ(favicon_base::TOUCH_PRECOMPOSED_ICON,
489 icon_mappings.front().icon_type); 511 icon_mappings.front().icon_type);
490 EXPECT_EQ(icon_url, icon_mappings.front().icon_url); 512 EXPECT_EQ(icon_url, icon_mappings.front().icon_url);
491 } 513 }
492 514
493 // Test result of GetIconMappingsForPageURL when an icon type is passed in. 515 // Test that when multiple icon types are passed to GetIconMappingsForPageURL()
494 TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLWithIconType) { 516 // that the results are filtered according to the passed in types.
517 TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLWithIconTypes) {
495 ThumbnailDatabase db(NULL); 518 ThumbnailDatabase db(NULL);
496 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 519 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
497 db.BeginTransaction(); 520 db.BeginTransaction();
498 521
499 GURL url("http://google.com"); 522 GURL page_url("http://www.google.com");
500 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); 523 AddFaviconAndMapSimple(&db, page_url, kIconUrl1, favicon_base::FAVICON);
501 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 524 AddFaviconAndMapSimple(&db, page_url, kIconUrl2, favicon_base::TOUCH_ICON);
502 base::Time time = base::Time::Now(); 525 AddFaviconAndMapSimple(&db, page_url, kIconUrl3, favicon_base::TOUCH_ICON);
526 AddFaviconAndMapSimple(&db, page_url, kIconUrl4,
527 favicon_base::TOUCH_PRECOMPOSED_ICON);
503 528
504 favicon_base::FaviconID id1 = 529 // Only the mappings for FAVICON and TOUCH_ICON should be returned.
505 db.AddFavicon(url, favicon_base::FAVICON, favicon, time, gfx::Size());
506 EXPECT_NE(0, db.AddIconMapping(url, id1));
507
508 favicon_base::FaviconID id2 =
509 db.AddFavicon(url, favicon_base::TOUCH_ICON, favicon, time, gfx::Size());
510 EXPECT_NE(0, db.AddIconMapping(url, id2));
511
512 favicon_base::FaviconID id3 =
513 db.AddFavicon(url, favicon_base::TOUCH_ICON, favicon, time, gfx::Size());
514 EXPECT_NE(0, db.AddIconMapping(url, id3));
515
516 // Only the mappings for favicons of type TOUCH_ICON should be returned as
517 // TOUCH_ICON is a larger icon type than FAVICON.
518 std::vector<IconMapping> icon_mappings; 530 std::vector<IconMapping> icon_mappings;
519 EXPECT_TRUE(db.GetIconMappingsForPageURL( 531 EXPECT_TRUE(db.GetIconMappingsForPageURL(
520 url, 532 page_url, favicon_base::FAVICON | favicon_base::TOUCH_ICON,
521 favicon_base::FAVICON | favicon_base::TOUCH_ICON |
522 favicon_base::TOUCH_PRECOMPOSED_ICON,
523 &icon_mappings)); 533 &icon_mappings));
534 SortMappingsByIconUrl(&icon_mappings);
524 535
525 EXPECT_EQ(2u, icon_mappings.size()); 536 EXPECT_EQ(3u, icon_mappings.size());
526 if (id2 == icon_mappings[0].icon_id) { 537 EXPECT_EQ(kIconUrl1, icon_mappings[0].icon_url);
527 EXPECT_EQ(id3, icon_mappings[1].icon_id); 538 EXPECT_EQ(kIconUrl2, icon_mappings[1].icon_url);
528 } else { 539 EXPECT_EQ(kIconUrl3, icon_mappings[2].icon_url);
mastiz 2017/04/20 08:55:59 A more natural way to do this would be to get rid
pkotwicz 2017/04/30 03:49:56 I chose to not add a GMock dependency to this test
529 EXPECT_EQ(id3, icon_mappings[0].icon_id);
530 EXPECT_EQ(id2, icon_mappings[1].icon_id);
531 }
532
533 icon_mappings.clear();
534 EXPECT_TRUE(db.GetIconMappingsForPageURL(
535 url, favicon_base::TOUCH_ICON, &icon_mappings));
536 if (id2 == icon_mappings[0].icon_id) {
537 EXPECT_EQ(id3, icon_mappings[1].icon_id);
538 } else {
539 EXPECT_EQ(id3, icon_mappings[0].icon_id);
540 EXPECT_EQ(id2, icon_mappings[1].icon_id);
541 }
542
543 icon_mappings.clear();
544 EXPECT_TRUE(
545 db.GetIconMappingsForPageURL(url, favicon_base::FAVICON, &icon_mappings));
546 EXPECT_EQ(1u, icon_mappings.size());
547 EXPECT_EQ(id1, icon_mappings[0].icon_id);
548 } 540 }
549 541
550 TEST_F(ThumbnailDatabaseTest, HasMappingFor) { 542 TEST_F(ThumbnailDatabaseTest, HasMappingFor) {
551 ThumbnailDatabase db(NULL); 543 ThumbnailDatabase db(NULL);
552 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 544 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
553 db.BeginTransaction(); 545 db.BeginTransaction();
554 546
555 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1)); 547 std::vector<unsigned char> data(kBlob1, kBlob1 + sizeof(kBlob1));
556 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 548 scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data));
557 549
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 // Version 6 is deprecated, the data should all be gone. 631 // Version 6 is deprecated, the data should all be gone.
640 VerifyDatabaseEmpty(&db->db_); 632 VerifyDatabaseEmpty(&db->db_);
641 } 633 }
642 634
643 // Test loading version 7 database. 635 // Test loading version 7 database.
644 TEST_F(ThumbnailDatabaseTest, Version7) { 636 TEST_F(ThumbnailDatabaseTest, Version7) {
645 std::unique_ptr<ThumbnailDatabase> db = LoadFromGolden("Favicons.v7.sql"); 637 std::unique_ptr<ThumbnailDatabase> db = LoadFromGolden("Favicons.v7.sql");
646 ASSERT_TRUE(db.get() != NULL); 638 ASSERT_TRUE(db.get() != NULL);
647 VerifyTablesAndColumns(&db->db_); 639 VerifyTablesAndColumns(&db->db_);
648 640
649 EXPECT_TRUE(CheckPageHasIcon(db.get(), 641 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl1, favicon_base::FAVICON,
650 kPageUrl1, 642 kIconUrl3, kLargeSize, sizeof(kBlob1), kBlob1));
651 favicon_base::FAVICON, 643 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl2, favicon_base::FAVICON,
652 kIconUrl1, 644 kIconUrl5, kLargeSize, sizeof(kBlob2), kBlob2));
653 kLargeSize, 645 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl3, favicon_base::FAVICON,
654 sizeof(kBlob1), 646 kIconUrl3, kLargeSize, sizeof(kBlob1), kBlob1));
655 kBlob1)); 647 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl3, favicon_base::TOUCH_ICON,
656 EXPECT_TRUE(CheckPageHasIcon(db.get(), 648 kIconUrl4, kLargeSize, sizeof(kBlob2), kBlob2));
657 kPageUrl2,
658 favicon_base::FAVICON,
659 kIconUrl2,
660 kLargeSize,
661 sizeof(kBlob2),
662 kBlob2));
663 EXPECT_TRUE(CheckPageHasIcon(db.get(),
664 kPageUrl3,
665 favicon_base::FAVICON,
666 kIconUrl1,
667 kLargeSize,
668 sizeof(kBlob1),
669 kBlob1));
670 EXPECT_TRUE(CheckPageHasIcon(db.get(),
671 kPageUrl3,
672 favicon_base::TOUCH_ICON,
673 kIconUrl3,
674 kLargeSize,
675 sizeof(kBlob2),
676 kBlob2));
677 } 649 }
678 650
679 // Test loading version 8 database. 651 // Test loading version 8 database.
680 TEST_F(ThumbnailDatabaseTest, Version8) { 652 TEST_F(ThumbnailDatabaseTest, Version8) {
681 std::unique_ptr<ThumbnailDatabase> db = LoadFromGolden("Favicons.v8.sql"); 653 std::unique_ptr<ThumbnailDatabase> db = LoadFromGolden("Favicons.v8.sql");
682 ASSERT_TRUE(db.get() != NULL); 654 ASSERT_TRUE(db.get() != NULL);
683 VerifyTablesAndColumns(&db->db_); 655 VerifyTablesAndColumns(&db->db_);
684 656
685 EXPECT_TRUE(CheckPageHasIcon(db.get(), 657 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl1, favicon_base::FAVICON,
686 kPageUrl1, 658 kIconUrl3, kLargeSize, sizeof(kBlob1), kBlob1));
687 favicon_base::FAVICON, 659 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl2, favicon_base::FAVICON,
688 kIconUrl1, 660 kIconUrl5, kLargeSize, sizeof(kBlob2), kBlob2));
689 kLargeSize, 661 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl3, favicon_base::FAVICON,
690 sizeof(kBlob1), 662 kIconUrl3, kLargeSize, sizeof(kBlob1), kBlob1));
691 kBlob1)); 663 EXPECT_TRUE(CheckPageHasIcon(db.get(), kPageUrl3, favicon_base::TOUCH_ICON,
692 EXPECT_TRUE(CheckPageHasIcon(db.get(), 664 kIconUrl4, kLargeSize, sizeof(kBlob2), kBlob2));
693 kPageUrl2,
694 favicon_base::FAVICON,
695 kIconUrl2,
696 kLargeSize,
697 sizeof(kBlob2),
698 kBlob2));
699 EXPECT_TRUE(CheckPageHasIcon(db.get(),
700 kPageUrl3,
701 favicon_base::FAVICON,
702 kIconUrl1,
703 kLargeSize,
704 sizeof(kBlob1),
705 kBlob1));
706 EXPECT_TRUE(CheckPageHasIcon(db.get(),
707 kPageUrl3,
708 favicon_base::TOUCH_ICON,
709 kIconUrl3,
710 kLargeSize,
711 sizeof(kBlob2),
712 kBlob2));
713 } 665 }
714 666
715 TEST_F(ThumbnailDatabaseTest, Recovery) { 667 TEST_F(ThumbnailDatabaseTest, Recovery) {
716 // This code tests the recovery module in concert with Chromium's 668 // This code tests the recovery module in concert with Chromium's
717 // custom recover virtual table. Under USE_SYSTEM_SQLITE, this is 669 // custom recover virtual table. Under USE_SYSTEM_SQLITE, this is
718 // not available. This is detected dynamically because corrupt 670 // not available. This is detected dynamically because corrupt
719 // databases still need to be handled, perhaps by Raze(), and the 671 // databases still need to be handled, perhaps by Raze(), and the
720 // recovery module is an obvious layer to abstract that to. 672 // recovery module is an obvious layer to abstract that to.
721 // TODO(shess): Handle that case for real! 673 // TODO(shess): Handle that case for real!
722 if (!sql::Recovery::FullRecoverySupported()) 674 if (!sql::Recovery::FullRecoverySupported())
723 return; 675 return;
724 676
725 // Create an example database. 677 // Create an example database.
726 { 678 {
727 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "Favicons.v8.sql")); 679 EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "Favicons.v8.sql"));
728 680
729 sql::Connection raw_db; 681 sql::Connection raw_db;
730 EXPECT_TRUE(raw_db.Open(file_name_)); 682 EXPECT_TRUE(raw_db.Open(file_name_));
731 VerifyTablesAndColumns(&raw_db); 683 VerifyTablesAndColumns(&raw_db);
732 } 684 }
733 685
734 // Test that the contents make sense after clean open. 686 // Test that the contents make sense after clean open.
735 { 687 {
736 ThumbnailDatabase db(NULL); 688 ThumbnailDatabase db(NULL);
737 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 689 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
738 690
739 EXPECT_TRUE(CheckPageHasIcon(&db, 691 EXPECT_TRUE(CheckPageHasIcon(&db, kPageUrl1, favicon_base::FAVICON,
740 kPageUrl1, 692 kIconUrl3, kLargeSize, sizeof(kBlob1),
741 favicon_base::FAVICON,
742 kIconUrl1,
743 kLargeSize,
744 sizeof(kBlob1),
745 kBlob1)); 693 kBlob1));
746 EXPECT_TRUE(CheckPageHasIcon(&db, 694 EXPECT_TRUE(CheckPageHasIcon(&db, kPageUrl2, favicon_base::FAVICON,
747 kPageUrl2, 695 kIconUrl5, kLargeSize, sizeof(kBlob2),
748 favicon_base::FAVICON,
749 kIconUrl2,
750 kLargeSize,
751 sizeof(kBlob2),
752 kBlob2)); 696 kBlob2));
753 } 697 }
754 698
755 // Corrupt the |icon_mapping.page_url| index by deleting an element 699 // Corrupt the |icon_mapping.page_url| index by deleting an element
756 // from the backing table but not the index. 700 // from the backing table but not the index.
757 { 701 {
758 sql::Connection raw_db; 702 sql::Connection raw_db;
759 EXPECT_TRUE(raw_db.Open(file_name_)); 703 EXPECT_TRUE(raw_db.Open(file_name_));
760 ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db)); 704 ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db));
761 } 705 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 744
801 // Database should also be recovered at higher levels. 745 // Database should also be recovered at higher levels.
802 { 746 {
803 ThumbnailDatabase db(NULL); 747 ThumbnailDatabase db(NULL);
804 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 748 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
805 749
806 // Now this fails because there is no mapping. 750 // Now this fails because there is no mapping.
807 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL)); 751 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL));
808 752
809 // Other data was retained by recovery. 753 // Other data was retained by recovery.
810 EXPECT_TRUE(CheckPageHasIcon(&db, 754 EXPECT_TRUE(CheckPageHasIcon(&db, kPageUrl1, favicon_base::FAVICON,
811 kPageUrl1, 755 kIconUrl3, kLargeSize, sizeof(kBlob1),
812 favicon_base::FAVICON,
813 kIconUrl1,
814 kLargeSize,
815 sizeof(kBlob1),
816 kBlob1)); 756 kBlob1));
817 } 757 }
818 758
819 // Corrupt the database again by adjusting the header. 759 // Corrupt the database again by adjusting the header.
820 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); 760 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
821 761
822 // Database is unusable at the SQLite level. 762 // Database is unusable at the SQLite level.
823 { 763 {
824 sql::test::ScopedErrorExpecter expecter; 764 sql::test::ScopedErrorExpecter expecter;
825 expecter.ExpectError(SQLITE_CORRUPT); 765 expecter.ExpectError(SQLITE_CORRUPT);
826 sql::Connection raw_db; 766 sql::Connection raw_db;
827 EXPECT_TRUE(raw_db.Open(file_name_)); 767 EXPECT_TRUE(raw_db.Open(file_name_));
828 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check")); 768 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
829 ASSERT_TRUE(expecter.SawExpectedErrors()); 769 ASSERT_TRUE(expecter.SawExpectedErrors());
830 } 770 }
831 771
832 // Database should be recovered during open. 772 // Database should be recovered during open.
833 { 773 {
834 sql::test::ScopedErrorExpecter expecter; 774 sql::test::ScopedErrorExpecter expecter;
835 expecter.ExpectError(SQLITE_CORRUPT); 775 expecter.ExpectError(SQLITE_CORRUPT);
836 ThumbnailDatabase db(NULL); 776 ThumbnailDatabase db(NULL);
837 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 777 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
838 778
839 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL)); 779 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL));
840 EXPECT_TRUE(CheckPageHasIcon(&db, 780 EXPECT_TRUE(CheckPageHasIcon(&db, kPageUrl1, favicon_base::FAVICON,
841 kPageUrl1, 781 kIconUrl3, kLargeSize, sizeof(kBlob1),
842 favicon_base::FAVICON,
843 kIconUrl1,
844 kLargeSize,
845 sizeof(kBlob1),
846 kBlob1)); 782 kBlob1));
847 783
848 ASSERT_TRUE(expecter.SawExpectedErrors()); 784 ASSERT_TRUE(expecter.SawExpectedErrors());
849 } 785 }
850 } 786 }
851 787
852 TEST_F(ThumbnailDatabaseTest, Recovery7) { 788 TEST_F(ThumbnailDatabaseTest, Recovery7) {
853 // This code tests the recovery module in concert with Chromium's 789 // This code tests the recovery module in concert with Chromium's
854 // custom recover virtual table. Under USE_SYSTEM_SQLITE, this is 790 // custom recover virtual table. Under USE_SYSTEM_SQLITE, this is
855 // not available. This is detected dynamically because corrupt 791 // not available. This is detected dynamically because corrupt
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 848
913 // Database should also be recovered at higher levels. 849 // Database should also be recovered at higher levels.
914 { 850 {
915 ThumbnailDatabase db(NULL); 851 ThumbnailDatabase db(NULL);
916 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 852 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
917 853
918 // Now this fails because there is no mapping. 854 // Now this fails because there is no mapping.
919 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL)); 855 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL));
920 856
921 // Other data was retained by recovery. 857 // Other data was retained by recovery.
922 EXPECT_TRUE(CheckPageHasIcon(&db, 858 EXPECT_TRUE(CheckPageHasIcon(&db, kPageUrl1, favicon_base::FAVICON,
923 kPageUrl1, 859 kIconUrl3, kLargeSize, sizeof(kBlob1),
924 favicon_base::FAVICON,
925 kIconUrl1,
926 kLargeSize,
927 sizeof(kBlob1),
928 kBlob1)); 860 kBlob1));
929 } 861 }
930 862
931 // Corrupt the database again by adjusting the header. 863 // Corrupt the database again by adjusting the header.
932 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); 864 EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
933 865
934 // Database is unusable at the SQLite level. 866 // Database is unusable at the SQLite level.
935 { 867 {
936 sql::test::ScopedErrorExpecter expecter; 868 sql::test::ScopedErrorExpecter expecter;
937 expecter.ExpectError(SQLITE_CORRUPT); 869 expecter.ExpectError(SQLITE_CORRUPT);
938 sql::Connection raw_db; 870 sql::Connection raw_db;
939 EXPECT_TRUE(raw_db.Open(file_name_)); 871 EXPECT_TRUE(raw_db.Open(file_name_));
940 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check")); 872 EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
941 ASSERT_TRUE(expecter.SawExpectedErrors()); 873 ASSERT_TRUE(expecter.SawExpectedErrors());
942 } 874 }
943 875
944 // Database should be recovered during open. 876 // Database should be recovered during open.
945 { 877 {
946 sql::test::ScopedErrorExpecter expecter; 878 sql::test::ScopedErrorExpecter expecter;
947 expecter.ExpectError(SQLITE_CORRUPT); 879 expecter.ExpectError(SQLITE_CORRUPT);
948 ThumbnailDatabase db(NULL); 880 ThumbnailDatabase db(NULL);
949 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_)); 881 ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
950 882
951 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL)); 883 EXPECT_FALSE(db.GetIconMappingsForPageURL(kPageUrl2, NULL));
952 EXPECT_TRUE(CheckPageHasIcon(&db, 884 EXPECT_TRUE(CheckPageHasIcon(&db, kPageUrl1, favicon_base::FAVICON,
953 kPageUrl1, 885 kIconUrl3, kLargeSize, sizeof(kBlob1),
954 favicon_base::FAVICON,
955 kIconUrl1,
956 kLargeSize,
957 sizeof(kBlob1),
958 kBlob1)); 886 kBlob1));
959 887
960 ASSERT_TRUE(expecter.SawExpectedErrors()); 888 ASSERT_TRUE(expecter.SawExpectedErrors());
961 } 889 }
962 } 890 }
963 891
964 TEST_F(ThumbnailDatabaseTest, Recovery6) { 892 TEST_F(ThumbnailDatabaseTest, Recovery6) {
965 // TODO(shess): See comment at top of Recovery test. 893 // TODO(shess): See comment at top of Recovery test.
966 if (!sql::Recovery::FullRecoverySupported()) 894 if (!sql::Recovery::FullRecoverySupported())
967 return; 895 return;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1080 ThumbnailDatabase db(NULL); 1008 ThumbnailDatabase db(NULL);
1081 ASSERT_EQ(sql::INIT_OK, db.Init(db_path)); 1009 ASSERT_EQ(sql::INIT_OK, db.Init(db_path));
1082 1010
1083 // Verify that the resulting schema is correct, whether it 1011 // Verify that the resulting schema is correct, whether it
1084 // involved razing the file or fixing things in place. 1012 // involved razing the file or fixing things in place.
1085 VerifyTablesAndColumns(&db.db_); 1013 VerifyTablesAndColumns(&db.db_);
1086 } 1014 }
1087 } 1015 }
1088 1016
1089 } // namespace history 1017 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698