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