thumbnail_database_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_database.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_unittest_base.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/thumbnail_database.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/thumbnail_score.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/tools/profiles/thumbnail-inl.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data we'll put into the thumbnail database 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const unsigned char blob1[] = 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "12346102356120394751634516591348710478123649165419234519234512349134"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const unsigned char blob2[] = 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "goiwuegrqrcomizqyzkjalitbahxfjytrqvpqeroicxmnlkhlzunacxaneviawrtxcywhgef"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const unsigned char blob3[] = 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "3716871354098370776510470746794707624107647054607467847164027"; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kBoringness = 0.25; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kWorseBoringness = 0.50; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kBetterBoringness = 0.10; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kTotallyBoring = 1.0; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kPage1 = 1234; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Size kSmallSize = gfx::Size(16, 16); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::Size kLargeSize = gfx::Size(32, 32); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ThumbnailDatabaseTest : public testing::Test { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabaseTest() { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThumbnailDatabaseTest() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a temporary directory for the test DB files. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_name_ = temp_dir_.path().AppendASCII("TestThumbnails.db"); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_name_ = temp_dir_.path().AppendASCII("TestFavicons.db"); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_db_name_ = temp_dir_.path().AppendASCII("TestHistory.db"); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_bitmap_.reset( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::JPEGCodec::Decode(kGoogleThumbnail, sizeof(kGoogleThumbnail))); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FaviconSizes GetFaviconSizesSmallAndLarge() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconSizes sizes_small_and_large; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_small_and_large.push_back(kSmallSize); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_small_and_large.push_back(kLargeSize); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sizes_small_and_large; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> google_bitmap_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_name_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_file_name_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath history_db_name_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IconMappingMigrationTest : public HistoryUnitTestBase { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingMigrationTest() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~IconMappingMigrationTest() { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_path; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path = data_path.AppendASCII("History"); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_db_name_ = profile_->GetPath().Append(chrome::kHistoryFilename); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up history and thumbnails as they would be before migration. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteSQLScript(data_path.AppendASCII("history.20.sql"), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_db_name_)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail_db_name_ = 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPath().Append(chrome::kThumbnailsFilename); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteSQLScript(data_path.AppendASCII("thumbnails.3.sql"), 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail_db_name_)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath history_db_name_; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath thumbnail_db_name_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, GetFaviconAfterMigrationToTopSites) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID icon_id = db.AddFavicon(url, FAVICON, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFaviconSizesSmallAndLarge()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapID bitmap1_id = db.AddFaviconBitmap(icon_id, favicon, time, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSmallSize); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapID bitmap2_id = db.AddFaviconBitmap(icon_id, favicon, time, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kLargeSize); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.RenameAndDropThumbnails(file_name_, new_file_name_)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.IsLatestVersion()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_out; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconType icon_type_out; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconSizes favicon_sizes_out; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetFaviconHeader(icon_id, &url_out, &icon_type_out, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_sizes_out)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, url_out); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_type_out); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetFaviconSizesSmallAndLarge(), favicon_sizes_out); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps_out; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetFaviconBitmaps(icon_id, &favicon_bitmaps_out)); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, favicon_bitmaps_out.size()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap favicon_bitmap1 = favicon_bitmaps_out[0]; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap favicon_bitmap2 = favicon_bitmaps_out[1]; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Favicon bitmaps do not need to be in particular order. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (favicon_bitmap1.bitmap_id == bitmap2_id) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap tmp_favicon_bitmap = favicon_bitmap1; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap1 = favicon_bitmap2; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap2 = tmp_favicon_bitmap; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap1_id, favicon_bitmap1.bitmap_id); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_id, favicon_bitmap1.icon_id); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time.ToInternalValue(), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap1.last_updated.ToInternalValue()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data.size(), favicon_bitmap1.bitmap_data->size()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(std::equal(data.begin(), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.end(), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap1.bitmap_data->front())); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap1.pixel_size); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bitmap2_id, favicon_bitmap2.bitmap_id); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_id, favicon_bitmap2.icon_id); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time.ToInternalValue(), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap2.last_updated.ToInternalValue()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data.size(), favicon_bitmap2.bitmap_data->size()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(std::equal(data.begin(), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.end(), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap2.bitmap_data->front())); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLargeSize, favicon_bitmap2.pixel_size); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, AddIconMapping) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id = db.AddFavicon(url, TOUCH_ICON, GetDefaultFaviconSizes(), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon, time, gfx::Size()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, id); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(url, id)); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mappings)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, icon_mappings.front().page_url); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, icon_mappings.front().icon_id); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, UpdateIconMapping) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id = db.AddFavicon(url, TOUCH_ICON, GetDefaultFaviconSizes()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(0 < db.AddIconMapping(url, id)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mapping; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, icon_mapping.size()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, icon_mapping.front().page_url); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, icon_mapping.front().icon_id); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1("http://www.google.com/"); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID new_id = db.AddFavicon(url1, TOUCH_ICON, GetDefaultFaviconSizes()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.UpdateIconMapping(icon_mapping.front().mapping_id, new_id)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mapping.clear(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, icon_mapping.size()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, icon_mapping.front().page_url); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_id, icon_mapping.front().icon_id); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(id, icon_mapping.front().icon_id); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, DeleteIconMappings) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id = db.AddFavicon(url, TOUCH_ICON, GetDefaultFaviconSizes()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id, favicon, time, gfx::Size()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(0 < db.AddIconMapping(url, id)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id2 = db.AddFavicon(url, FAVICON, GetDefaultFaviconSizes()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(0 < db.AddIconMapping(url, id2)); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(id, id2); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mapping; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mapping)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, icon_mapping.size()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_mapping.front().icon_type, TOUCH_ICON); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, FAVICON, NULL)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.DeleteIconMappings(url); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.GetIconMappingsForPageURL(url, NULL)); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.GetIconMappingsForPageURL(url, FAVICON, NULL)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURL) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id1 = db.AddFavicon(url, TOUCH_ICON, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFaviconSizesSmallAndLarge()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id1, favicon, time, kSmallSize); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id1, favicon, time, kLargeSize); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(0 < db.AddIconMapping(url, id1)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id2 = db.AddFavicon(url, FAVICON, GetFaviconSizesSmallAndLarge()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(id1, id2); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id2, favicon, time, kSmallSize); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(0 < db.AddIconMapping(url, id2)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, &icon_mappings)); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, icon_mappings.size()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id1, icon_mappings[0].icon_id); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id2, icon_mappings[1].icon_id); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading database to version 4. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, UpgradeToVersion4) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name = "favicons"; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sql; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("DROP TABLE IF EXISTS "); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append(name); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.db_.Execute(sql.c_str())); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.resize(0); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("CREATE TABLE "); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append(name); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("(" 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "id INTEGER PRIMARY KEY," 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "url LONGVARCHAR NOT NULL," 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last_updated INTEGER DEFAULT 0," 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image_data BLOB)"); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.db_.Execute(sql.c_str())); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.UpgradeToVersion4()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement statement; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.Assign(db.db_.GetCachedStatement(SQL_FROM_HERE, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "INSERT INTO favicons (url, icon_type) VALUES (?, ?)")); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindString(0, URLDatabase::GURLToDatabaseURL(url)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindInt(1, TOUCH_ICON); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(statement.Run()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.Assign(db.db_.GetCachedStatement(SQL_FROM_HERE, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT icon_type FROM favicons")); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(statement.Step()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TOUCH_ICON, static_cast<IconType>(statement.ColumnInt(0))); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading database to version 5. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, UpgradeToVersion5) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name = "favicons"; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sql; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("DROP TABLE IF EXISTS "); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append(name); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.db_.Execute(sql.c_str())); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.resize(0); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("CREATE TABLE "); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append(name); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("(" 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "id INTEGER PRIMARY KEY," 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "url LONGVARCHAR NOT NULL," 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last_updated INTEGER DEFAULT 0," 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image_data BLOB," 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "icon_type INTEGER DEFAULT 1)"); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.db_.Execute(sql.c_str())); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.UpgradeToVersion5()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql = "SELECT sizes FROM favicons"; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.db_.Execute(sql.c_str())); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test upgrading database to version 6. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, UpgradeToVersion6) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* name = "favicons"; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sql; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("DROP TABLE IF EXISTS "); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append(name); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.db_.Execute(sql.c_str())); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.clear(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("CREATE TABLE "); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append(name); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql.append("(" 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "id INTEGER PRIMARY KEY," 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "url LONGVARCHAR NOT NULL," 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last_updated INTEGER DEFAULT 0," 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "image_data BLOB," 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "icon_type INTEGER DEFAULT 1," 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sizes LONGVARCHAR)"); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.db_.Execute(sql.c_str())); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int favicon_id = 1; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 last_updated = Time::Now().ToInternalValue(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data)); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement statement; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.Assign(db.db_.GetCachedStatement(SQL_FROM_HERE, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "INSERT INTO favicons (id, url, last_updated, image_data, icon_type, " 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sizes) VALUES (?, ?, ?, ?, ?, ?)")); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindInt(0, favicon_id); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindString(1, URLDatabase::GURLToDatabaseURL(url)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindInt64(2, last_updated); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindBlob(3, bitmap_data->front(), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(bitmap_data->size())); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindInt(4, TOUCH_ICON); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.BindCString(5, "Data which happened to be there"); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(statement.Run()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.UpgradeToVersion6()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.Assign(db.db_.GetCachedStatement(SQL_FROM_HERE, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT id, url, icon_type, sizes FROM favicons")); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(statement.Step()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_id, statement.ColumnInt(0)); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, GURL(statement.ColumnString(1))); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TOUCH_ICON, statement.ColumnInt(2)); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Any previous data in sizes should be cleared. 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(), statement.ColumnString(3)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.Assign(db.db_.GetCachedStatement(SQL_FROM_HERE, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT icon_id, last_updated, image_data, width, height " 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "FROM favicon_bitmaps")); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(statement.Step()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_id, statement.ColumnInt(0)); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(last_updated, statement.ColumnInt64(1)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<int>(bitmap_data->size()), 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement.ColumnByteLength(2)); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, statement.ColumnInt(3)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, statement.ColumnInt(4)); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that only data moved to a temporary table is left in the main table 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// once the temporary table is committed. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, TemporaryTables) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.InitTemporaryTables()); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL unkept_url("http://google.com/favicon2.ico"); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID unkept_id = db.AddFavicon(unkept_url, FAVICON, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFaviconSizesSmallAndLarge()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(unkept_id, favicon, base::Time::Now(), kSmallSize); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL kept_url("http://google.com/favicon.ico"); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID kept_id = db.AddFavicon(kept_url, FAVICON, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFaviconSizesSmallAndLarge()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(kept_id, favicon, base::Time::Now(), kLargeSize); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://google.com"); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddIconMapping(page_url, unkept_id); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddIconMapping(page_url, kept_id); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID new_favicon_id = 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.CopyFaviconAndFaviconBitmapsToTemporaryTables(kept_id); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, new_favicon_id); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.AddToTemporaryIconMappingTable(page_url, new_favicon_id)); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.CommitTemporaryTables()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only copied data should be left. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, FAVICON, &icon_mappings)); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(new_favicon_id, icon_mappings[0].icon_id); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url, icon_mappings[0].page_url); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetFaviconBitmaps(icon_mappings[0].icon_id, &favicon_bitmaps)); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, favicon_bitmaps.size()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLargeSize, favicon_bitmaps[0].pixel_size); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.GetFaviconIDForFaviconURL(unkept_url, false, NULL)); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that deleting a favicon deletes the favicon row and favicon bitmap 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rows from the database. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, DeleteFavicon) { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data1(blob1, blob1 + sizeof(blob1)); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon1( 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data1)); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data2(blob2, blob2 + sizeof(blob2)); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon2( 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data2)); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id = db.AddFavicon(url, FAVICON, GetFaviconSizesSmallAndLarge()); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_updated = base::Time::Now(); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id, favicon1, last_updated, kSmallSize); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id, favicon2, last_updated, kLargeSize); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetFaviconBitmaps(id, NULL)); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.DeleteFavicon(id)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.GetFaviconBitmaps(id, NULL)); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLForReturnOrder) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a favicon 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://google.com"); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url("http://google.com/favicon.ico"); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id = db.AddFavicon(icon_url, FAVICON, GetDefaultFaviconSizes(), 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon, time, gfx::Size()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(page_url, id)); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, &icon_mappings)); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url, icon_mappings.front().page_url); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id, icon_mappings.front().icon_id); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_mappings.front().icon_type); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings.front().icon_url); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a touch icon 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data2(blob2, blob2 + sizeof(blob2)); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon2 = 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id2 = db.AddFavicon(icon_url, TOUCH_ICON, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon2, time, gfx::Size()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(page_url, id2)); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, &icon_mappings)); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url, icon_mappings.front().page_url); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id2, icon_mappings.front().icon_id); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TOUCH_ICON, icon_mappings.front().icon_type); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings.front().icon_url); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a touch precomposed icon 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon3 = 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data2); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id3 = db.AddFavicon(icon_url, TOUCH_PRECOMPOSED_ICON, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon3, time, gfx::Size()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(page_url, id3)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url, &icon_mappings)); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url, icon_mappings.front().page_url); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id3, icon_mappings.front().icon_id); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TOUCH_PRECOMPOSED_ICON, icon_mappings.front().icon_type); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings.front().icon_url); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test result of GetIconMappingsForPageURL when an icon type is passed in. 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, GetIconMappingsForPageURLWithIconType) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id1 = db.AddFavicon(url, FAVICON, GetDefaultFaviconSizes(), 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon, time, gfx::Size()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(url, id1)); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id2 = db.AddFavicon(url, TOUCH_ICON, GetDefaultFaviconSizes(), 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon, time, gfx::Size()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(url, id2)); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id3 = db.AddFavicon(url, TOUCH_ICON, GetDefaultFaviconSizes(), 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon, time, gfx::Size()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, db.AddIconMapping(url, id3)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the mappings for favicons of type TOUCH_ICON should be returned as 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TOUCH_ICON is a larger icon type than FAVICON. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL( 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FAVICON | TOUCH_ICON | TOUCH_PRECOMPOSED_ICON, 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings)); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, icon_mappings.size()); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id2 == icon_mappings[0].icon_id) { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id3, icon_mappings[1].icon_id); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id3, icon_mappings[0].icon_id); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id2, icon_mappings[1].icon_id); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, TOUCH_ICON, &icon_mappings)); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id2 == icon_mappings[0].icon_id) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id3, icon_mappings[1].icon_id); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id3, icon_mappings[0].icon_id); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id2, icon_mappings[1].icon_id); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(url, FAVICON, &icon_mappings)); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id1, icon_mappings[0].icon_id); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, HasMappingFor) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a favicon which will have icon_mappings 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id1 = db.AddFavicon(GURL("http://google.com"), FAVICON, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon, time, gfx::Size()); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(id1, 0); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another type of favicon 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time = base::Time::Now(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id2 = db.AddFavicon(GURL("http://www.google.com/icon"), TOUCH_ICON, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon, time, gfx::Size()); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(id2, 0); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add 3rd favicon 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time = base::Time::Now(); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id3 = db.AddFavicon(GURL("http://www.google.com/icon"), TOUCH_ICON, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon, time, gfx::Size()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(id3, 0); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add 2 icon mapping 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://www.google.com"); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.AddIconMapping(page_url, id1)); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.AddIconMapping(page_url, id2)); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.HasMappingFor(id1)); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.HasMappingFor(id2)); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.HasMappingFor(id3)); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove all mappings 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.DeleteIconMappings(page_url); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.HasMappingFor(id1)); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.HasMappingFor(id2)); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.HasMappingFor(id3)); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, CloneIconMappings) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a favicon which will have icon_mappings 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id1 = db.AddFavicon(GURL("http://google.com"), FAVICON, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, id1); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time = base::Time::Now(); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id1, favicon, time, gfx::Size()); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another type of favicon 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id2 = db.AddFavicon(GURL("http://www.google.com/icon"), TOUCH_ICON, 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes()); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, id2); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time = base::Time::Now(); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id2, favicon, time, gfx::Size()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add 3rd favicon 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID id3 = db.AddFavicon(GURL("http://www.google.com/icon"), TOUCH_ICON, 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, id3); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time = base::Time::Now(); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.AddFaviconBitmap(id3, favicon, time, gfx::Size()); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page1_url("http://page1.com"); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.AddIconMapping(page1_url, id1)); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.AddIconMapping(page1_url, id2)); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page2_url("http://page2.com"); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.AddIconMapping(page2_url, id3)); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test we do nothing with existing mappings. 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mapping; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page2_url, &icon_mapping)); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, icon_mapping.size()); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.CloneIconMappings(page1_url, page2_url)); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mapping.clear(); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page2_url, &icon_mapping)); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, icon_mapping.size()); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page2_url, icon_mapping[0].page_url); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id3, icon_mapping[0].icon_id); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test we clone if the new page has no mappings. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page3_url("http://page3.com"); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.CloneIconMappings(page1_url, page3_url)); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mapping.clear(); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page3_url, &icon_mapping)); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, icon_mapping.size()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (icon_mapping[0].icon_id == id2) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::swap(icon_mapping[0], icon_mapping[1]); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page3_url, icon_mapping[0].page_url); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id1, icon_mapping[0].icon_id); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page3_url, icon_mapping[1].page_url); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(id2, icon_mapping[1].icon_id); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(IconMappingMigrationTest, TestIconMappingMigration) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryDatabase history_db; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(history_db.db_.Open(history_db_name_)); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_db.BeginTransaction(); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon1 = GURL("http://www.google.com/favicon.ico"); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon2 = GURL("http://www.yahoo.com/favicon.ico"); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(thumbnail_db_name_, NULL, &history_db)); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Migration should be done. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test one icon_mapping. 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url1 = GURL("http://google.com/"); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url1, &icon_mappings)); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, icon_mappings.size()); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_mappings[0].icon_type); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url1, icon_mappings[0].page_url); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, icon_mappings[0].icon_id); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon1, icon_mappings[0].icon_url); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a page which has the same icon. 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url3 = GURL("http://www.google.com/"); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url3, &icon_mappings)); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, icon_mappings.size()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_mappings[0].icon_type); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url3, icon_mappings[0].page_url); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, icon_mappings[0].icon_id); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon1, icon_mappings[0].icon_url); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a icon_mapping with different IconID. 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url2 = GURL("http://yahoo.com/"); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db.GetIconMappingsForPageURL(page_url2, &icon_mappings)); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, icon_mappings.size()); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_mappings[0].icon_type); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(page_url2, icon_mappings[0].page_url); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, icon_mappings[0].icon_id); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon2, icon_mappings[0].icon_url); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a page without icon 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url4 = GURL("http://www.google.com/blank.html"); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(db.GetIconMappingsForPageURL(page_url4, NULL)); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, IconMappingEnumerator) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase db; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sql::INIT_OK, db.Init(file_name_, NULL, NULL)); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db.BeginTransaction(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data(blob1, blob1 + sizeof(blob1)); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> favicon(new base::RefCountedBytes(data)); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url1("http://google.com/favicon.ico"); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID touch_icon_id1 = db.AddFavicon(icon_url1, TOUCH_ICON, 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon, base::Time::Now(), gfx::Size()); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, touch_icon_id1); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingID touch_mapping_id1 = db.AddIconMapping(url, touch_icon_id1); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, touch_mapping_id1); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID favicon_id1 = db.AddFavicon(icon_url1, FAVICON, 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon, base::Time::Now(), gfx::Size()); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, favicon_id1); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingID favicon_mapping_id1 = db.AddIconMapping(url, favicon_id1); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, favicon_mapping_id1); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url2("http://chromium.org"); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url2("http://chromium.org/favicon.ico"); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconID favicon_id2 = db.AddFavicon(icon_url2, FAVICON, 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDefaultFaviconSizes(), favicon, base::Time::Now(), gfx::Size()); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, favicon_id2); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingID favicon_mapping_id2 = db.AddIconMapping(url2, favicon_id2); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, favicon_mapping_id2); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMapping icon_mapping; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase::IconMappingEnumerator enumerator1; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.InitIconMappingEnumerator(FAVICON, &enumerator1)); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are 2 favicon mappings. 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_favicon_mapping1 = false; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_favicon_mapping2 = false; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mapping_count = 0; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (enumerator1.GetNextIconMapping(&icon_mapping)) { 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mapping_count++; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (favicon_mapping_id1 == icon_mapping.mapping_id) { 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_favicon_mapping1 = true; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, icon_mapping.page_url); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_id1, icon_mapping.icon_id); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url1, icon_mapping.icon_url); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_mapping.icon_type); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (favicon_mapping_id2 == icon_mapping.mapping_id) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_favicon_mapping2 = true; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url2, icon_mapping.page_url); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_id2, icon_mapping.icon_id); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url2, icon_mapping.icon_url); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(FAVICON, icon_mapping.icon_type); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, mapping_count); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(has_favicon_mapping1); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(has_favicon_mapping2); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase::IconMappingEnumerator enumerator2; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.InitIconMappingEnumerator(TOUCH_ICON, &enumerator2)); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(enumerator2.GetNextIconMapping(&icon_mapping)); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(touch_mapping_id1, icon_mapping.mapping_id); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, icon_mapping.page_url); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(touch_icon_id1, icon_mapping.icon_id); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url1, icon_mapping.icon_url); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(TOUCH_ICON, icon_mapping.icon_type); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(enumerator2.GetNextIconMapping(&icon_mapping)); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailDatabaseTest, FaviconSizesToAndFromString) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid input. 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconSizes sizes_missing_height; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase::DatabaseStringToFaviconSizes("0 0 10", 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &sizes_missing_height); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sizes_missing_height.size()); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconSizes sizes_non_int; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase::DatabaseStringToFaviconSizes("0 0 a 10", 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &sizes_non_int); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sizes_non_int.size()); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Valid input. 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconSizes sizes_empty; 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ThumbnailDatabase::DatabaseStringToFaviconSizes(std::string(), &sizes_empty); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sizes_empty.size()); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconSizes sizes_valid; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase::DatabaseStringToFaviconSizes("10 15 20 25", &sizes_valid); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, sizes_valid.size()); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sizes_valid[0] == gfx::Size(10, 15)) { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizes_valid[1], gfx::Size(20, 25)); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizes_valid[0], gfx::Size(20, 25)); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(sizes_valid[1], gfx::Size(10, 15)); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sizes_as_string; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailDatabase::FaviconSizesToDatabaseString(sizes_valid, 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &sizes_as_string); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(sizes_as_string == "10 15 20 25" || 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_as_string == "20 25 10 15"); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 878