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