1dc0f95d653279beabeb9817299e2902918ba123eKristian 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
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/command_line.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h"
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/format_macros.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/path_service.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h"
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/history_backend.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/history_database.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_marshaling.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_notifications.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/history/history_unittest_base.h"
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/top_sites.h"
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/top_sites_backend.h"
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/top_sites_cache.h"
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/history/top_sites_database.h"
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/most_visited_handler.h"
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/chrome_constants.h"
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/chrome_paths.h"
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/chrome_switches.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/tools/profiles/thumbnail-inl.h"
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/chromium_strings.h"
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/generated_resources.h"
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "grit/locale_settings.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h"
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/codec/jpeg_codec.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Used by WaitForHistory, see it for details.
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass WaitForHistoryTask : public HistoryDBTask {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistoryTask() {}
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool RunOnDBThread(HistoryBackend* backend, HistoryDatabase* db) {
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void DoneRunOnMainThread() {
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    MessageLoop::current()->Quit();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(WaitForHistoryTask);
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Used for querying top sites. Either runs sequentially, or runs a nested
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// nested message loop until the response is complete. The later is used when
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// TopSites is queried before it finishes loading.
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TopSitesQuerier {
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier() : number_of_callbacks_(0), waiting_(false) {}
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Queries top sites. If |wait| is true a nested message loop is run until the
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // callback is notified.
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void QueryTopSites(TopSites* top_sites, bool wait) {
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int start_number_of_callbacks = number_of_callbacks_;
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    top_sites->GetMostVisitedURLs(
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        &consumer_,
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        NewCallback(this, &TopSitesQuerier::OnTopSitesAvailable));
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (wait && start_number_of_callbacks == number_of_callbacks_) {
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      waiting_ = true;
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      MessageLoop::current()->Run();
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void CancelRequest() {
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    consumer_.CancelAllRequests();
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_urls(const MostVisitedURLList& urls) { urls_ = urls; }
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const MostVisitedURLList& urls() const { return urls_; }
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int number_of_callbacks() const { return number_of_callbacks_; }
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Callback for TopSites::GetMostVisitedURLs.
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnTopSitesAvailable(const history::MostVisitedURLList& data) {
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    urls_ = data;
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    number_of_callbacks_++;
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (waiting_) {
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      MessageLoop::current()->Quit();
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      waiting_ = false;
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CancelableRequestConsumer consumer_;
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURLList urls_;
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int number_of_callbacks_;
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool waiting_;
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TopSitesQuerier);
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Extracts the data from |t1| into a SkBitmap. This is intended for usage of
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// thumbnail data, which is stored as jpgs.
109513209b27ff55e2841eac0e4120199c23acce758Ben MurdochSkBitmap ExtractThumbnail(const RefCountedBytes& t1) {
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<SkBitmap> image(gfx::JPEGCodec::Decode(t1.front(),
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                    t1.data.size()));
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return image.get() ? *image : SkBitmap();
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Returns true if t1 and t2 contain the same data.
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool ThumbnailsAreEqual(RefCountedBytes* t1, RefCountedBytes* t2) {
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!t1 || !t2)
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (t1->data.size() != t2->data.size())
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return std::equal(t1->data.begin(),
122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    t1->data.end(),
123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    t2->data.begin());
124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace
127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TopSitesTest : public HistoryUnitTestBase {
129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesTest()
131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      : ui_thread_(BrowserThread::UI, &message_loop_),
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        db_thread_(BrowserThread::DB, &message_loop_),
133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        original_command_line_(*CommandLine::ForCurrentProcess()) {
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    profile_.reset(new TestingProfile);
138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (CreateHistoryAndTopSites()) {
139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      profile_->CreateHistoryService(false, false);
140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      profile_->CreateTopSites();
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      profile_->BlockUntilTopSitesLoaded();
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    profile_.reset();
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    *CommandLine::ForCurrentProcess() = original_command_line_;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if history and top sites should be created in SetUp.
151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool CreateHistoryAndTopSites() {
152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Gets the thumbnail for |url| from TopSites.
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap GetThumbnail(const GURL& url) {
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> data;
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return top_sites()->GetPageThumbnail(url, &data) ?
159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ExtractThumbnail(*data.get()) : SkBitmap();
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Creates a bitmap of the specified color.
163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap CreateBitmap(SkColor color) {
164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SkBitmap thumbnail;
165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    thumbnail.setConfig(SkBitmap::kARGB_8888_Config, 4, 4);
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    thumbnail.allocPixels();
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    thumbnail.eraseColor(color);
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return thumbnail;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Forces top sites to load top sites from history, then recreates top sites.
172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreating top sites makes sure the changes from history are saved and
173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // loaded from the db.
174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RefreshTopSitesAndRecreate() {
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    StartQueryForMostVisited();
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    WaitForHistory();
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    RecreateTopSitesAndBlock();
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Blocks the caller until history processes a task. This is useful if you
181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // need to wait until you know history has processed a task.
182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void WaitForHistory() {
183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->ScheduleDBTask(new WaitForHistoryTask(), &consumer_);
184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    MessageLoop::current()->Run();
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Waits for top sites to finish processing a task. This is useful if you need
188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // to wait until top sites finishes processing a task.
189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void WaitForTopSites() {
190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    top_sites()->backend_->DoEmptyRequest(
191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        &consumer_,
192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        NewCallback(this, &TopSitesTest::QuitCallback));
193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    MessageLoop::current()->Run();
194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSites* top_sites() { return profile_->GetTopSites(); }
197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CancelableRequestConsumer* consumer() { return &consumer_; }
198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TestingProfile* profile() {return profile_.get();}
199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  HistoryService* history_service() {
200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURLList GetPrepopulatePages() {
204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return TopSites::GetPrepopulatePages();
205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if the TopSitesQuerier contains the prepopulate data starting
208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // at |start_index|.
209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void ContainsPrepopulatePages(const TopSitesQuerier& querier,
210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                size_t start_index) {
211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    MostVisitedURLList prepopulate_urls = GetPrepopulatePages();
212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_LE(start_index + prepopulate_urls.size(), querier.urls().size());
213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (size_t i = 0; i < prepopulate_urls.size(); ++i) {
214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      EXPECT_EQ(prepopulate_urls[i].url.spec(),
215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                querier.urls()[start_index + i].url.spec()) << " @ index " <<
216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          i;
217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Used for callbacks from history.
221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void EmptyCallback() {
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Quit the current message loop when invoked. Useful when running a nested
225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // message loop.
226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void QuitCallback(TopSitesBackend::Handle handle) {
227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    MessageLoop::current()->Quit();
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Adds a page to history.
231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void AddPageToHistory(const GURL& url) {
232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    RedirectList redirects;
233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    redirects.push_back(url);
234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->AddPage(
235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        url, static_cast<void*>(this), 0, GURL(), PageTransition::TYPED,
236513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        redirects, history::SOURCE_BROWSED, false);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Adds a page to history.
240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void AddPageToHistory(const GURL& url, const string16& title) {
241513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    RedirectList redirects;
242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    redirects.push_back(url);
243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->AddPage(
244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        url, static_cast<void*>(this), 0, GURL(), PageTransition::TYPED,
245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        redirects, history::SOURCE_BROWSED, false);
246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->SetPageTitle(url, title);
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Adds a page to history.
250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void AddPageToHistory(const GURL& url,
251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const string16& title,
252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        const history::RedirectList& redirects,
253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                        base::Time time) {
254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->AddPage(
255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        url, time, static_cast<void*>(this), 0, GURL(), PageTransition::TYPED,
256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        redirects, history::SOURCE_BROWSED, false);
257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->SetPageTitle(url, title);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
260513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Delets a url.
261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void DeleteURL(const GURL& url) {
262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    history_service()->DeleteURL(url);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if the thumbnail equals the specified bytes.
266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool ThumbnailEqualsBytes(const SkBitmap& image, RefCountedBytes* bytes) {
267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> encoded_image;
268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EncodeBitmap(image, &encoded_image);
269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return ThumbnailsAreEqual(encoded_image, bytes);
270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreates top sites. This forces top sites to reread from the db.
273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void RecreateTopSitesAndBlock() {
274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Recreate TopSites and wait for it to load.
275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile()->CreateTopSites();
276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // As history already loaded we have to fake this call.
277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile()->BlockUntilTopSitesLoaded();
278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Wrappers that allow private TopSites functions to be called from the
281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // individual tests without making them all be friends.
282513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL GetCanonicalURL(const GURL& url) {
283513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return top_sites()->cache_->GetCanonicalURL(url);
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetTopSites(const MostVisitedURLList& new_top_sites) {
287513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    top_sites()->SetTopSites(new_top_sites);
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void StartQueryForMostVisited() {
291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    top_sites()->StartQueryForMostVisited();
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool EncodeBitmap(const SkBitmap& image,
295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    scoped_refptr<RefCountedBytes>* bytes) {
296513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return TopSites::EncodeBitmap(image, bytes);
297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetLastNumUrlsChanged(size_t value) {
300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    top_sites()->last_num_urls_changed_ = value;
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  size_t last_num_urls_changed() { return top_sites()->last_num_urls_changed_; }
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::TimeDelta GetUpdateDelay() {
306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return top_sites()->GetUpdateDelay();
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool IsTopSitesLoaded() { return top_sites()->loaded_; }
310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool AddPrepopulatedPages(MostVisitedURLList* urls) {
312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return TopSites::AddPrepopulatedPages(urls);
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MessageLoopForUI message_loop_;
317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BrowserThread ui_thread_;
318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BrowserThread db_thread_;
319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<TestingProfile> profile_;
320513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CancelableRequestConsumer consumer_;
321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CommandLine original_command_line_;
322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
323513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TopSitesTest);
324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};  // Class TopSitesTest
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TopSitesMigrationTest : public TopSitesTest {
327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesMigrationTest() {}
329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
330513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual void SetUp() {
331513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesTest::SetUp();
332513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
333513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath data_path;
334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path));
335513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    data_path = data_path.AppendASCII("top_sites");
336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
337513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Set up history and thumbnails as they would be before migration.
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_NO_FATAL_FAILURE(ExecuteSQLScript(
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        data_path.AppendASCII("history.19.sql"),
340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        profile()->GetPath().Append(chrome::kHistoryFilename)));
341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_NO_FATAL_FAILURE(ExecuteSQLScript(
342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        data_path.AppendASCII("thumbnails.3.sql"),
343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        profile()->GetPath().Append(chrome::kThumbnailsFilename)));
344513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
345513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile()->CreateHistoryService(false, false);
346513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile()->CreateTopSites();
347513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile()->BlockUntilTopSitesLoaded();
348513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
349513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
350513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if history and top sites should be created in SetUp.
351513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool CreateHistoryAndTopSites() {
352513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
353513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
354513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
355513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch protected:
356513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Assertions for the migration test. This is extracted into a standalone
357513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // method so that it can be invoked twice.
358513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void MigrationAssertions() {
359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
360513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
361513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
362513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // We shouldn't have gotten a callback.
363513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(1, querier.number_of_callbacks());
364513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
365513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // The data we loaded should contain google and yahoo.
366513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
367513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(GURL("http://google.com/"), querier.urls()[0].url);
368513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(GURL("http://yahoo.com/"), querier.urls()[1].url);
369513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SkBitmap goog_thumbnail = GetThumbnail(GURL("http://google.com/"));
372513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(1, goog_thumbnail.width());
373513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
374513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SkBitmap yahoo_thumbnail = GetThumbnail(GURL("http://yahoo.com/"));
375513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(2, yahoo_thumbnail.width());
376513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
377513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Favicon assertions are handled in ThumbnailDatabase.
378513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
379513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
380513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
381513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TopSitesMigrationTest);
383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper function for appending a URL to a vector of "most visited" URLs,
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// using the default values for everything but the URL.
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void AppendMostVisitedURL(std::vector<MostVisitedURL>* list,
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const GURL& url) {
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL mv;
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.url = url;
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(url);
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  list->push_back(mv);
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Same as AppendMostVisitedURL except that it adds a redirect from the first
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URL to the second.
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void AppendMostVisitedURLWithRedirect(
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::vector<MostVisitedURL>* list,
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& redirect_source, const GURL& redirect_dest) {
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL mv;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.url = redirect_dest;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(redirect_source);
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(redirect_dest);
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  list->push_back(mv);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests GetCanonicalURL.
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, GetCanonicalURL) {
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Have two chains:
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   google.com -> www.google.com
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   news.google.com (no redirects)
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL news("http://news.google.com/");
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL source("http://google.com/");
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL dest("http://www.google.com/");
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<MostVisitedURL> most_visited;
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURLWithRedirect(&most_visited, source, dest);
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&most_visited, news);
419513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(most_visited);
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Random URLs not in the database are returned unchanged.
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL result = GetCanonicalURL(GURL("http://fark.com/"));
4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(GURL("http://fark.com/"), result);
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Easy case, there are no redirects and the exact URL is stored.
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = GetCanonicalURL(news);
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(news, result);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URL in question is the source URL in a redirect list.
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = GetCanonicalURL(source);
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(dest, result);
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URL in question is the destination of a redirect.
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result = GetCanonicalURL(dest);
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(dest, result);
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
438513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests DiffMostVisited.
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, DiffMostVisited) {
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL stays_the_same("http://staysthesame/");
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL gets_added_1("http://getsadded1/");
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL gets_added_2("http://getsadded2/");
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL gets_deleted_1("http://getsdeleted2/");
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL gets_moved_1("http://getsmoved1/");
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<MostVisitedURL> old_list;
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&old_list, stays_the_same);  // 0  (unchanged)
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&old_list, gets_deleted_1);  // 1  (deleted)
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&old_list, gets_moved_1);    // 2  (moved to 3)
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<MostVisitedURL> new_list;
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&new_list, stays_the_same);  // 0  (unchanged)
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&new_list, gets_added_1);    // 1  (added)
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&new_list, gets_added_2);    // 2  (added)
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&new_list, gets_moved_1);    // 3  (moved from 2)
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  history::TopSitesDelta delta;
458513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  history::TopSites::DiffMostVisited(old_list, new_list, &delta);
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
460513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(2u, delta.added.size());
461513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(gets_added_1 == delta.added[0].url.url);
462513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(1, delta.added[0].rank);
463513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(gets_added_2 == delta.added[1].url.url);
464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(2, delta.added[1].rank);
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
466513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(1u, delta.deleted.size());
467513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(gets_deleted_1 == delta.deleted[0].url);
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
469513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(1u, delta.moved.size());
470513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(gets_moved_1 == delta.moved[0].url.url);
471513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(3, delta.moved[0].rank);
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
474513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests SetPageThumbnail.
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, SetPageThumbnail) {
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1a("http://google.com/");
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1b("http://www.google.com/");
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url2("http://images.google.com/");
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL invalid_url("chrome://favicon/http://google.com/");
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<MostVisitedURL> list;
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppendMostVisitedURL(&list, url2);
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL mv;
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.url = url1b;
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(url1a);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(url1b);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  list.push_back(mv);
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Save our most visited data containing that one site.
491513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(list);
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a dummy thumbnail.
494513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap thumbnail(CreateBitmap(SK_ColorWHITE));
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time now = base::Time::Now();
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ThumbnailScore low_score(1.0, true, true, now);
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ThumbnailScore medium_score(0.5, true, true, now);
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ThumbnailScore high_score(0.0, true, true, now);
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Setting the thumbnail for invalid pages should fail.
502513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url,
503513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             thumbnail, medium_score));
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Setting the thumbnail for url2 should succeed, lower scores shouldn't
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // replace it, higher scores should.
507513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, medium_score));
508513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->SetPageThumbnail(url2, thumbnail, low_score));
509513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, high_score));
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set on the redirect source should succeed. It should be replacable by
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the same score on the redirect destination, which in turn should not
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be replaced by the source again.
514513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score));
515513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1b, thumbnail, medium_score));
516513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score));
517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
518513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
519513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure a thumbnail is correctly removed when the page is removed.
520513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(TopSitesTest, ThumbnailRemoved) {
521513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL url("http://google.com/");
522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Configure top sites with 'google.com'.
524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::vector<MostVisitedURL> list;
525513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AppendMostVisitedURL(&list, url);
526513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(list);
527513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
528513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Create a dummy thumbnail.
529513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap thumbnail(CreateBitmap(SK_ColorRED));
530513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
531513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::Time now = base::Time::Now();
532513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ThumbnailScore low_score(1.0, true, true, now);
533513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ThumbnailScore medium_score(0.5, true, true, now);
534513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ThumbnailScore high_score(0.0, true, true, now);
535513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
536513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Set the thumbnail.
537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(url, thumbnail, medium_score));
538513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
539513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make sure the thumbnail was actually set.
540513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<RefCountedBytes> result;
541513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->GetPageThumbnail(url, &result));
542513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get()));
543513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
544513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Reset the thumbnails and make sure we don't get it back.
545513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(MostVisitedURLList());
546513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->GetPageThumbnail(url, &result));
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
549513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests GetPageThumbnail.
5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, GetPageThumbnail) {
5513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MostVisitedURLList url_list;
552513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURL url1;
553513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url1.url = GURL("http://asdf.com");
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url1.redirects.push_back(url1.url);
5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url_list.push_back(url1);
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
557513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURL url2;
558513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url2.url = GURL("http://gmail.com");
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url2.redirects.push_back(url2.url);
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url2.redirects.push_back(GURL("http://mail.google.com"));
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url_list.push_back(url2);
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
563513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(url_list);
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create a dummy thumbnail.
566513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap thumbnail(CreateBitmap(SK_ColorWHITE));
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ThumbnailScore score(0.5, true, true, base::Time::Now());
5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
569513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<RefCountedBytes> result;
570513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1.url, thumbnail, score));
571513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->GetPageThumbnail(url1.url, &result));
5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
573513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://gmail.com"),
5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           thumbnail, score));
575513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://gmail.com"),
576513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            &result));
5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Get a thumbnail via a redirect.
578513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://mail.google.com"),
579513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            &result));
5803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
581513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://mail.google.com"),
5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           thumbnail, score));
583513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->GetPageThumbnail(url2.url, &result));
5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
585513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get()));
5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
588513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests GetMostVisitedURLs.
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, GetMostVisited) {
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL news("http://news.google.com/");
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google("http://google.com/");
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
593513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(news);
594513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(google);
595513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
596513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  StartQueryForMostVisited();
597513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
598513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
599513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier;
600513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier.QueryTopSites(top_sites(), false);
601513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
602513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(1, querier.number_of_callbacks());
603513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // 2 extra prepopulated URLs.
605513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
606513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(news, querier.urls()[0].url);
607513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(google, querier.urls()[1].url);
608513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
611513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure changes done to top sites get mirrored to the db.
612513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(TopSitesTest, SaveToDB) {
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL url;
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL asdf_url("http://asdf.com");
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 asdf_title(ASCIIToUTF16("ASDF"));
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google_url("http://google.com");
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 google_title(ASCIIToUTF16("Google"));
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL news_url("http://news.google.com");
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 news_title(ASCIIToUTF16("Google News"));
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
621513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Add asdf_url to history.
622513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(asdf_url, asdf_title);
623513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
624513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make TopSites reread from the db.
625513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  StartQueryForMostVisited();
626513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
628513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Add a thumbnail.
629513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap tmp_bitmap(CreateBitmap(SK_ColorBLUE));
630513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(top_sites()->SetPageThumbnail(asdf_url, tmp_bitmap,
631513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            ThumbnailScore()));
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
633513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RecreateTopSitesAndBlock();
634513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
635513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
636513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
637513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
638513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
639513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_url, querier.urls()[0].url);
640513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_title, querier.urls()[0].title);
641513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
642513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
643513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> read_data;
644513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, &read_data));
645513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(ThumbnailEqualsBytes(tmp_bitmap, read_data.get()));
646513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL url2;
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.url = google_url;
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.title = google_title;
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.redirects.push_back(url2.url);
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
653513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(url2.url, url2.title);
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
655513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Add new thumbnail at rank 0 and shift the other result to 1.
656513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(top_sites()->SetPageThumbnail(google_url,
657513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            tmp_bitmap,
658513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            ThumbnailScore()));
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
660513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make TopSites reread from the db.
661513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
663513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
664513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
665513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
666513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
667513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_url, querier.urls()[0].url);
668513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_title, querier.urls()[0].title);
669513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(google_url, querier.urls()[1].url);
670513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(google_title, querier.urls()[1].title);
671513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
672513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
675513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// More permutations of saving to db.
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, RealDatabase) {
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL url;
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL asdf_url("http://asdf.com");
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 asdf_title(ASCIIToUTF16("ASDF"));
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google1_url("http://google.com");
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google2_url("http://google.com/redirect");
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google3_url("http://www.google.com");
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 google_title(ASCIIToUTF16("Google"));
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL news_url("http://news.google.com");
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 news_title(ASCIIToUTF16("Google News"));
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.url = asdf_url;
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.title = asdf_title;
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.redirects.push_back(url.url);
690513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap asdf_thumbnail(CreateBitmap(SK_ColorRED));
691513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(top_sites()->SetPageThumbnail(
692513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                  asdf_url, asdf_thumbnail, ThumbnailScore()));
693513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
694513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::Time add_time(base::Time::Now());
695513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(url.url, url.title, url.redirects, add_time);
696513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
697513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
698513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
699513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
700513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
701513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
702513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
703513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
704513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_url, querier.urls()[0].url);
705513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_title, querier.urls()[0].title);
706513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
707513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
708513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> read_data;
709513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, &read_data));
710513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(ThumbnailEqualsBytes(asdf_thumbnail, read_data.get()));
711513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL url2;
714513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url2.url = google3_url;
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.title = google_title;
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.redirects.push_back(google1_url);
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.redirects.push_back(google2_url);
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url2.redirects.push_back(google3_url);
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
720513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(google3_url, url2.title, url2.redirects,
721513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                   add_time - base::TimeDelta::FromMinutes(1));
722513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Add google twice so that it becomes the first visited site.
723513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(google3_url, url2.title, url2.redirects,
724513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                   add_time - base::TimeDelta::FromMinutes(2));
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
726513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap google_thumbnail(CreateBitmap(SK_ColorBLUE));
727513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(top_sites()->SetPageThumbnail(
728513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                  url2.url, google_thumbnail, ThumbnailScore()));
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
730513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
732513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
733513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> read_data;
734513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
735513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
736513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
737513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
738513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(google1_url, querier.urls()[0].url);
739513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(google_title, querier.urls()[0].title);
740513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(3u, querier.urls()[0].redirects.size());
741513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, &read_data));
742513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(ThumbnailEqualsBytes(google_thumbnail, read_data.get()));
743513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
744513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_url, querier.urls()[1].url);
745513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(asdf_title, querier.urls()[1].title);
746513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
747513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap weewar_bitmap(CreateBitmap(SK_ColorYELLOW));
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
751513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  base::Time thumbnail_time(base::Time::Now());
752513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ThumbnailScore low_score(1.0, true, true, thumbnail_time);
753513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ThumbnailScore medium_score(0.5, true, true, thumbnail_time);
754513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ThumbnailScore high_score(0.0, true, true, thumbnail_time);
755513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
756513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // 1. Set to weewar. (Writes the thumbnail to the DB.)
757513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(google3_url,
758513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            weewar_bitmap,
759513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            medium_score));
760513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
761513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
762513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> read_data;
763513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, &read_data));
764513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get()));
765513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
766513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
767513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap google_bitmap(CreateBitmap(SK_ColorGREEN));
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 2. Set to google - low score.
770513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->SetPageThumbnail(google3_url,
771513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             google_bitmap,
772513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             low_score));
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 3. Set to google - high score.
775513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(google1_url,
776513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            google_bitmap,
777513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            high_score));
778513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check that the thumbnail was updated.
780513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
781513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
782513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<RefCountedBytes> read_data;
783513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, &read_data));
784513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_FALSE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get()));
785513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_TRUE(ThumbnailEqualsBytes(google_bitmap, read_data.get()));
786513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, DeleteNotifications) {
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google1_url("http://google.com");
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google2_url("http://google.com/redirect");
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL google3_url("http://www.google.com");
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 google_title(ASCIIToUTF16("Google"));
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL news_url("http://news.google.com");
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 news_title(ASCIIToUTF16("Google News"));
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
797513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(google1_url, google_title);
798513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(news_url, news_title);
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
800513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
802513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
803513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
804513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
806513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(4u, querier.urls().size());
807513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
809513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DeleteURL(news_url);
810513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
811513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Wait for history to process the deletion.
812513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
813513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
814513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
815513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
816513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
817513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
818513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
819513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(google_title, querier.urls()[0].title);
820513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
821513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
822513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
823513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now reload. This verifies topsites actually wrote the deletion to disk.
824513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
825513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
826513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
827513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
828513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
829513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
830513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
831513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(google_title, querier.urls()[0].title);
832513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
833513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
834513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
835513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DeleteURL(google1_url);
836513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
837513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Wait for history to process the deletion.
838513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
839513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
840513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
841513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
842513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
843513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
844513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
845513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
846513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
847513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
848513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now reload. This verifies topsites actually wrote the deletion to disk.
849513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
850513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
851513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
852513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
853513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
854513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
855513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
856513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
857513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
8583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8603345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, PinnedURLsDeleted) {
8613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL google1_url("http://google.com");
8623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL google2_url("http://google.com/redirect");
8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL google3_url("http://www.google.com");
8643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 google_title(ASCIIToUTF16("Google"));
8653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL news_url("http://news.google.com");
8663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 news_title(ASCIIToUTF16("Google News"));
8673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
868513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(google1_url, google_title);
869513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddPageToHistory(news_url, news_title);
870513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
871513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RefreshTopSitesAndRecreate();
8723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
873513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
874513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
875513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
877513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // 2 extra prepopulated URLs.
878513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(4u, querier.urls().size());
879513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
8803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
881513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddPinnedURL(news_url, 3);
882513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->IsURLPinned(news_url));
883513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
884513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DeleteURL(news_url);
885513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
886513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
887513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
888513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
889513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
890513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
891513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // 2 extra prepopulated URLs.
892513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(3u, querier.urls().size());
893513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_FALSE(top_sites()->IsURLPinned(news_url));
894513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
895513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
896513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  history_service()->ExpireHistoryBetween(
897513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      std::set<GURL>(), base::Time(), base::Time(),
898513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      consumer(), NewCallback(static_cast<TopSitesTest*>(this),
899513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                              &TopSitesTest::EmptyCallback)),
900513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
901513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
902513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
903513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier querier;
904513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    querier.QueryTopSites(top_sites(), false);
905513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
906513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // 2 extra prepopulated URLs.
907513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
908513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_FALSE(top_sites()->IsURLPinned(google1_url));
909513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
910513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
913513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure GetUpdateDelay is updated appropriately.
914c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, GetUpdateDelay) {
915513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetLastNumUrlsChanged(0);
916513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(30, GetUpdateDelay().InSeconds());
917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
918513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURLList url_list;
919513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_list.resize(20);
920513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL tmp_url(GURL("http://x"));
921513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (size_t i = 0; i < url_list.size(); ++i) {
922513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    url_list[i].url = tmp_url;
923513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    url_list[i].redirects.push_back(tmp_url);
924513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
925513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(url_list);
926513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(20u, last_num_urls_changed());
927513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetLastNumUrlsChanged(0);
928513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(60, GetUpdateDelay().InMinutes());
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
930513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetLastNumUrlsChanged(3);
931513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(52, GetUpdateDelay().InMinutes());
932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
933513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetLastNumUrlsChanged(20);
934513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, GetUpdateDelay().InMinutes());
935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
937513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(TopSitesMigrationTest, Migrate) {
938513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(IsTopSitesLoaded());
939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
940513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make sure the data was migrated to top sites.
941513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(MigrationAssertions());
942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
943513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We need to wait for top sites and history to finish processing requests.
944513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForTopSites();
945513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForHistory();
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
947513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make sure there is no longer a Thumbnails file on disk.
948513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_FALSE(file_util::PathExists(
949513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                   profile()->GetPath().Append(chrome::kThumbnailsFilename)));
950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
951513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreate top sites and make sure everything is still there.
952513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->CreateHistoryService(false, false);
953513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RecreateTopSitesAndBlock();
954513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
955513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(MigrationAssertions());
956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
958513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Verifies that callbacks are notified correctly if requested before top sites
959513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// has loaded.
960513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(TopSitesTest, NotifyCallbacksWhenLoaded) {
961513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreate top sites. It won't be loaded now.
962513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->CreateTopSites();
963513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
964513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(IsTopSitesLoaded());
965513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
966513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier1;
967513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier2;
968513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier3;
969513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
970513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Starts the queries.
971513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier1.QueryTopSites(top_sites(), false);
972513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier2.QueryTopSites(top_sites(), false);
973513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier3.QueryTopSites(top_sites(), false);
974513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
975513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We shouldn't have gotten a callback.
976513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier1.number_of_callbacks());
977513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier2.number_of_callbacks());
978513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier3.number_of_callbacks());
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
980513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Wait for loading to complete.
981513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->BlockUntilTopSitesLoaded();
982513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
983513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now we should have gotten the callbacks.
984513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, querier1.number_of_callbacks());
985513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size());
986513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, querier2.number_of_callbacks());
987513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(GetPrepopulatePages().size(), querier2.urls().size());
988513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, querier3.number_of_callbacks());
989513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(GetPrepopulatePages().size(), querier3.urls().size());
990513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
991513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Reset the top sites.
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURLList pages;
993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL url;
994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.url = GURL("http://1.com/");
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.redirects.push_back(url.url);
996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pages.push_back(url);
997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.url = GURL("http://2.com/");
998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.redirects.push_back(url.url);
999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pages.push_back(url);
1000513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(pages);
1001513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1002513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreate top sites. It won't be loaded now.
1003513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->CreateTopSites();
1004513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1005513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(IsTopSitesLoaded());
1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1007513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier4;
1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1009513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Query again.
1010513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier4.QueryTopSites(top_sites(), false);
10113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1012513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We shouldn't have gotten a callback.
1013513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier4.number_of_callbacks());
1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1015513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Wait for loading to complete.
1016513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->BlockUntilTopSitesLoaded();
1017513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1018513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Now we should have gotten the callbacks.
1019513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, querier4.number_of_callbacks());
1020513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier4.urls().size());
1021513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1022513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ("http://1.com/", querier4.urls()[0].url.spec());
1023513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ("http://2.com/", querier4.urls()[1].url.spec());
1024513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier4, 2));
1025513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1026513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Reset the top sites again, this time don't reload.
1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.url = GURL("http://3.com/");
1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url.redirects.push_back(url.url);
1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pages.push_back(url);
1030513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(pages);
1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1032513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Query again.
1033513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier5;
1034513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier5.QueryTopSites(top_sites(), true);
1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1036513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, querier5.number_of_callbacks());
10373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1038513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_EQ(3u + GetPrepopulatePages().size(), querier5.urls().size());
1039513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ("http://1.com/", querier5.urls()[0].url.spec());
1040513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ("http://2.com/", querier5.urls()[1].url.spec());
1041513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ("http://3.com/", querier5.urls()[2].url.spec());
1042513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier5, 3));
1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1045513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure canceled requests are not notified.
1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, CancelingRequestsForTopSites) {
1047513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreate top sites. It won't be loaded now.
1048513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->CreateTopSites();
1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1050513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(IsTopSitesLoaded());
1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier1;
1053513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier querier2;
1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1055513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Starts the queries.
1056513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier1.QueryTopSites(top_sites(), false);
1057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier2.QueryTopSites(top_sites(), false);
1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We shouldn't have gotten a callback.
1060513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier1.number_of_callbacks());
1061513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier2.number_of_callbacks());
1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1063513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  querier2.CancelRequest();
1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1065513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Wait for loading to complete.
1066513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->BlockUntilTopSitesLoaded();
1067513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1068513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The first callback should succeed.
1069513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, querier1.number_of_callbacks());
1070513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size());
1071513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1072513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // And the canceled callback should not be notified.
1073513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, querier2.number_of_callbacks());
1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1076513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure temporary thumbnails are copied over correctly.
1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TopSitesTest, AddTemporaryThumbnail) {
1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL unknown_url("http://news.google.com/");
1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL invalid_url("chrome://thumb/http://google.com/");
1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1a("http://google.com/");
1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url1b("http://www.google.com/");
1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a dummy thumbnail.
1084513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SkBitmap thumbnail(CreateBitmap(SK_ColorRED));
1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ThumbnailScore medium_score(0.5, true, true, base::Time::Now());
1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't store thumbnails for Javascript URLs.
1089513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url,
1090513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             thumbnail,
1091513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                             medium_score));
1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Store thumbnails for unknown (but valid) URLs temporarily - calls
1093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // AddTemporaryThumbnail.
1094513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->SetPageThumbnail(unknown_url,
1095513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            thumbnail,
1096513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                            medium_score));
1097513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1098513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We shouldn't get the thumnail back though (the url isn't in to sites yet).
1099513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<RefCountedBytes> out;
1100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->GetPageThumbnail(unknown_url, &out));
1101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // But we should be able to get the temporary page thumbnail score.
1102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ThumbnailScore out_score;
1103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(top_sites()->GetTemporaryPageThumbnailScore(unknown_url,
1104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                          &out_score));
1105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(medium_score.Equals(out_score));
1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<MostVisitedURL> list;
1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MostVisitedURL mv;
1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.url = unknown_url;
1111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(mv.url);
1112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(url1a);
1113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mv.redirects.push_back(url1b);
1114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  list.push_back(mv);
1115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Update URLs. This should result in using thumbnail.
1117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(list);
1118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_TRUE(top_sites()->GetPageThumbnail(unknown_url, &out));
1120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, out.get()));
1121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests variations of blacklisting.
11243345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, Blacklisting) {
11253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MostVisitedURLList pages;
11263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MostVisitedURL url, url1;
11273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url.url = GURL("http://bbc.com/");
11283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url.redirects.push_back(url.url);
11293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pages.push_back(url);
11303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url1.url = GURL("http://google.com/");
11313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url1.redirects.push_back(url1.url);
11323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pages.push_back(url1);
11333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(pages);
1135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/")));
1136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Blacklist google.com.
1138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddBlacklistedURL(GURL("http://google.com/"));
1139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL prepopulate_url = GetPrepopulatePages()[0].url;
1141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
1143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->IsBlacklisted(GURL("http://google.com/")));
1144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/")));
1145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsBlacklisted(prepopulate_url));
1146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make sure the blacklisted site isn't returned in the results.
11483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
1149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size());
1152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
11543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
11553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreate top sites and make sure blacklisted url was correctly read.
1157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RecreateTopSitesAndBlock();
1158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size());
1162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
1164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
11653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Blacklist one of the prepopulate urls.
1167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddBlacklistedURL(prepopulate_url);
1168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
11693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make sure the blacklisted prepopulate url isn't returned.
11713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
1172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(1u + GetPrepopulatePages().size() - 1, q.urls().size());
1175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    for (size_t i = 1; i < q.urls().size(); ++i)
1177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      EXPECT_NE(prepopulate_url.spec(), q.urls()[i].url.spec());
11783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
11793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Mark google as no longer blacklisted.
1181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->RemoveBlacklistedURL(GURL("http://google.com/"));
1182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
1183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://google.com/")));
1184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Make sure google is returned now.
11863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
1187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size() - 1, q.urls().size());
1190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
1192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_NE(prepopulate_url.spec(), q.urls()[2].url.spec());
11933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
11943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Remove all blacklisted sites.
1196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->ClearBlacklistedURLs();
1197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->HasBlacklistedItems());
1198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size(), q.urls().size());
1203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
1205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 2));
1206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
12073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
12083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests variations of pinning/unpinning urls.
12103345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, PinnedURLs) {
12113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MostVisitedURLList pages;
12123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MostVisitedURL url, url1;
12133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url.url = GURL("http://bbc.com/");
12143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url.redirects.push_back(url.url);
12153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pages.push_back(url);
12163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url1.url = GURL("http://google.com/");
12173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  url1.redirects.push_back(url1.url);
12183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pages.push_back(url1);
12193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SetTopSites(pages);
1221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsURLPinned(GURL("http://bbc.com/")));
1223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size(), q.urls().size());
1228513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
1230513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 2));
1231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1233513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddPinnedURL(GURL("http://google.com/"), 3);
1234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsURLPinned(GURL("http://bbc.com/")));
1235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsURLPinned(GetPrepopulatePages()[0].url));
1236513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1237513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1238513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(4u, q.urls().size());
1241513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
1243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[3].url.spec());
1244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->RemovePinnedURL(GURL("http://google.com/"));
1247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(top_sites()->IsURLPinned(GURL("http://google.com/")));
1248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1250513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1251513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(2u + GetPrepopulatePages().size(), q.urls().size());
1253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
1254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
1255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 2));
1256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL prepopulate_url = GetPrepopulatePages()[0].url;
1259513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddPinnedURL(GURL("http://bbc.com"), 1);
1260513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddPinnedURL(prepopulate_url, 0);
1261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(3u + GetPrepopulatePages().size() - 1, q.urls().size());
1266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(prepopulate_url, q.urls()[0].url);
1267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[1].url.spec());
1268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[2].url.spec());
1269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (GetPrepopulatePages().size() > 1)
1270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      EXPECT_EQ(GetPrepopulatePages()[1].url, q.urls()[3].url);
1271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1272513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Recreate and make sure state remains the same.
1274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  RecreateTopSitesAndBlock();
1275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_EQ(3u + GetPrepopulatePages().size() - 1, q.urls().size());
1280513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(prepopulate_url, q.urls()[0].url);
1281513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://bbc.com/", q.urls()[1].url.spec());
1282513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ("http://google.com/", q.urls()[2].url.spec());
1283513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (GetPrepopulatePages().size() > 1)
1284513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      EXPECT_EQ(GetPrepopulatePages()[1].url, q.urls()[3].url);
1285513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
12863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
12873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1288513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Tests blacklisting and pinning.
12893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, BlacklistingAndPinnedURLs) {
1290513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURLList prepopulate_urls = GetPrepopulatePages();
1291513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (prepopulate_urls.size() < 2)
1292513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
1293513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddPinnedURL(prepopulate_urls[0].url, 1);
1295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  top_sites()->AddBlacklistedURL(prepopulate_urls[1].url);
12963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
1298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TopSitesQuerier q;
1299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    q.QueryTopSites(top_sites(), true);
1300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ASSERT_LE(2u, q.urls().size());
1302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(GURL(), q.urls()[0].url);
1303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(prepopulate_urls[0].url, q.urls()[1].url);
1304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
13053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
13063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1307513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure prepopulated pages exist.
13083345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(TopSitesTest, AddPrepopulatedPages) {
1309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  TopSitesQuerier q;
1310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  q.QueryTopSites(top_sites(), true);
1311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(GetPrepopulatePages().size(), q.urls().size());
1312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0));
13133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  MostVisitedURLList pages = q.urls();
1315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(AddPrepopulatedPages(&pages));
13163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(GetPrepopulatePages().size(), pages.size());
1318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  q.set_urls(pages);
1319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0));
1320513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
13213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Makes sure creating top sites before history is created works.
1323513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST_F(TopSitesTest, CreateTopSitesThenHistory) {
1324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->DestroyTopSites();
1325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->DestroyHistoryService();
1326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Remove the TopSites file. This forces TopSites to wait until history loads
1328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // before TopSites is considered loaded.
1329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  file_util::Delete(profile()->GetPath().Append(chrome::kTopSitesFilename),
1330513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    false);
1331513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1332513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Create TopSites, but not History.
1333513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->CreateTopSites();
1334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  WaitForTopSites();
1335513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_FALSE(IsTopSitesLoaded());
1336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1337513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Load history, which should make TopSites finish loading too.
1338513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->CreateHistoryService(false, false);
1339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile()->BlockUntilTopSitesLoaded();
1340513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_TRUE(IsTopSitesLoaded());
13413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
13423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace history
1344