top_sites_impl_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_unittest_base.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_cache.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/top_sites_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/cancelable_task_tracker.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) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int start_number_of_callbacks = number_of_callbacks_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites->GetMostVisitedURLs(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TopSitesQuerier::OnTopSitesAvailable,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   weak_ptr_factory_.GetWeakPtr()));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (wait && start_number_of_callbacks == number_of_callbacks_) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = true;
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Run();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelRequest() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    weak_ptr_factory_.InvalidateWeakPtrs();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_urls(const MostVisitedURLList& urls) { urls_ = urls; }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const MostVisitedURLList& urls() const { return urls_; }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int number_of_callbacks() const { return number_of_callbacks_; }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Callback for TopSitesImpl::GetMostVisitedURLs.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnTopSitesAvailable(const history::MostVisitedURLList& data) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urls_ = data;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number_of_callbacks_++;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (waiting_) {
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Quit();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      waiting_ = false;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<TopSitesQuerier> weak_ptr_factory_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList urls_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int number_of_callbacks_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TopSitesQuerier);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the data from |t1| into a SkBitmap. This is intended for usage of
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thumbnail data, which is stored as jpgs.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap ExtractThumbnail(const base::RefCountedMemory& t1) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SkBitmap> image(gfx::JPEGCodec::Decode(t1.front(),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    t1.size()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image.get() ? *image : SkBitmap();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if t1 and t2 contain the same data.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ThumbnailsAreEqual(base::RefCountedMemory* t1,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::RefCountedMemory* t2) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!t1 || !t2)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (t1->size() != t2->size())
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !memcmp(t1->front(), t2->front(), t1->size());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesImplTest : public HistoryUnitTestBase {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TopSitesImplTest()
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db_thread_(BrowserThread::DB, &message_loop_) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new TestingProfile);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (CreateHistoryAndTopSites()) {
133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      ASSERT_TRUE(profile_->CreateHistoryService(false, false));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->CreateTopSites();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->BlockUntilTopSitesLoaded();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if history and top sites should be created in SetUp.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool CreateHistoryAndTopSites() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the thumbnail for |url| from TopSites.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkBitmap GetThumbnail(const GURL& url) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> data;
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return top_sites()->GetPageThumbnail(url, false, &data) ?
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ExtractThumbnail(*data.get()) : SkBitmap();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a bitmap of the specified color. Caller takes ownership.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image CreateBitmap(SkColor color) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkBitmap thumbnail;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thumbnail.setConfig(SkBitmap::kARGB_8888_Config, 4, 4);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thumbnail.allocPixels();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    thumbnail.eraseColor(color);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Image::CreateFrom1xBitmap(thumbnail);  // adds ref.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces top sites to load top sites from history, then recreates top sites.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreating top sites makes sure the changes from history are saved and
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded from the db.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RefreshTopSitesAndRecreate() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartQueryForMostVisited();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitForHistory();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RecreateTopSitesAndBlock();
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blocks the caller until history processes a task. This is useful if you
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to wait until you know history has processed a task.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForHistory() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->ScheduleDBTask(new WaitForHistoryTask(), &consumer_);
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for top sites to finish processing a task. This is useful if you need
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to wait until top sites finishes processing a task.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForTopSites() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->backend_->DoEmptyRequest(
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&TopSitesImplTest::QuitCallback, base::Unretained(this)),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &cancelable_task_tracker_);
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TopSitesImpl* top_sites() {
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return static_cast<TopSitesImpl*>(profile_->GetTopSites());
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelableRequestConsumer* consumer() { return &consumer_; }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile() {return profile_.get();}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history_service() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HistoryServiceFactory::GetForProfile(profile_.get(),
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                Profile::EXPLICIT_ACCESS);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList GetPrepopulatePages() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->GetPrepopulatePages();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the TopSitesQuerier contains the prepopulate data starting
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at |start_index|.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ContainsPrepopulatePages(const TopSitesQuerier& querier,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                size_t start_index) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MostVisitedURLList prepopulate_urls = GetPrepopulatePages();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(start_index + prepopulate_urls.size(), querier.urls().size());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < prepopulate_urls.size(); ++i) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(prepopulate_urls[i].url.spec(),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                querier.urls()[start_index + i].url.spec()) << " @ index " <<
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for callbacks from history.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EmptyCallback() {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Quit the current message loop when invoked. Useful when running a nested
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message loop.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QuitCallback() {
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a page to history.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPageToHistory(const GURL& url) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RedirectList redirects;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirects.push_back(url);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->AddPage(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, base::Time::Now(), static_cast<void*>(this), 0, GURL(),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a page to history.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPageToHistory(const GURL& url, const string16& title) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RedirectList redirects;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirects.push_back(url);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->AddPage(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, base::Time::Now(), static_cast<void*>(this), 0, GURL(),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->SetPageTitle(url, title);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a page to history.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddPageToHistory(const GURL& url,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const string16& title,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const history::RedirectList& redirects,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::Time time) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->AddPage(
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, time, static_cast<void*>(this), 0, GURL(),
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->SetPageTitle(url, title);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delets a url.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteURL(const GURL& url) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_service()->DeleteURL(url);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the thumbnail equals the specified bytes.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ThumbnailEqualsBytes(const gfx::Image& image,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::RefCountedMemory* bytes) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedBytes> encoded_image;
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TopSitesImpl::EncodeBitmap(image, &encoded_image);
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return ThumbnailsAreEqual(encoded_image.get(), bytes);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreates top sites. This forces top sites to reread from the db.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RecreateTopSitesAndBlock() {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Recreate TopSites and wait for it to load.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile()->CreateTopSites();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // As history already loaded we have to fake this call.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile()->BlockUntilTopSitesLoaded();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrappers that allow private TopSites functions to be called from the
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // individual tests without making them all be friends.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetCanonicalURL(const GURL& url) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->cache_->GetCanonicalURL(url);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetTopSites(const MostVisitedURLList& new_top_sites) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->SetTopSites(new_top_sites);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartQueryForMostVisited() {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->StartQueryForMostVisited();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLastNumUrlsChanged(size_t value) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    top_sites()->last_num_urls_changed_ = value;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t last_num_urls_changed() { return top_sites()->last_num_urls_changed_; }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta GetUpdateDelay() {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->GetUpdateDelay();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTopSitesLoaded() { return top_sites()->loaded_; }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddPrepopulatedPages(MostVisitedURLList* urls) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return top_sites()->AddPrepopulatedPages(urls);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread db_thread_;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To cancel HistoryService tasks.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelableRequestConsumer consumer_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To cancel TopSitesBackend tasks.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelableTaskTracker cancelable_task_tracker_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TopSitesImplTest);
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};  // Class TopSitesImplTest
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for appending a URL to a vector of "most visited" URLs,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using the default values for everything but the URL.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AppendMostVisitedURL(std::vector<MostVisitedURL>* list,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& url) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = url;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->push_back(mv);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as AppendMostVisitedURL except that it adds a redirect from the first
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL to the second.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AppendMostVisitedURLWithRedirect(
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<MostVisitedURL>* list,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& redirect_source, const GURL& redirect_dest) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = redirect_dest;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(redirect_source);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(redirect_dest);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->push_back(mv);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetCanonicalURL.
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetCanonicalURL) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Have two chains:
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   google.com -> www.google.com
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   news.google.com (no redirects)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news("http://news.google.com/");
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL source("http://google.com/");
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL dest("http://www.google.com/");
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> most_visited;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURLWithRedirect(&most_visited, source, dest);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&most_visited, news);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(most_visited);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Random URLs not in the database are returned unchanged.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL result = GetCanonicalURL(GURL("http://fark.com/"));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("http://fark.com/"), result);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Easy case, there are no redirects and the exact URL is stored.
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = GetCanonicalURL(news);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(news, result);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL in question is the source URL in a redirect list.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = GetCanonicalURL(source);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dest, result);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL in question is the destination of a redirect.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = GetCanonicalURL(dest);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dest, result);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests DiffMostVisited.
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, DiffMostVisited) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL stays_the_same("http://staysthesame/");
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_added_1("http://getsadded1/");
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_added_2("http://getsadded2/");
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_deleted_1("http://getsdeleted2/");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL gets_moved_1("http://getsmoved1/");
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> old_list;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&old_list, stays_the_same);  // 0  (unchanged)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&old_list, gets_deleted_1);  // 1  (deleted)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&old_list, gets_moved_1);    // 2  (moved to 3)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> new_list;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, stays_the_same);  // 0  (unchanged)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_added_1);    // 1  (added)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_added_2);    // 2  (added)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&new_list, gets_moved_1);    // 3  (moved from 2)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history::TopSitesDelta delta;
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, delta.added.size());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gets_added_1 == delta.added[0].url.url);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, delta.added[0].rank);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gets_added_2 == delta.added[1].url.url);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, delta.added[1].rank);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, delta.deleted.size());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gets_deleted_1 == delta.deleted[0].url);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, delta.moved.size());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(gets_moved_1 == delta.moved[0].url.url);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3, delta.moved[0].rank);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests SetPageThumbnail.
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, SetPageThumbnail) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1a("http://google.com/");
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1b("http://www.google.com/");
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2("http://images.google.com/");
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL invalid_url("chrome://favicon/http://google.com/");
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> list;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&list, url2);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = url1b;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1a);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1b);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back(mv);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save our most visited data containing that one site.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(list);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorWHITE));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time now = base::Time::Now();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore low_score(1.0, true, true, now);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, now);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore high_score(0.0, true, true, now);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting the thumbnail for invalid pages should fail.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             thumbnail, medium_score));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting the thumbnail for url2 should succeed, lower scores shouldn't
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // replace it, higher scores should.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, medium_score));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(url2, thumbnail, low_score));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, high_score));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set on the redirect source should succeed. It should be replacable by
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the same score on the redirect destination, which in turn should not
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be replaced by the source again.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1b, thumbnail, medium_score));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a thumbnail is correctly removed when the page is removed.
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, ThumbnailRemoved) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://google.com/");
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configure top sites with 'google.com'.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> list;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppendMostVisitedURL(&list, url);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(list);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorRED));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time now = base::Time::Now();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore low_score(1.0, true, true, now);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, now);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore high_score(0.0, true, true, now);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the thumbnail.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url, thumbnail, medium_score));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the thumbnail was actually set.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> result;
481d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(url, false, &result));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get()));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the thumbnails and make sure we don't get it back.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(MostVisitedURLList());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
487d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(top_sites()->GetPageThumbnail(url, false, &result));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetPageThumbnail.
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetPageThumbnail) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList url_list;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url1;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.url = GURL("http://asdf.com");
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.redirects.push_back(url1.url);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_list.push_back(url1);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url2;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.url = GURL("http://gmail.com");
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(url2.url);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(GURL("http://mail.google.com"));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_list.push_back(url2);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(url_list);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorWHITE));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore score(0.5, true, true, base::Time::Now());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> result;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(url1.url, thumbnail, score));
512d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(url1.url, false, &result));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://gmail.com"),
5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                            thumbnail, score));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://gmail.com"),
517d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            false,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &result));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get a thumbnail via a redirect.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://mail.google.com"),
521d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            false,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            &result));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://mail.google.com"),
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                            thumbnail, score));
526d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(top_sites()->GetPageThumbnail(url2.url, false, &result));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get()));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetMostVisitedURLs.
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetMostVisited) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news("http://news.google.com/");
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google("http://google.com/");
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(news);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartQueryForMostVisited();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier.QueryTopSites(top_sites(), false);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, querier.number_of_callbacks());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2 extra prepopulated URLs.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(news, querier.urls()[0].url);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(google, querier.urls()[1].url);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure changes done to top sites get mirrored to the db.
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, SaveToDB) {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL asdf_url("http://asdf.com");
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 asdf_title(ASCIIToUTF16("ASDF"));
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google_url("http://google.com");
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 google_title(ASCIIToUTF16("Google"));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news_url("http://news.google.com");
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 news_title(ASCIIToUTF16("Google News"));
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add asdf_url to history.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(asdf_url, asdf_title);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make TopSites reread from the db.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartQueryForMostVisited();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a thumbnail.
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image tmp_bitmap(CreateBitmap(SK_ColorBLUE));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(asdf_url, tmp_bitmap,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ThumbnailScore()));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateTopSitesAndBlock();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[0].url);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[0].title);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, false, &read_data));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(tmp_bitmap, read_data.get()));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url2;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.url = google_url;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.title = google_title;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(url2.url);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(url2.url, url2.title);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add new thumbnail at rank 0 and shift the other result to 1.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(google_url,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            tmp_bitmap,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            ThumbnailScore()));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make TopSites reread from the db.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[0].url);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[0].title);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_url, querier.urls()[1].url);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[1].title);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// More permutations of saving to db.
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, RealDatabase) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL asdf_url("http://asdf.com");
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 asdf_title(ASCIIToUTF16("ASDF"));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google1_url("http://google.com");
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google2_url("http://google.com/redirect");
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google3_url("http://www.google.com");
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 google_title(ASCIIToUTF16("Google"));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news_url("http://news.google.com");
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 news_title(ASCIIToUTF16("Google News"));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = asdf_url;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.title = asdf_title;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image asdf_thumbnail(CreateBitmap(SK_ColorRED));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  asdf_url, asdf_thumbnail, ThumbnailScore()));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time add_time(base::Time::Now());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(url.url, url.title, url.redirects, add_time);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[0].url);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[0].title);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
652d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, false, &read_data));
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(asdf_thumbnail, read_data.get()));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url2;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.url = google3_url;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.title = google_title;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(google1_url);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(google2_url);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url2.redirects.push_back(google3_url);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google3_url, url2.title, url2.redirects,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   add_time - base::TimeDelta::FromMinutes(1));
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add google twice so that it becomes the first visited site.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google3_url, url2.title, url2.redirects,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   add_time - base::TimeDelta::FromMinutes(2));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image google_thumbnail(CreateBitmap(SK_ColorBLUE));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(top_sites()->SetPageThumbnail(
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  url2.url, google_thumbnail, ThumbnailScore()));
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size());
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google1_url, querier.urls()[0].url);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[0].title);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(3u, querier.urls()[0].redirects.size());
684d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, false, &read_data));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(google_thumbnail, read_data.get()));
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_url, querier.urls()[1].url);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(asdf_title, querier.urls()[1].title);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image weewar_bitmap(CreateBitmap(SK_ColorYELLOW));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time thumbnail_time(base::Time::Now());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore low_score(1.0, true, true, thumbnail_time);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, thumbnail_time);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore high_score(0.0, true, true, thumbnail_time);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Set to weewar. (Writes the thumbnail to the DB.)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(google3_url,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            weewar_bitmap,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            medium_score));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
706d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, false, &read_data));
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get()));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image green_bitmap(CreateBitmap(SK_ColorGREEN));
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Set to google - low score.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(google3_url,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             green_bitmap,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             low_score));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. Set to google - high score.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(google1_url,
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            green_bitmap,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            high_score));
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the thumbnail was updated.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<base::RefCountedMemory> read_data;
726d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, false, &read_data));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get()));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ThumbnailEqualsBytes(green_bitmap, read_data.get()));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, DeleteNotifications) {
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google1_url("http://google.com");
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google2_url("http://google.com/redirect");
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL google3_url("http://www.google.com");
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 google_title(ASCIIToUTF16("Google"));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL news_url("http://news.google.com");
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 news_title(ASCIIToUTF16("Google News"));
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(google1_url, google_title);
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddPageToHistory(news_url, news_title);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(GetPrepopulatePages().size() + 2, querier.urls().size());
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteURL(news_url);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for history to process the deletion.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[0].title);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now reload. This verifies topsites actually wrote the deletion to disk.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size());
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(google_title, querier.urls()[0].title);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1));
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteURL(google1_url);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for history to process the deletion.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForHistory();
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now reload. This verifies topsites actually wrote the deletion to disk.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RefreshTopSitesAndRecreate();
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier querier;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    querier.QueryTopSites(top_sites(), false);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size());
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure GetUpdateDelay is updated appropriately.
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetUpdateDelay) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(0);
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(30, GetUpdateDelay().InSeconds());
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList url_list;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_list.resize(20);
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL tmp_url(GURL("http://x"));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < url_list.size(); ++i) {
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_list[i].url = tmp_url;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_list[i].redirects.push_back(tmp_url);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(url_list);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20u, last_num_urls_changed());
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(0);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(60, GetUpdateDelay().InMinutes());
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(3);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(52, GetUpdateDelay().InMinutes());
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLastNumUrlsChanged(20);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, GetUpdateDelay().InMinutes());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that callbacks are notified correctly if requested before top sites
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has loaded.
829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, NotifyCallbacksWhenLoaded) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites. It won't be loaded now.
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->CreateTopSites();
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTopSitesLoaded());
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier1;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier2;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier3;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the queries.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier1.QueryTopSites(top_sites(), false);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier2.QueryTopSites(top_sites(), false);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier3.QueryTopSites(top_sites(), false);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have gotten a callback.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier1.number_of_callbacks());
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier2.number_of_callbacks());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier3.number_of_callbacks());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for loading to complete.
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->BlockUntilTopSitesLoaded();
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we should have gotten the callbacks.
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier1.number_of_callbacks());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size());
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier2.number_of_callbacks());
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier2.urls().size());
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier3.number_of_callbacks());
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier3.urls().size());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the top sites.
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList pages;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://1.com/");
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://2.com/");
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(pages);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites. It won't be loaded now.
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->CreateTopSites();
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTopSitesLoaded());
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier4;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query again.
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier4.QueryTopSites(top_sites(), false);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have gotten a callback.
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier4.number_of_callbacks());
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for loading to complete.
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->BlockUntilTopSitesLoaded();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now we should have gotten the callbacks.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier4.number_of_callbacks());
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u + GetPrepopulatePages().size(), querier4.urls().size());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://1.com/", querier4.urls()[0].url.spec());
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://2.com/", querier4.urls()[1].url.spec());
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier4, 2));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the top sites again, this time don't reload.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://3.com/");
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(pages);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query again.
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier5;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier5.QueryTopSites(top_sites(), true);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier5.number_of_callbacks());
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u + GetPrepopulatePages().size(), querier5.urls().size());
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://1.com/", querier5.urls()[0].url.spec());
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://2.com/", querier5.urls()[1].url.spec());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://3.com/", querier5.urls()[2].url.spec());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier5, 3));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure canceled requests are not notified.
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, CancelingRequestsForTopSites) {
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites. It won't be loaded now.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->CreateTopSites();
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsTopSitesLoaded());
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier1;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier querier2;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts the queries.
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier1.QueryTopSites(top_sites(), false);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier2.QueryTopSites(top_sites(), false);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't have gotten a callback.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier1.number_of_callbacks());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier2.number_of_callbacks());
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  querier2.CancelRequest();
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for loading to complete.
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->BlockUntilTopSitesLoaded();
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first callback should succeed.
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, querier1.number_of_callbacks());
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size());
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the canceled callback should not be notified.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, querier2.number_of_callbacks());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure temporary thumbnails are copied over correctly.
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, AddTemporaryThumbnail) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL unknown_url("http://news.google.com/");
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL invalid_url("chrome://thumb/http://google.com/");
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1a("http://google.com/");
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url1b("http://www.google.com/");
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a dummy thumbnail.
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Image thumbnail(CreateBitmap(SK_ColorRED));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore medium_score(0.5, true, true, base::Time::Now());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't store thumbnails for Javascript URLs.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url,
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             thumbnail,
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             medium_score));
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Store thumbnails for unknown (but valid) URLs temporarily - calls
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddTemporaryThumbnail.
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->SetPageThumbnail(unknown_url,
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            thumbnail,
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            medium_score));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't get the thumnail back though (the url isn't in to sites yet).
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> out;
969d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FALSE(top_sites()->GetPageThumbnail(unknown_url, false, &out));
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But we should be able to get the temporary page thumbnail score.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ThumbnailScore out_score;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->GetTemporaryPageThumbnailScore(unknown_url,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          &out_score));
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(medium_score.Equals(out_score));
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<MostVisitedURL> list;
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL mv;
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.url = unknown_url;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(mv.url);
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1a);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mv.redirects.push_back(url1b);
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list.push_back(mv);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update URLs. This should result in using thumbnail.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(list);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
988d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(top_sites()->GetPageThumbnail(unknown_url, false, &out));
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, out.get()));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests variations of blacklisting.
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, Blacklisting) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList pages;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURL url, url1;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.url = GURL("http://bbc.com/");
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.redirects.push_back(url.url);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.url = GURL("http://google.com/");
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url1.redirects.push_back(url1.url);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pages.push_back(url1);
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTopSites(pages);
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/")));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist google.com.
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->AddBlacklistedURL(GURL("http://google.com/"));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL prepopulate_url = GetPrepopulatePages()[0].url;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->IsBlacklisted(GURL("http://google.com/")));
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/")));
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(prepopulate_url));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the blacklisted site isn't returned in the results.
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size());
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Recreate top sites and make sure blacklisted url was correctly read.
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecreateTopSitesAndBlock();
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size());
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist one of the prepopulate urls.
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->AddBlacklistedURL(prepopulate_url);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the blacklisted prepopulate url isn't returned.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1u + GetPrepopulatePages().size() - 1, q.urls().size());
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 1; i < q.urls().size(); ++i)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(prepopulate_url.spec(), q.urls()[i].url.spec());
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark google as no longer blacklisted.
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->RemoveBlacklistedURL(GURL("http://google.com/"));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(top_sites()->HasBlacklistedItems());
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://google.com/")));
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure google is returned now.
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size() - 1, q.urls().size());
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Android has only one prepopulated page which has been blacklisted, so
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // only 2 urls are returned.
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (q.urls().size() > 2)
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_NE(prepopulate_url.spec(), q.urls()[2].url.spec());
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1u, GetPrepopulatePages().size());
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove all blacklisted sites.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  top_sites()->ClearBlacklistedURLs();
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(top_sites()->HasBlacklistedItems());
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TopSitesQuerier q;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    q.QueryTopSites(top_sites(), true);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2u + GetPrepopulatePages().size(), q.urls().size());
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec());
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("http://google.com/", q.urls()[1].url.spec());
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 2));
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure prepopulated pages exist.
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, AddPrepopulatedPages) {
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TopSitesQuerier q;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  q.QueryTopSites(top_sites(), true);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), q.urls().size());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0));
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MostVisitedURLList pages = q.urls();
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(AddPrepopulatedPages(&pages));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetPrepopulatePages().size(), pages.size());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  q.set_urls(pages);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0));
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
1099