1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <algorithm> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/command_line.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted_memory.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/history_database.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/history_unittest_base.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/thumbnail_database.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/chrome_constants.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/thumbnail_score.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/test/testing_profile.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/tools/profiles/thumbnail-inl.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/codec/jpeg_codec.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::Time; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::TimeDelta; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// data we'll put into the thumbnail database 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const unsigned char blob1[] = 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "12346102356120394751634516591348710478123649165419234519234512349134"; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const unsigned char blob2[] = 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "goiwuegrqrcomizqyzkjalitbahxfjytrqvpqeroicxmnlkhlzunacxaneviawrtxcywhgef"; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const unsigned char blob3[] = 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "3716871354098370776510470746794707624107647054607467847164027"; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst double kBoringness = 0.25; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst double kWorseBoringness = 0.50; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst double kBetterBoringness = 0.10; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst double kTotallyBoring = 1.0; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int64 kPage1 = 1234; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ThumbnailDatabaseTest : public testing::Test { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThumbnailDatabaseTest() { 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~ThumbnailDatabaseTest() { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get a temporary directory for the test DB files. 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_name_ = temp_dir_.path().AppendASCII("TestThumbnails.db"); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new_file_name_ = temp_dir_.path().AppendASCII("TestFavicons.db"); 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history_db_name_ = temp_dir_.path().AppendASCII("TestHistory.db"); 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch google_bitmap_.reset( 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::JPEGCodec::Decode(kGoogleThumbnail, sizeof(kGoogleThumbnail))); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<SkBitmap> google_bitmap_; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScopedTempDir temp_dir_; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_name_; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath new_file_name_; 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath history_db_name_; 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass IconMappingMigrationTest : public HistoryUnitTestBase { 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IconMappingMigrationTest() { 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ~IconMappingMigrationTest() { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void SetUp() { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_.reset(new TestingProfile); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath data_path; 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data_path = data_path.AppendASCII("History"); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history_db_name_ = profile_->GetPath().Append(chrome::kHistoryFilename); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set up history and thumbnails as they would be before migration. 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE( 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExecuteSQLScript(data_path.AppendASCII("history.20.sql"), 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history_db_name_)); 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen thumbnail_db_name_ = 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_->GetPath().Append(chrome::kThumbnailsFilename); 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NO_FATAL_FAILURE( 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExecuteSQLScript(data_path.AppendASCII("thumbnails.3.sql"), 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen thumbnail_db_name_)); 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen protected: 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath history_db_name_; 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath thumbnail_db_name_; 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<TestingProfile> profile_; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ThumbnailDatabaseTest, GetFaviconAfterMigrationToTopSites) { 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThumbnailDatabase db; 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db.BeginTransaction(); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url("http://google.com"); 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, FAVICON); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time time = base::Time::Now(); 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db.RenameAndDropThumbnails(file_name_, new_file_name_)); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time time_out; 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<unsigned char> favicon_out; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url_out; 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetFavicon(id, &time_out, &favicon_out, &url_out)); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(url, url_out); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(time.ToTimeT(), time_out.ToTimeT()); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(data.size(), favicon_out.size()); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(std::equal(data.begin(), 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.end(), 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch favicon_out.begin())); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, AddIconMapping) { 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, TOUCH_ICON); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(0, id); 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(0, db.AddIconMapping(url, id)); 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<IconMapping> icon_mapping; 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(1u, icon_mapping.size()); 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.front().page_url); 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id, icon_mapping.front().icon_id); 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, UpdateIconMapping) { 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, TOUCH_ICON); 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(0 < db.AddIconMapping(url, id)); 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<IconMapping> icon_mapping; 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1u, icon_mapping.size()); 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.front().page_url); 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id, icon_mapping.front().icon_id); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url1("http://www.google.com/"); 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID new_id = db.AddFavicon(url1, TOUCH_ICON); 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.UpdateIconMapping(icon_mapping.front().mapping_id, new_id)); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mapping.clear(); 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1u, icon_mapping.size()); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.front().page_url); 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(new_id, icon_mapping.front().icon_id); 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(id, icon_mapping.front().icon_id); 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, DeleteIconMappings) { 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, TOUCH_ICON); 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(0 < db.AddIconMapping(url, id)); 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id2 = db.AddFavicon(url, FAVICON); 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id2, favicon, time); 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(0 < db.AddIconMapping(url, id2)); 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_NE(id, id2); 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<IconMapping> icon_mapping; 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(2u, icon_mapping.size()); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(icon_mapping.front().icon_type, TOUCH_ICON); 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingForPageURL(url, FAVICON, NULL)); 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.DeleteIconMappings(url); 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.GetIconMappingsForPageURL(url, NULL)); 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.GetIconMappingForPageURL(url, FAVICON, NULL)); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURL) { 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id1 = db.AddFavicon(url, TOUCH_ICON); 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id1, favicon, time); 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(0 < db.AddIconMapping(url, id1)); 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id2 = db.AddFavicon(url, FAVICON); 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(id1, id2); 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id2, favicon, time); 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(0 < db.AddIconMapping(url, id2)); 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<IconMapping> icon_mapping; 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(2u, icon_mapping.size()); 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(icon_mapping[0].icon_id, icon_mapping[1].icon_id); 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(icon_mapping[0].icon_id == id1 && icon_mapping[1].icon_id == id2); 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, UpgradeToVersion4) { 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const char* name = "favicons"; 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string sql; 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql.append("DROP TABLE IF EXISTS "); 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql.append(name); 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.db_.Execute(sql.c_str())); 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql.resize(0); 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql.append("CREATE TABLE "); 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql.append(name); 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql.append("(" 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "id INTEGER PRIMARY KEY," 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "url LONGVARCHAR NOT NULL," 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "last_updated INTEGER DEFAULT 0," 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "image_data BLOB)"); 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.db_.Execute(sql.c_str())); 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.UpgradeToVersion4()); 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, TOUCH_ICON); 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(0 < db.AddIconMapping(url, id)); 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IconMapping icon_mapping; 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingForPageURL(url, TOUCH_ICON, &icon_mapping)); 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.page_url); 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id, icon_mapping.icon_id); 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, TemporayIconMapping) { 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.InitTemporaryIconMappingTable()); 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, FAVICON); 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.AddToTemporaryIconMappingTable(url, id); 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.CommitTemporaryIconMappingTable(); 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IconMapping icon_mapping; 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingForPageURL(url, FAVICON, &icon_mapping)); 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id, icon_mapping.icon_id); 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.page_url); 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLForReturnOrder) { 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add a favicon 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL url("http://google.com"); 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id = db.AddFavicon(url, FAVICON); 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id, favicon, time); 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(0, db.AddIconMapping(url, id)); 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<IconMapping> icon_mapping; 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.front().page_url); 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id, icon_mapping.front().icon_id); 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(FAVICON, icon_mapping.front().icon_type); 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add a touch icon 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data2(blob2, blob2 + sizeof(blob2)); 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon2(new RefCountedBytes(data)); 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id2 = db.AddFavicon(url, TOUCH_ICON); 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id2, favicon2, time); 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(0, db.AddIconMapping(url, id2)); 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mapping.clear(); 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.front().page_url); 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id2, icon_mapping.front().icon_id); 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(TOUCH_ICON, icon_mapping.front().icon_type); 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add a touch precomposed icon 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon3(new RefCountedBytes(data2)); 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id3 = db.AddFavicon(url, TOUCH_PRECOMPOSED_ICON); 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id3, favicon3, time); 356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(0, db.AddIconMapping(url, id3)); 357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mapping.clear(); 359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(url, icon_mapping.front().page_url); 362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(id3, icon_mapping.front().icon_id); 363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(TOUCH_PRECOMPOSED_ICON, icon_mapping.front().icon_type); 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(ThumbnailDatabaseTest, HasMappingFor) { 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<RefCountedBytes> favicon(new RefCountedBytes(data)); 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add a favicon which will have icon_mappings 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id1 = db.AddFavicon(GURL("http://google.com"), FAVICON); 376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(id1, 0); 377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time = base::Time::Now(); 378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id1, favicon, time); 379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add another type of favicon 381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id2 = db.AddFavicon(GURL("http://www.google.com/icon"), TOUCH_ICON); 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(id2, 0); 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen time = base::Time::Now(); 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id2, favicon, time); 385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add 3rd favicon 387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FaviconID id3 = db.AddFavicon(GURL("http://www.google.com/icon"), TOUCH_ICON); 388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_NE(id3, 0); 389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen time = base::Time::Now(); 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.SetFavicon(id3, favicon, time); 391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add 2 icon mapping 393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL page_url("http://www.google.com"); 394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.AddIconMapping(page_url, id1)); 395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.AddIconMapping(page_url, id2)); 396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.HasMappingFor(id1)); 398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.HasMappingFor(id2)); 399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.HasMappingFor(id3)); 400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove all mappings 402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.DeleteIconMappings(page_url); 403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.HasMappingFor(id1)); 404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.HasMappingFor(id2)); 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.HasMappingFor(id3)); 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(IconMappingMigrationTest, TestIconMappingMigration) { 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HistoryDatabase history_db; 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(history_db.db_.Open(history_db_name_)); 411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history_db.BeginTransaction(); 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL icon1 = GURL("http://www.google.com/favicon.ico"); 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const GURL icon2 = GURL("http://www.yahoo.com/favicon.ico"); 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ThumbnailDatabase db; 417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(sql::INIT_OK, db.Init(thumbnail_db_name_, NULL, &history_db)); 418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db.BeginTransaction(); 419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Migration should be done. 421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Test one icon_mapping. 422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL page_url1 = GURL("http://google.com/"); 423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<IconMapping> icon_mappings; 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url1, &icon_mappings)); 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1u, icon_mappings.size()); 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(FAVICON, icon_mappings[0].icon_type); 427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(page_url1, icon_mappings[0].page_url); 428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(1, icon_mappings[0].icon_id); 429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time; 430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<unsigned char> out_data; 431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL out_icon_url; 432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.GetFavicon( 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mappings[0].icon_id, &time, &out_data, &out_icon_url)); 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(icon1, out_icon_url); 435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Test a page which has the same icon. 437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL page_url3 = GURL("http://www.google.com/"); 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mappings.clear(); 439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url3, &icon_mappings)); 440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1u, icon_mappings.size()); 441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(FAVICON, icon_mappings[0].icon_type); 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(page_url3, icon_mappings[0].page_url); 443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(1, icon_mappings[0].icon_id); 444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Test a icon_mapping with different IconID. 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL page_url2 = GURL("http://yahoo.com/"); 447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mappings.clear(); 448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url2, &icon_mappings)); 449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1u, icon_mappings.size()); 450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(FAVICON, icon_mappings[0].icon_type); 451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(page_url2, icon_mappings[0].page_url); 452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(2, icon_mappings[0].icon_id); 453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(db.GetFavicon( 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen icon_mappings[0].icon_id, &time, &out_data, &out_icon_url)); 455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(icon2, out_icon_url); 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Test a page without icon 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GURL page_url4 = GURL("http://www.google.com/blank.html"); 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_FALSE(db.GetIconMappingsForPageURL(page_url4, NULL)); 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace history 463