15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/message_loop/message_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task/cancelable_task_tracker.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_unittest_base.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_cache.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/top_sites_impl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by WaitForHistory, see it for details.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitForHistoryTask : public HistoryDBTask {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistoryTask() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool RunOnDBThread(HistoryBackend* backend,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             HistoryDatabase* db) OVERRIDE {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DoneRunOnMainThread() OVERRIDE {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WaitForHistoryTask() {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WaitForHistoryTask);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for querying top sites. Either runs sequentially, or runs a nested
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nested message loop until the response is complete. The later is used when
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TopSites is queried before it finishes loading.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TopSitesQuerier {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier()
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : weak_ptr_factory_(this),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        number_of_callbacks_(0),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        waiting_(false) {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queries top sites. If |wait| is true a nested message loop is run until the
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback is notified.
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void QueryTopSites(TopSitesImpl* top_sites, bool wait) {
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    QueryAllTopSites(top_sites, wait, false);
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Queries top sites, including potentially forced URLs if
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |include_forced_urls| is true.
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void QueryAllTopSites(TopSitesImpl* top_sites,
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        bool wait,
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        bool include_forced_urls) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int start_number_of_callbacks = number_of_callbacks_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites->GetMostVisitedURLs(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TopSitesQuerier::OnTopSitesAvailable,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()),
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        include_forced_urls);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wait && start_number_of_callbacks == number_of_callbacks_) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelRequest() {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    weak_ptr_factory_.InvalidateWeakPtrs();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_urls(const MostVisitedURLList& urls) { urls_ = urls; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MostVisitedURLList& urls() const { return urls_; }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int number_of_callbacks() const { return number_of_callbacks_; }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback for TopSitesImpl::GetMostVisitedURLs.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnTopSitesAvailable(const history::MostVisitedURLList& data) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urls_ = data;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number_of_callbacks_++;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_) {
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Quit();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<TopSitesQuerier> weak_ptr_factory_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList urls_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int number_of_callbacks_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TopSitesQuerier);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the data from |t1| into a SkBitmap. This is intended for usage of
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thumbnail data, which is stored as jpgs.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap ExtractThumbnail(const base::RefCountedMemory& t1) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SkBitmap> image(gfx::JPEGCodec::Decode(t1.front(),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    t1.size()));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image.get() ? *image : SkBitmap();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if t1 and t2 contain the same data.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ThumbnailsAreEqual(base::RefCountedMemory* t1,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::RefCountedMemory* t2) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!t1 || !t2)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (t1->size() != t2->size())
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !memcmp(t1->front(), t2->front(), t1->size());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesImplTest : public HistoryUnitTestBase {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TopSitesImplTest()
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB, &message_loop_) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (CreateHistoryAndTopSites()) {
142bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      ASSERT_TRUE(profile_->CreateHistoryService(false, false));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->CreateTopSites();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->BlockUntilTopSitesLoaded();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if history and top sites should be created in SetUp.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CreateHistoryAndTopSites() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the thumbnail for |url| from TopSites.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap GetThumbnail(const GURL& url) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> data;
160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return top_sites()->GetPageThumbnail(url, false, &data) ?
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExtractThumbnail(*data.get()) : SkBitmap();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a bitmap of the specified color. Caller takes ownership.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image CreateBitmap(SkColor color) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap thumbnail;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thumbnail.setConfig(SkBitmap::kARGB_8888_Config, 4, 4);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thumbnail.allocPixels();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thumbnail.eraseColor(color);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Image::CreateFrom1xBitmap(thumbnail);  // adds ref.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces top sites to load top sites from history, then recreates top sites.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreating top sites makes sure the changes from history are saved and
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded from the db.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RefreshTopSitesAndRecreate() {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartQueryForMostVisited();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitForHistory();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecreateTopSitesAndBlock();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blocks the caller until history processes a task. This is useful if you
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to wait until you know history has processed a task.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForHistory() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->ScheduleDBTask(new WaitForHistoryTask(), &consumer_);
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for top sites to finish processing a task. This is useful if you need
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to wait until top sites finishes processing a task.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForTopSites() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->backend_->DoEmptyRequest(
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&TopSitesImplTest::QuitCallback, base::Unretained(this)),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &cancelable_task_tracker_);
19590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TopSitesImpl* top_sites() {
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return static_cast<TopSitesImpl*>(profile_->GetTopSites());
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelableRequestConsumer* consumer() { return &consumer_; }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile() {return profile_.get();}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history_service() {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HistoryServiceFactory::GetForProfile(profile_.get(),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                Profile::EXPLICIT_ACCESS);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList GetPrepopulatePages() {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->GetPrepopulatePages();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the TopSitesQuerier contains the prepopulate data starting
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at |start_index|.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ContainsPrepopulatePages(const TopSitesQuerier& querier,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                size_t start_index) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MostVisitedURLList prepopulate_urls = GetPrepopulatePages();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(start_index + prepopulate_urls.size(), querier.urls().size());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < prepopulate_urls.size(); ++i) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(prepopulate_urls[i].url.spec(),
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                querier.urls()[start_index + i].url.spec()) << " @ index " <<
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for callbacks from history.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EmptyCallback() {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quit the current message loop when invoked. Useful when running a nested
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QuitCallback() {
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a page to history.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPageToHistory(const GURL& url) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RedirectList redirects;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirects.push_back(url);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->AddPage(
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        url, base::Time::Now(), static_cast<ContextID>(this), 0, GURL(),
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a page to history.
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void AddPageToHistory(const GURL& url, const base::string16& title) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RedirectList redirects;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirects.push_back(url);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->AddPage(
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        url, base::Time::Now(), static_cast<ContextID>(this), 0, GURL(),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->SetPageTitle(url, title);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a page to history.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPageToHistory(const GURL& url,
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const base::string16& title,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const history::RedirectList& redirects,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::Time time) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->AddPage(
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        url, time, static_cast<ContextID>(this), 0, GURL(),
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->SetPageTitle(url, title);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delets a url.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteURL(const GURL& url) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->DeleteURL(url);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the thumbnail equals the specified bytes.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ThumbnailEqualsBytes(const gfx::Image& image,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::RefCountedMemory* bytes) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedBytes> encoded_image;
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TopSitesImpl::EncodeBitmap(image, &encoded_image);
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ThumbnailsAreEqual(encoded_image.get(), bytes);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreates top sites. This forces top sites to reread from the db.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RecreateTopSitesAndBlock() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Recreate TopSites and wait for it to load.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile()->CreateTopSites();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // As history already loaded we have to fake this call.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile()->BlockUntilTopSitesLoaded();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrappers that allow private TopSites functions to be called from the
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // individual tests without making them all be friends.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetCanonicalURL(const GURL& url) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->cache_->GetCanonicalURL(url);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTopSites(const MostVisitedURLList& new_top_sites) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->SetTopSites(new_top_sites);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool AddForcedURL(const GURL& url, base::Time time) {
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return top_sites()->AddForcedURL(url, time);
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartQueryForMostVisited() {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->StartQueryForMostVisited();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLastNumUrlsChanged(size_t value) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->last_num_urls_changed_ = value;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t last_num_urls_changed() { return top_sites()->last_num_urls_changed_; }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta GetUpdateDelay() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->GetUpdateDelay();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTopSitesLoaded() { return top_sites()->loaded_; }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddPrepopulatedPages(MostVisitedURLList* urls) {
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return top_sites()->AddPrepopulatedPages(urls, 0u);
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void EmptyThreadSafeCache() {
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::AutoLock lock(top_sites()->lock_);
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    MostVisitedURLList empty;
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    top_sites()->thread_safe_cache_->SetTopSites(empty);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To cancel HistoryService tasks.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelableRequestConsumer consumer_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To cancel TopSitesBackend tasks.
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::CancelableTaskTracker cancelable_task_tracker_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TopSitesImplTest);
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};  // Class TopSitesImplTest
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for appending a URL to a vector of "most visited" URLs,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using the default values for everything but the URL.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AppendMostVisitedURL(std::vector<MostVisitedURL>* list,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& url) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = url;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->push_back(mv);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Helper function for appending a URL to a vector of "most visited" URLs,
355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// using the default values for everything but the URL.
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void AppendForcedMostVisitedURL(std::vector<MostVisitedURL>* list,
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       const GURL& url,
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       double last_forced_time) {
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURL mv;
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mv.url = url;
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mv.last_forced_time = base::Time::FromJsTime(last_forced_time);
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mv.redirects.push_back(url);
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  list->push_back(mv);
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as AppendMostVisitedURL except that it adds a redirect from the first
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL to the second.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AppendMostVisitedURLWithRedirect(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<MostVisitedURL>* list,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& redirect_source, const GURL& redirect_dest) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = redirect_dest;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(redirect_source);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(redirect_dest);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->push_back(mv);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetCanonicalURL.
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetCanonicalURL) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have two chains:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   google.com -> www.google.com
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   news.google.com (no redirects)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news("http://news.google.com/");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL source("http://google.com/");
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL dest("http://www.google.com/");
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> most_visited;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURLWithRedirect(&most_visited, source, dest);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&most_visited, news);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(most_visited);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Random URLs not in the database are returned unchanged.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL result = GetCanonicalURL(GURL("http://fark.com/"));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("http://fark.com/"), result);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Easy case, there are no redirects and the exact URL is stored.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = GetCanonicalURL(news);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(news, result);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL in question is the source URL in a redirect list.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = GetCanonicalURL(source);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dest, result);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL in question is the destination of a redirect.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = GetCanonicalURL(dest);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dest, result);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests DiffMostVisited.
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, DiffMostVisited) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL stays_the_same("http://staysthesame/");
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_added_1("http://getsadded1/");
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_added_2("http://getsadded2/");
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL gets_deleted_1("http://getsdeleted1/");
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_moved_1("http://getsmoved1/");
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> old_list;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&old_list, stays_the_same);  // 0  (unchanged)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&old_list, gets_deleted_1);  // 1  (deleted)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&old_list, gets_moved_1);    // 2  (moved to 3)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> new_list;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, stays_the_same);  // 0  (unchanged)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_added_1);    // 1  (added)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_added_2);    // 2  (added)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_moved_1);    // 3  (moved from 2)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TopSitesDelta delta;
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, delta.added.size());
432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_added_1 == delta.added[0].url.url);
433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, delta.added[0].rank);
434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_added_2 == delta.added[1].url.url);
435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, delta.added[1].rank);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, delta.deleted.size());
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_deleted_1 == delta.deleted[0].url);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, delta.moved.size());
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_moved_1 == delta.moved[0].url.url);
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3, delta.moved[0].rank);
443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests DiffMostVisited with forced URLs.
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(TopSitesImplTest, DiffMostVisitedWithForced) {
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Forced URLs.
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL stays_the_same_1("http://staysthesame1/");
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL new_last_forced_time("http://newlastforcedtime/");
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL stays_the_same_2("http://staysthesame2/");
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL move_to_nonforced("http://movetononforced/");
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL gets_added_1("http://getsadded1/");
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL gets_deleted_1("http://getsdeleted1/");
454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Non-forced URLs.
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL move_to_forced("http://movetoforced/");
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL stays_the_same_3("http://staysthesame3/");
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL gets_added_2("http://getsadded2/");
458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL gets_deleted_2("http://getsdeleted2/");
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL gets_moved_1("http://getsmoved1/");
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<MostVisitedURL> old_list;
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_list, stays_the_same_1, 1000);
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_list, new_last_forced_time, 2000);
464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_list, stays_the_same_2, 3000);
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_list, move_to_nonforced, 4000);
466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_list, gets_deleted_1, 5000);
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&old_list, move_to_forced);
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&old_list, stays_the_same_3);
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&old_list, gets_deleted_2);
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&old_list, gets_moved_1);
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<MostVisitedURL> new_list;
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_list, stays_the_same_1, 1000);
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_list, stays_the_same_2, 3000);
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_list, new_last_forced_time, 4000);
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_list, gets_added_1, 5000);
477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_list, move_to_forced, 6000);
478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&new_list, move_to_nonforced);
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&new_list, stays_the_same_3);
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_added_2);
481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_moved_1);
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  history::TopSitesDelta delta;
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta);
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(2u, delta.added.size());
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_added_1 == delta.added[0].url.url);
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(-1, delta.added[0].rank);
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_added_2 == delta.added[1].url.url);
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, delta.added[1].rank);
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(2u, delta.deleted.size());
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_deleted_1 == delta.deleted[0].url);
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(gets_deleted_2 == delta.deleted[1].url);
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3u, delta.moved.size());
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(new_last_forced_time == delta.moved[0].url.url);
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(-1, delta.moved[0].rank);
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(base::Time::FromJsTime(4000), delta.moved[0].url.last_forced_time);
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(move_to_forced == delta.moved[1].url.url);
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(-1, delta.moved[1].rank);
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(base::Time::FromJsTime(6000), delta.moved[1].url.last_forced_time);
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(move_to_nonforced == delta.moved[2].url.url);
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, delta.moved[2].rank);
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(delta.moved[2].url.last_forced_time.is_null());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests SetPageThumbnail.
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, SetPageThumbnail) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1a("http://google.com/");
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1b("http://www.google.com/");
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2("http://images.google.com/");
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL invalid_url("chrome://favicon/http://google.com/");
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> list;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&list, url2);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = url1b;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1a);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1b);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back(mv);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save our most visited data containing that one site.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(list);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorWHITE));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time now = base::Time::Now();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore low_score(1.0, true, true, now);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, now);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore high_score(0.0, true, true, now);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting the thumbnail for invalid pages should fail.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             thumbnail, medium_score));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting the thumbnail for url2 should succeed, lower scores shouldn't
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // replace it, higher scores should.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, medium_score));
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(url2, thumbnail, low_score));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, high_score));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set on the redirect source should succeed. It should be replacable by
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the same score on the redirect destination, which in turn should not
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be replaced by the source again.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1b, thumbnail, medium_score));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score));
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a thumbnail is correctly removed when the page is removed.
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, ThumbnailRemoved) {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://google.com/");
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configure top sites with 'google.com'.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> list;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&list, url);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(list);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorRED));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time now = base::Time::Now();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore low_score(1.0, true, true, now);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, now);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore high_score(0.0, true, true, now);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the thumbnail.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url, thumbnail, medium_score));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the thumbnail was actually set.
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> result;
575d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(url, false, &result));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get()));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the thumbnails and make sure we don't get it back.
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(MostVisitedURLList());
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(top_sites()->GetPageThumbnail(url, false, &result));
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetPageThumbnail.
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetPageThumbnail) {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList url_list;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url1;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.url = GURL("http://asdf.com");
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.redirects.push_back(url1.url);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_list.push_back(url1);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url2;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.url = GURL("http://gmail.com");
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(url2.url);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(GURL("http://mail.google.com"));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_list.push_back(url2);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(url_list);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorWHITE));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore score(0.5, true, true, base::Time::Now());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> result;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1.url, thumbnail, score));
606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(url1.url, false, &result));
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://gmail.com"),
6091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                            thumbnail, score));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://gmail.com"),
611d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            false,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &result));
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a thumbnail via a redirect.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://mail.google.com"),
615d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            false,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &result));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://mail.google.com"),
6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                            thumbnail, score));
620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(url2.url, false, &result));
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get()));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetMostVisitedURLs.
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetMostVisited) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news("http://news.google.com/");
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google("http://google.com/");
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(news);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartQueryForMostVisited();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier.QueryTopSites(top_sites(), false);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, querier.number_of_callbacks());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2 extra prepopulated URLs.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(news, querier.urls()[0].url);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(google, querier.urls()[1].url);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure changes done to top sites get mirrored to the db.
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, SaveToDB) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL asdf_url("http://asdf.com");
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 asdf_title(base::ASCIIToUTF16("ASDF"));
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google_url("http://google.com");
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 google_title(base::ASCIIToUTF16("Google"));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news_url("http://news.google.com");
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 news_title(base::ASCIIToUTF16("Google News"));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add asdf_url to history.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(asdf_url, asdf_title);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make TopSites reread from the db.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartQueryForMostVisited();
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a thumbnail.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image tmp_bitmap(CreateBitmap(SK_ColorBLUE));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(asdf_url, tmp_bitmap,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ThumbnailScore()));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateTopSitesAndBlock();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[0].url);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[0].title);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
681d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, false, &read_data));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(tmp_bitmap, read_data.get()));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url2;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.url = google_url;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.title = google_title;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(url2.url);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(url2.url, url2.title);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add new thumbnail at rank 0 and shift the other result to 1.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(google_url,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            tmp_bitmap,
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ThumbnailScore()));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make TopSites reread from the db.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[0].url);
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[0].title);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_url, querier.urls()[1].url);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[1].title);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Makes sure forced URLs in top sites get mirrored to the db.
713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(TopSitesImplTest, SaveForcedToDB) {
714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURL url;
715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL asdf_url("http://asdf.com");
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 asdf_title(base::ASCIIToUTF16("ASDF"));
717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL google_url("http://google.com");
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 google_title(base::ASCIIToUTF16("Google"));
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL news_url("http://news.google.com");
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 news_title(base::ASCIIToUTF16("Google News"));
721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add a number of forced URLs.
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<MostVisitedURL> list;
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&list, GURL("http://forced1"), 1000);
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  list[0].title = base::ASCIIToUTF16("forced1");
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&list, GURL("http://forced2"), 2000);
727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&list, GURL("http://forced3"), 3000);
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&list, GURL("http://forced4"), 4000);
729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(list);
730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add a thumbnail.
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Image red_thumbnail(CreateBitmap(SK_ColorRED));
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  GURL("http://forced1"), red_thumbnail, ThumbnailScore()));
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Get the original thumbnail for later comparison. Some compression can
737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // happen in |top_sites| and we don't want to depend on that.
738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkBitmap orig_thumbnail = GetThumbnail(GURL("http://forced1"));
739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Force-flush the cache to ensure we don't reread from it inadvertently.
741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EmptyThreadSafeCache();
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make TopSites reread from the db.
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  StartQueryForMostVisited();
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WaitForHistory();
746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TopSitesQuerier querier;
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), true, true);
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(4u + GetPrepopulatePages().size(), querier.urls().size());
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GURL("http://forced1"), querier.urls()[0].url);
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("forced1"), querier.urls()[0].title);
753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkBitmap thumbnail = GetThumbnail(GURL("http://forced1"));
754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(orig_thumbnail.getSize(), thumbnail.getSize());
755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  orig_thumbnail.lockPixels();
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  thumbnail.lockPixels();
757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, memcmp(orig_thumbnail.getPixels(), thumbnail.getPixels(),
758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      orig_thumbnail.getSize()));
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  thumbnail.unlockPixels();
760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  orig_thumbnail.unlockPixels();
761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(base::Time::FromJsTime(1000), querier.urls()[0].last_forced_time);
762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GURL("http://forced2"), querier.urls()[1].url);
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(base::Time::FromJsTime(2000), querier.urls()[1].last_forced_time);
764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GURL("http://forced3"), querier.urls()[2].url);
765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(base::Time::FromJsTime(3000), querier.urls()[2].last_forced_time);
766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GURL("http://forced4"), querier.urls()[3].url);
767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(base::Time::FromJsTime(4000), querier.urls()[3].last_forced_time);
768f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 4));
770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// More permutations of saving to db.
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, RealDatabase) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL asdf_url("http://asdf.com");
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 asdf_title(base::ASCIIToUTF16("ASDF"));
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google1_url("http://google.com");
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google2_url("http://google.com/redirect");
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google3_url("http://www.google.com");
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 google_title(base::ASCIIToUTF16("Google"));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news_url("http://news.google.com");
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 news_title(base::ASCIIToUTF16("Google News"));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = asdf_url;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.title = asdf_title;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image asdf_thumbnail(CreateBitmap(SK_ColorRED));
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  asdf_url, asdf_thumbnail, ThumbnailScore()));
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time add_time(base::Time::Now());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(url.url, url.title, url.redirects, add_time);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[0].url);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[0].title);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
806d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, false, &read_data));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(asdf_thumbnail, read_data.get()));
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url2;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.url = google3_url;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.title = google_title;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(google1_url);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(google2_url);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(google3_url);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google3_url, url2.title, url2.redirects,
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   add_time - base::TimeDelta::FromMinutes(1));
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add google twice so that it becomes the first visited site.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google3_url, url2.title, url2.redirects,
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   add_time - base::TimeDelta::FromMinutes(2));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image google_thumbnail(CreateBitmap(SK_ColorBLUE));
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  url2.url, google_thumbnail, ThumbnailScore()));
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google1_url, querier.urls()[0].url);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[0].title);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(3u, querier.urls()[0].redirects.size());
838d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, false, &read_data));
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(google_thumbnail, read_data.get()));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[1].url);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[1].title);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image weewar_bitmap(CreateBitmap(SK_ColorYELLOW));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time thumbnail_time(base::Time::Now());
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore low_score(1.0, true, true, thumbnail_time);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, thumbnail_time);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore high_score(0.0, true, true, thumbnail_time);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Set to weewar. (Writes the thumbnail to the DB.)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(google3_url,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            weewar_bitmap,
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            medium_score));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
860d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, false, &read_data));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get()));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image green_bitmap(CreateBitmap(SK_ColorGREEN));
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Set to google - low score.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(google3_url,
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             green_bitmap,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             low_score));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. Set to google - high score.
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(google1_url,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            green_bitmap,
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            high_score));
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the thumbnail was updated.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
880d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, false, &read_data));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get()));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(green_bitmap, read_data.get()));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, DeleteNotifications) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google1_url("http://google.com");
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google2_url("http://google.com/redirect");
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google3_url("http://www.google.com");
8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 google_title(base::ASCIIToUTF16("Google"));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news_url("http://news.google.com");
8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 news_title(base::ASCIIToUTF16("Google News"));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google1_url, google_title);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(news_url, news_title);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(GetPrepopulatePages().size() + 2, querier.urls().size());
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteURL(news_url);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for history to process the deletion.
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[0].title);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now reload. This verifies topsites actually wrote the deletion to disk.
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[0].title);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteURL(google1_url);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for history to process the deletion.
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now reload. This verifies topsites actually wrote the deletion to disk.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure GetUpdateDelay is updated appropriately.
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetUpdateDelay) {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(0);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(30, GetUpdateDelay().InSeconds());
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList url_list;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_list.resize(20);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL tmp_url(GURL("http://x"));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < url_list.size(); ++i) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_list[i].url = tmp_url;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_list[i].redirects.push_back(tmp_url);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(url_list);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20u, last_num_urls_changed());
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(0);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(60, GetUpdateDelay().InMinutes());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(3);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(52, GetUpdateDelay().InMinutes());
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(20);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetUpdateDelay().InMinutes());
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that callbacks are notified correctly if requested before top sites
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has loaded.
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, NotifyCallbacksWhenLoaded) {
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites. It won't be loaded now.
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->CreateTopSites();
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTopSitesLoaded());
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier1;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier2;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier3;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the queries.
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier1.QueryTopSites(top_sites(), false);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier2.QueryTopSites(top_sites(), false);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier3.QueryTopSites(top_sites(), false);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have gotten a callback.
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier1.number_of_callbacks());
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier2.number_of_callbacks());
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier3.number_of_callbacks());
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for loading to complete.
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->BlockUntilTopSitesLoaded();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we should have gotten the callbacks.
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier1.number_of_callbacks());
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size());
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier2.number_of_callbacks());
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier2.urls().size());
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier3.number_of_callbacks());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier3.urls().size());
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the top sites.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList pages;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://1.com/");
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://2.com/");
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(pages);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites. It won't be loaded now.
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->CreateTopSites();
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTopSitesLoaded());
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier4;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query again.
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier4.QueryTopSites(top_sites(), false);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have gotten a callback.
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier4.number_of_callbacks());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for loading to complete.
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->BlockUntilTopSitesLoaded();
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we should have gotten the callbacks.
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier4.number_of_callbacks());
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier4.urls().size());
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://1.com/", querier4.urls()[0].url.spec());
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://2.com/", querier4.urls()[1].url.spec());
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier4, 2));
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the top sites again, this time don't reload.
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://3.com/");
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(pages);
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query again.
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier5;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier5.QueryTopSites(top_sites(), true);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier5.number_of_callbacks());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u + GetPrepopulatePages().size(), querier5.urls().size());
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://1.com/", querier5.urls()[0].url.spec());
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://2.com/", querier5.urls()[1].url.spec());
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://3.com/", querier5.urls()[2].url.spec());
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier5, 3));
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure canceled requests are not notified.
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, CancelingRequestsForTopSites) {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites. It won't be loaded now.
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->CreateTopSites();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTopSitesLoaded());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier1;
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier2;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the queries.
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier1.QueryTopSites(top_sites(), false);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier2.QueryTopSites(top_sites(), false);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have gotten a callback.
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier1.number_of_callbacks());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier2.number_of_callbacks());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier2.CancelRequest();
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for loading to complete.
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->BlockUntilTopSitesLoaded();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first callback should succeed.
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier1.number_of_callbacks());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the canceled callback should not be notified.
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier2.number_of_callbacks());
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure temporary thumbnails are copied over correctly.
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, AddTemporaryThumbnail) {
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL unknown_url("http://news.google.com/");
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL invalid_url("chrome://thumb/http://google.com/");
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1a("http://google.com/");
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1b("http://www.google.com/");
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorRED));
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, base::Time::Now());
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't store thumbnails for Javascript URLs.
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url,
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             thumbnail,
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             medium_score));
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store thumbnails for unknown (but valid) URLs temporarily - calls
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddTemporaryThumbnail.
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(unknown_url,
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            thumbnail,
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            medium_score));
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't get the thumnail back though (the url isn't in to sites yet).
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> out;
1123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(top_sites()->GetPageThumbnail(unknown_url, false, &out));
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But we should be able to get the temporary page thumbnail score.
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore out_score;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->GetTemporaryPageThumbnailScore(unknown_url,
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          &out_score));
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(medium_score.Equals(out_score));
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> list;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = unknown_url;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(mv.url);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1a);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1b);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back(mv);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update URLs. This should result in using thumbnail.
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(list);
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(top_sites()->GetPageThumbnail(unknown_url, false, &out));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, out.get()));
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests variations of blacklisting.
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, Blacklisting) {
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList pages;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url, url1;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://bbc.com/");
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.url = GURL("http://google.com/");
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.redirects.push_back(url1.url);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url1);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(pages);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/")));
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist google.com.
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->AddBlacklistedURL(GURL("http://google.com/"));
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL prepopulate_url = GetPrepopulatePages()[0].url;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->IsBlacklisted(GURL("http://google.com/")));
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/")));
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(prepopulate_url));
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the blacklisted site isn't returned in the results.
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size());
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites and make sure blacklisted url was correctly read.
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateTopSitesAndBlock();
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size());
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist one of the prepopulate urls.
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->AddBlacklistedURL(prepopulate_url);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the blacklisted prepopulate url isn't returned.
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size() - 1, q.urls().size());
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 1; i < q.urls().size(); ++i)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(prepopulate_url.spec(), q.urls()[i].url.spec());
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark google as no longer blacklisted.
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->RemoveBlacklistedURL(GURL("http://google.com/"));
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://google.com/")));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure google is returned now.
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size() - 1, q.urls().size());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Android has only one prepopulated page which has been blacklisted, so
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // only 2 urls are returned.
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (q.urls().size() > 2)
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_NE(prepopulate_url.spec(), q.urls()[2].url.spec());
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1u, GetPrepopulatePages().size());
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove all blacklisted sites.
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->ClearBlacklistedURLs();
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->HasBlacklistedItems());
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size(), q.urls().size());
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 2));
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure prepopulated pages exist.
1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, AddPrepopulatedPages) {
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier q;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  q.QueryTopSites(top_sites(), true);
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), q.urls().size());
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0));
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList pages = q.urls();
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(AddPrepopulatedPages(&pages));
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), pages.size());
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  q.set_urls(pages);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0));
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Ensure calling SetTopSites with forced sites already in the DB works.
1253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This test both eviction and
1254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(TopSitesImplTest, SetForcedTopSites) {
1255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Create forced elements in old URL list.
1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURLList old_url_list;
1257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/0"), 1000);
1258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/1"), 4000);
1259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/2"), 7000);
1260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/3"), 10000);
1261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/4"), 11000);
1262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/5"), 12000);
1263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/6"), 13000);
1264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/7"), 18000);
1265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://oldforced/8"), 21000);
1266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t kNumOldForcedURLs = 9;
1267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Create forced elements in new URL list.
1269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURLList new_url_list;
1270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/0"), 2000);
1271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/1"), 3000);
1272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/2"), 5000);
1273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/3"), 6000);
1274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/4"), 8000);
1275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/5"), 9000);
1276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/6"), 14000);
1277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/7"), 15000);
1278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/8"), 16000);
1279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/9"), 17000);
1280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/10"), 19000);
1281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/11"), 20000);
1282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://newforced/12"), 22000);
1283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Setup a number non-forced URLs in both old and new list.
1285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t kNumNonForcedURLs = 20;  // Maximum number of non-forced URLs.
1286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < kNumNonForcedURLs; ++i) {
1287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::ostringstream url;
1288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    url << "http://oldnonforced/" << i;
1289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AppendMostVisitedURL(&old_url_list, GURL(url.str()));
1290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    url.str("");
1291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    url << "http://newnonforced/" << i;
1292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AppendMostVisitedURL(&new_url_list, GURL(url.str()));
1293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the initial list of URLs.
1296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(old_url_list);
1297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kNumOldForcedURLs + kNumNonForcedURLs, last_num_urls_changed());
1298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TopSitesQuerier querier;
1300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Query only non-forced URLs first.
1301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryTopSites(top_sites(), false);
1302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(kNumNonForcedURLs, querier.urls().size());
1303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check first URL.
1305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldnonforced/0", querier.urls()[0].url.spec());
1306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Query all URLs.
1308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kNumOldForcedURLs + kNumNonForcedURLs, querier.urls().size());
1310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check first URLs.
1312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/0", querier.urls()[0].url.spec());
1313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldnonforced/0",
1314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            querier.urls()[kNumOldForcedURLs].url.spec());
1315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the new list of URLs.
1317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(new_url_list);
1318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Query all URLs.
1320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We should have reached the maximum of 20 forced URLs.
1323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(20 + kNumNonForcedURLs, querier.urls().size());
1324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check forced URLs. They follow the order of timestamps above, smaller
1326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // timestamps since they were evicted.
1327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/1", querier.urls()[0].url.spec());
1328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3000, querier.urls()[0].last_forced_time.ToJsTime());
1329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/1", querier.urls()[1].url.spec());
1330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4000, querier.urls()[1].last_forced_time.ToJsTime());
1331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/2", querier.urls()[2].url.spec());
1332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5000, querier.urls()[2].last_forced_time.ToJsTime());
1333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/3", querier.urls()[3].url.spec());
1334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(6000, querier.urls()[3].last_forced_time.ToJsTime());
1335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/2", querier.urls()[4].url.spec());
1336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(7000, querier.urls()[4].last_forced_time.ToJsTime());
1337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/4", querier.urls()[5].url.spec());
1338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(8000, querier.urls()[5].last_forced_time.ToJsTime());
1339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/5", querier.urls()[6].url.spec());
1340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(9000, querier.urls()[6].last_forced_time.ToJsTime());
1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/3", querier.urls()[7].url.spec());
1342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(10000, querier.urls()[7].last_forced_time.ToJsTime());
1343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/4", querier.urls()[8].url.spec());
1344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(11000, querier.urls()[8].last_forced_time.ToJsTime());
1345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/5", querier.urls()[9].url.spec());
1346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(12000, querier.urls()[9].last_forced_time.ToJsTime());
1347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/6", querier.urls()[10].url.spec());
1348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(13000, querier.urls()[10].last_forced_time.ToJsTime());
1349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/6", querier.urls()[11].url.spec());
1350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(14000, querier.urls()[11].last_forced_time.ToJsTime());
1351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/7", querier.urls()[12].url.spec());
1352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(15000, querier.urls()[12].last_forced_time.ToJsTime());
1353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/8", querier.urls()[13].url.spec());
1354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(16000, querier.urls()[13].last_forced_time.ToJsTime());
1355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/9", querier.urls()[14].url.spec());
1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(17000, querier.urls()[14].last_forced_time.ToJsTime());
1357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/7", querier.urls()[15].url.spec());
1358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(18000, querier.urls()[15].last_forced_time.ToJsTime());
1359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/10", querier.urls()[16].url.spec());
1360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(19000, querier.urls()[16].last_forced_time.ToJsTime());
1361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/11", querier.urls()[17].url.spec());
1362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(20000, querier.urls()[17].last_forced_time.ToJsTime());
1363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://oldforced/8", querier.urls()[18].url.spec());
1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(21000, querier.urls()[18].last_forced_time.ToJsTime());
1365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newforced/12", querier.urls()[19].url.spec());
1366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(22000, querier.urls()[19].last_forced_time.ToJsTime());
1367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check first and last non-forced URLs.
1369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newnonforced/0", querier.urls()[20].url.spec());
1370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[20].last_forced_time.is_null());
1371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://newnonforced/19", querier.urls()[39].url.spec());
1372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[39].last_forced_time.is_null());
1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(TopSitesImplTest, SetForcedTopSitesWithCollisions) {
1376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Setup an old URL list in order to generate some collisions.
1378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURLList old_url_list;
1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://url/0"), 1000);
1380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The following three will be evicted.
1381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://collision/0"), 4000);
1382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://collision/1"), 6000);
1383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&old_url_list, GURL("http://collision/2"), 7000);
1384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The following is evicted since all non-forced URLs are, therefore it
1385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // doesn't cause a collision.
1386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&old_url_list, GURL("http://noncollision/0"));
1387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(old_url_list);
1388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Setup a new URL list that will cause collisions.
1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURLList new_url_list;
1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://collision/1"), 2000);
1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://url/2"), 3000);
1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://collision/0"), 5000);
1394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&new_url_list, GURL("http://noncollision/0"),
1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             9000);
1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&new_url_list, GURL("http://collision/2"));
1397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&new_url_list, GURL("http://url/3"));
1398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(new_url_list);
1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Query all URLs.
1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TopSitesQuerier querier;
1402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check URLs. When collision occurs, the incoming one is always preferred.
1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(7u + GetPrepopulatePages().size(), querier.urls().size());
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://url/0", querier.urls()[0].url.spec());
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1000u, querier.urls()[0].last_forced_time.ToJsTime());
1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://collision/1", querier.urls()[1].url.spec());
1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2000u, querier.urls()[1].last_forced_time.ToJsTime());
1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://url/2", querier.urls()[2].url.spec());
1411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3000u, querier.urls()[2].last_forced_time.ToJsTime());
1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://collision/0", querier.urls()[3].url.spec());
1413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5000u, querier.urls()[3].last_forced_time.ToJsTime());
1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://noncollision/0", querier.urls()[4].url.spec());
1415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(9000u, querier.urls()[4].last_forced_time.ToJsTime());
1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://collision/2", querier.urls()[5].url.spec());
1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[5].last_forced_time.is_null());
1418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://url/3", querier.urls()[6].url.spec());
1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[6].last_forced_time.is_null());
1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 7));
1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(TopSitesImplTest, SetTopSitesIdentical) {
1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the initial list of URLs.
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURLList url_list;
1426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&url_list, GURL("http://url/0"), 1000);
1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&url_list, GURL("http://url/1"));
1428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&url_list, GURL("http://url/2"));
1429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(url_list);
1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the new list of URLs to be exactly the same.
1432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(MostVisitedURLList(url_list));
1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Query all URLs.
1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TopSitesQuerier querier;
1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check URLs. When collision occurs, the incoming one is always preferred.
1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(3u + GetPrepopulatePages().size(), querier.urls().size());
1440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://url/0", querier.urls()[0].url.spec());
1441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1000u, querier.urls()[0].last_forced_time.ToJsTime());
1442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://url/1", querier.urls()[1].url.spec());
1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://url/2", querier.urls()[2].url.spec());
1444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 3));
1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(TopSitesImplTest, SetTopSitesWithAlreadyExistingForcedURLs) {
1448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Set the initial list of URLs.
1449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MostVisitedURLList old_url_list;
1450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  AppendForcedMostVisitedURL(&old_url_list, GURL("http://url/0/redir"), 1000);
1451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  AppendForcedMostVisitedURL(&old_url_list, GURL("http://url/1"), 2000);
1452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetTopSites(old_url_list);
1453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Setup a new URL list that will cause collisions.
1455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MostVisitedURLList new_url_list;
1456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  AppendMostVisitedURLWithRedirect(&new_url_list, GURL("http://url/0/redir"),
1457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                   GURL("http://url/0"));
1458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  AppendMostVisitedURL(&new_url_list, GURL("http://url/1"));
1459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SetTopSites(new_url_list);
1460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Query all URLs.
1462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TopSitesQuerier querier;
1463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  querier.QueryAllTopSites(top_sites(), false, true);
1464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Check URLs. When collision occurs, the non-forced one is always preferred.
1466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
1467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("http://url/0", querier.urls()[0].url.spec());
1468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("http://url/0/redir", querier.urls()[0].redirects[0].spec());
1469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(querier.urls()[0].last_forced_time.is_null());
1470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("http://url/1", querier.urls()[1].url.spec());
1471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(querier.urls()[1].last_forced_time.is_null());
1472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
1473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(TopSitesImplTest, AddForcedURL) {
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the initial list of URLs.
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MostVisitedURLList url_list;
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&url_list, GURL("http://forced/0"), 2000);
1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendForcedMostVisitedURL(&url_list, GURL("http://forced/1"), 4000);
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&url_list, GURL("http://nonforced/0"));
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&url_list, GURL("http://nonforced/1"));
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppendMostVisitedURL(&url_list, GURL("http://nonforced/2"));
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SetTopSites(url_list);
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add forced sites here and there to exercise a couple of cases.
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/2"),
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           base::Time::FromJsTime(5000)));
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/3"),
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           base::Time::FromJsTime(1000)));
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/4"),
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           base::Time::FromJsTime(3000)));
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check URLs.
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TopSitesQuerier querier;
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(8u + GetPrepopulatePages().size(), querier.urls().size());
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/3", querier.urls()[0].url.spec());
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1000u, querier.urls()[0].last_forced_time.ToJsTime());
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/0", querier.urls()[1].url.spec());
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2000u, querier.urls()[1].last_forced_time.ToJsTime());
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/4", querier.urls()[2].url.spec());
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(3000u, querier.urls()[2].last_forced_time.ToJsTime());
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/1", querier.urls()[3].url.spec());
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4000u, querier.urls()[3].last_forced_time.ToJsTime());
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/2", querier.urls()[4].url.spec());
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(5000u, querier.urls()[4].last_forced_time.ToJsTime());
1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://nonforced/0", querier.urls()[5].url.spec());
1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[5].last_forced_time.is_null());
1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://nonforced/1", querier.urls()[6].url.spec());
1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[6].last_forced_time.is_null());
1511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://nonforced/2", querier.urls()[7].url.spec());
1512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[7].last_forced_time.is_null());
1513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 8));
1514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add some collisions with forced and non-forced. Non-forced URLs are never
1516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // expected to move.
1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/3"),
1518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           base::Time::FromJsTime(4000)));
1519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/1"),
1520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            base::Time::FromJsTime(1000)));
1521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(AddForcedURL(GURL("http://nonforced/0"),
1522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            base::Time::FromJsTime(6000)));
1523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Check relevant URLs.
1525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(8u + GetPrepopulatePages().size(), querier.urls().size());
1527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/1", querier.urls()[0].url.spec());
1528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1000u, querier.urls()[0].last_forced_time.ToJsTime());
1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/3", querier.urls()[3].url.spec());
1530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4000u, querier.urls()[3].last_forced_time.ToJsTime());
1531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://nonforced/0", querier.urls()[5].url.spec());
1532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(querier.urls()[5].last_forced_time.is_null());
1533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add a timestamp collision and make sure things don't break.
1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/5"),
1536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           base::Time::FromJsTime(4000)));
1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(9u + GetPrepopulatePages().size(), querier.urls().size());
1539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4000u, querier.urls()[3].last_forced_time.ToJsTime());
1540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(4000u, querier.urls()[4].last_forced_time.ToJsTime());
1541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We don't care which order they get sorted in.
1542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (querier.urls()[3].url.spec() == "http://forced/3") {
1543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("http://forced/3", querier.urls()[3].url.spec());
1544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("http://forced/5", querier.urls()[4].url.spec());
1545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
1546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("http://forced/5", querier.urls()[3].url.spec());
1547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ("http://forced/3", querier.urls()[4].url.spec());
1548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make sure the thumbnail is not lost when the timestamp is updated.
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Image red_thumbnail(CreateBitmap(SK_ColorRED));
1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(
1553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  GURL("http://forced/5"), red_thumbnail, ThumbnailScore()));
1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Get the original thumbnail for later comparison. Some compression can
1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // happen in |top_sites| and we don't want to depend on that.
1557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkBitmap orig_thumbnail = GetThumbnail(GURL("http://forced/5"));
1558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(AddForcedURL(GURL("http://forced/5"),
1560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           base::Time::FromJsTime(6000)));
1561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ensure the thumbnail is still there even if the timestamp changed.
1563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  querier.QueryAllTopSites(top_sites(), false, true);
1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ("http://forced/5", querier.urls()[5].url.spec());
1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(6000u, querier.urls()[5].last_forced_time.ToJsTime());
1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SkBitmap thumbnail = GetThumbnail(GURL("http://forced/5"));
1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_EQ(orig_thumbnail.getSize(), thumbnail.getSize());
1568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  orig_thumbnail.lockPixels();
1569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  thumbnail.lockPixels();
1570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, memcmp(orig_thumbnail.getPixels(), thumbnail.getPixels(),
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      orig_thumbnail.getSize()));
1572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  thumbnail.unlockPixels();
1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  orig_thumbnail.unlockPixels();
1574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
1577