top_sites_impl_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_database.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_db_task.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_marshaling.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_notifications.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_unittest_base.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_backend.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_cache.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_database.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/top_sites_impl.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/most_visited_handler.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/tools/profiles/thumbnail-inl.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by WaitForHistory, see it for details. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitForHistoryTask : public HistoryDBTask { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistoryTask() {} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool RunOnDBThread(HistoryBackend* backend, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryDatabase* db) OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DoneRunOnMainThread() OVERRIDE { 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WaitForHistoryTask() {} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WaitForHistoryTask); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used for querying top sites. Either runs sequentially, or runs a nested 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nested message loop until the response is complete. The later is used when 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TopSites is queried before it finishes loading. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TopSitesQuerier { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier() 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_callbacks_(0), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_(false) {} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queries top sites. If |wait| is true a nested message loop is run until the 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback is notified. 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void QueryTopSites(TopSitesImpl* top_sites, bool wait) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_number_of_callbacks = number_of_callbacks_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites->GetMostVisitedURLs( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TopSitesQuerier::OnTopSitesAvailable, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (wait && start_number_of_callbacks == number_of_callbacks_) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = true; 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelRequest() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_urls(const MostVisitedURLList& urls) { urls_ = urls; } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MostVisitedURLList& urls() const { return urls_; } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_callbacks() const { return number_of_callbacks_; } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback for TopSitesImpl::GetMostVisitedURLs. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnTopSitesAvailable(const history::MostVisitedURLList& data) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls_ = data; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) number_of_callbacks_++; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (waiting_) { 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) waiting_ = false; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<TopSitesQuerier> weak_ptr_factory_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList urls_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_callbacks_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool waiting_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TopSitesQuerier); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts the data from |t1| into a SkBitmap. This is intended for usage of 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thumbnail data, which is stored as jpgs. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap ExtractThumbnail(const base::RefCountedMemory& t1) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> image(gfx::JPEGCodec::Decode(t1.front(), 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) t1.size())); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image.get() ? *image : SkBitmap(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if t1 and t2 contain the same data. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ThumbnailsAreEqual(base::RefCountedMemory* t1, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedMemory* t2) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!t1 || !t2) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (t1->size() != t2->size()) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !memcmp(t1->front(), t2->front(), t1->size()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesImplTest : public HistoryUnitTestBase { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TopSitesImplTest() 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ui_thread_(BrowserThread::UI, &message_loop_), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_thread_(BrowserThread::DB, &message_loop_) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CreateHistoryAndTopSites()) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->CreateHistoryService(false, false); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->CreateTopSites(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->BlockUntilTopSitesLoaded(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if history and top sites should be created in SetUp. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CreateHistoryAndTopSites() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the thumbnail for |url| from TopSites. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap GetThumbnail(const GURL& url) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> data; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return top_sites()->GetPageThumbnail(url, &data) ? 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtractThumbnail(*data.get()) : SkBitmap(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a bitmap of the specified color. Caller takes ownership. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image CreateBitmap(SkColor color) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap thumbnail; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail.setConfig(SkBitmap::kARGB_8888_Config, 4, 4); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail.allocPixels(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail.eraseColor(color); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Image::CreateFrom1xBitmap(thumbnail); // adds ref. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Forces top sites to load top sites from history, then recreates top sites. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreating top sites makes sure the changes from history are saved and 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loaded from the db. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RefreshTopSitesAndRecreate() { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartQueryForMostVisited(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistory(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateTopSitesAndBlock(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blocks the caller until history processes a task. This is useful if you 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to wait until you know history has processed a task. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForHistory() { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->ScheduleDBTask(new WaitForHistoryTask(), &consumer_); 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for top sites to finish processing a task. This is useful if you need 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to wait until top sites finishes processing a task. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForTopSites() { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->backend_->DoEmptyRequest( 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&TopSitesImplTest::QuitCallback, base::Unretained(this)), 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &cancelable_task_tracker_); 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TopSitesImpl* top_sites() { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<TopSitesImpl*>(profile_->GetTopSites()); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumer* consumer() { return &consumer_; } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* profile() {return profile_.get();} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* history_service() { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HistoryServiceFactory::GetForProfile(profile_.get(), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList GetPrepopulatePages() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return top_sites()->GetPrepopulatePages(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the TopSitesQuerier contains the prepopulate data starting 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // at |start_index|. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ContainsPrepopulatePages(const TopSitesQuerier& querier, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t start_index) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList prepopulate_urls = GetPrepopulatePages(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_LE(start_index + prepopulate_urls.size(), querier.urls().size()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < prepopulate_urls.size(); ++i) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prepopulate_urls[i].url.spec(), 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.urls()[start_index + i].url.spec()) << " @ index " << 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for callbacks from history. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EmptyCallback() { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Quit the current message loop when invoked. Useful when running a nested 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message loop. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QuitCallback() { 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a page to history. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPageToHistory(const GURL& url) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RedirectList redirects; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->AddPage( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, base::Time::Now(), static_cast<void*>(this), 0, GURL(), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a page to history. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPageToHistory(const GURL& url, const string16& title) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RedirectList redirects; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->AddPage( 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, base::Time::Now(), static_cast<void*>(this), 0, GURL(), 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->SetPageTitle(url, title); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a page to history. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPageToHistory(const GURL& url, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& title, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::RedirectList& redirects, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->AddPage( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, time, static_cast<void*>(this), 0, GURL(), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, content::PAGE_TRANSITION_TYPED, history::SOURCE_BROWSED, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->SetPageTitle(url, title); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delets a url. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteURL(const GURL& url) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->DeleteURL(url); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the thumbnail equals the specified bytes. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ThumbnailEqualsBytes(const gfx::Image& image, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedMemory* bytes) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> encoded_image; 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TopSitesImpl::EncodeBitmap(image, &encoded_image); 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return ThumbnailsAreEqual(encoded_image.get(), bytes); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreates top sites. This forces top sites to reread from the db. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RecreateTopSitesAndBlock() { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate TopSites and wait for it to load. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As history already loaded we have to fake this call. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wrappers that allow private TopSites functions to be called from the 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // individual tests without making them all be friends. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetCanonicalURL(const GURL& url) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return top_sites()->cache_->GetCanonicalURL(url); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetTopSites(const MostVisitedURLList& new_top_sites) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->SetTopSites(new_top_sites); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartQueryForMostVisited() { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->StartQueryForMostVisited(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetLastNumUrlsChanged(size_t value) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->last_num_urls_changed_ = value; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t last_num_urls_changed() { return top_sites()->last_num_urls_changed_; } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta GetUpdateDelay() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return top_sites()->GetUpdateDelay(); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsTopSitesLoaded() { return top_sites()->loaded_; } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AddPrepopulatedPages(MostVisitedURLList* urls) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return top_sites()->AddPrepopulatedPages(urls); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread db_thread_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To cancel HistoryService tasks. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumer consumer_; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To cancel TopSitesBackend tasks. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableTaskTracker cancelable_task_tracker_; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TopSitesImplTest); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; // Class TopSitesImplTest 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesMigrationTest : public TopSitesImplTest { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesMigrationTest() {} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TopSitesImplTest::SetUp(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_path; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path = data_path.AppendASCII("top_sites"); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up history and thumbnails as they would be before migration. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExecuteSQLScript( 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("history.19.sql"), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetPath().Append(chrome::kHistoryFilename))); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExecuteSQLScript( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("thumbnails.3.sql"), 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetPath().Append(chrome::kThumbnailsFilename))); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateHistoryService(false, false); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if history and top sites should be created in SetUp. 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CreateHistoryAndTopSites() OVERRIDE { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assertions for the migration test. This is extracted into a standalone 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method so that it can be invoked twice. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MigrationAssertions() { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We shouldn't have gotten a callback. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier.number_of_callbacks()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The data we loaded should contain google and yahoo. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://google.com/"), querier.urls()[0].url); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://yahoo.com/"), querier.urls()[1].url); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap goog_thumbnail = GetThumbnail(GURL("http://google.com/")); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, goog_thumbnail.width()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap yahoo_thumbnail = GetThumbnail(GURL("http://yahoo.com/")); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, yahoo_thumbnail.width()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Favicon assertions are handled in ThumbnailDatabase. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TopSitesMigrationTest); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function for appending a URL to a vector of "most visited" URLs, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using the default values for everything but the URL. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AppendMostVisitedURL(std::vector<MostVisitedURL>* list, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL mv; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.url = url; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(url); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list->push_back(mv); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as AppendMostVisitedURL except that it adds a redirect from the first 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL to the second. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void AppendMostVisitedURLWithRedirect( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL>* list, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& redirect_source, const GURL& redirect_dest) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL mv; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.url = redirect_dest; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(redirect_source); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(redirect_dest); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list->push_back(mv); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetCanonicalURL. 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetCanonicalURL) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have two chains: 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // google.com -> www.google.com 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // news.google.com (no redirects) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL news("http://news.google.com/"); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL source("http://google.com/"); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dest("http://www.google.com/"); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL> most_visited; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURLWithRedirect(&most_visited, source, dest); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&most_visited, news); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(most_visited); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Random URLs not in the database are returned unchanged. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL result = GetCanonicalURL(GURL("http://fark.com/")); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://fark.com/"), result); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Easy case, there are no redirects and the exact URL is stored. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = GetCanonicalURL(news); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(news, result); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL in question is the source URL in a redirect list. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = GetCanonicalURL(source); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(dest, result); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL in question is the destination of a redirect. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = GetCanonicalURL(dest); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(dest, result); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests DiffMostVisited. 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, DiffMostVisited) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL stays_the_same("http://staysthesame/"); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gets_added_1("http://getsadded1/"); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gets_added_2("http://getsadded2/"); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gets_deleted_1("http://getsdeleted2/"); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gets_moved_1("http://getsmoved1/"); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL> old_list; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&old_list, stays_the_same); // 0 (unchanged) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&old_list, gets_deleted_1); // 1 (deleted) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&old_list, gets_moved_1); // 2 (moved to 3) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL> new_list; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&new_list, stays_the_same); // 0 (unchanged) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&new_list, gets_added_1); // 1 (added) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&new_list, gets_added_2); // 2 (added) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&new_list, gets_moved_1); // 3 (moved from 2) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::TopSitesDelta delta; 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::TopSitesImpl::DiffMostVisited(old_list, new_list, &delta); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, delta.added.size()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(gets_added_1 == delta.added[0].url.url); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, delta.added[0].rank); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(gets_added_2 == delta.added[1].url.url); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, delta.added[1].rank); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, delta.deleted.size()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(gets_deleted_1 == delta.deleted[0].url); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, delta.moved.size()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(gets_moved_1 == delta.moved[0].url.url); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3, delta.moved[0].rank); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests SetPageThumbnail. 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, SetPageThumbnail) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1a("http://google.com/"); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1b("http://www.google.com/"); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url2("http://images.google.com/"); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL invalid_url("chrome://favicon/http://google.com/"); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL> list; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&list, url2); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL mv; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.url = url1b; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(url1a); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(url1b); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(mv); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save our most visited data containing that one site. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(list); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a dummy thumbnail. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image thumbnail(CreateBitmap(SK_ColorWHITE)); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time now = base::Time::Now(); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore low_score(1.0, true, true, now); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore medium_score(0.5, true, true, now); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore high_score(0.0, true, true, now); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting the thumbnail for invalid pages should fail. 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url, 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail, medium_score)); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting the thumbnail for url2 should succeed, lower scores shouldn't 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // replace it, higher scores should. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, medium_score)); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->SetPageThumbnail(url2, thumbnail, low_score)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(url2, thumbnail, high_score)); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set on the redirect source should succeed. It should be replacable by 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same score on the redirect destination, which in turn should not 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be replaced by the source again. 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score)); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(url1b, thumbnail, medium_score)); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->SetPageThumbnail(url1a, thumbnail, medium_score)); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a thumbnail is correctly removed when the page is removed. 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, ThumbnailRemoved) { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com/"); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Configure top sites with 'google.com'. 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL> list; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMostVisitedURL(&list, url); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(list); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a dummy thumbnail. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image thumbnail(CreateBitmap(SK_ColorRED)); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time now = base::Time::Now(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore low_score(1.0, true, true, now); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore medium_score(0.5, true, true, now); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore high_score(0.0, true, true, now); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the thumbnail. 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(url, thumbnail, medium_score)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the thumbnail was actually set. 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> result; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(url, &result)); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get())); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the thumbnails and make sure we don't get it back. 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(MostVisitedURLList()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->GetPageThumbnail(url, &result)); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetPageThumbnail. 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetPageThumbnail) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList url_list; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url1; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url1.url = GURL("http://asdf.com"); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url1.redirects.push_back(url1.url); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_list.push_back(url1); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url2; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.url = GURL("http://gmail.com"); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.redirects.push_back(url2.url); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.redirects.push_back(GURL("http://mail.google.com")); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_list.push_back(url2); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(url_list); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a dummy thumbnail. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image thumbnail(CreateBitmap(SK_ColorWHITE)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore score(0.5, true, true, base::Time::Now()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> result; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(url1.url, thumbnail, score)); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(url1.url, &result)); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://gmail.com"), 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail, score)); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://gmail.com"), 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a thumbnail via a redirect. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(GURL("http://mail.google.com"), 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result)); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(GURL("http://mail.google.com"), 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail, score)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(url2.url, &result)); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, result.get())); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests GetMostVisitedURLs. 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetMostVisited) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL news("http://news.google.com/"); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google("http://google.com/"); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(news); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(google); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartQueryForMostVisited(); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistory(); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, querier.number_of_callbacks()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 extra prepopulated URLs. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(news, querier.urls()[0].url); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google, querier.urls()[1].url); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2)); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure changes done to top sites get mirrored to the db. 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, SaveToDB) { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL asdf_url("http://asdf.com"); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 asdf_title(ASCIIToUTF16("ASDF")); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google_url("http://google.com"); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 google_title(ASCIIToUTF16("Google")); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL news_url("http://news.google.com"); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 news_title(ASCIIToUTF16("Google News")); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add asdf_url to history. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(asdf_url, asdf_title); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make TopSites reread from the db. 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartQueryForMostVisited(); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistory(); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a thumbnail. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image tmp_bitmap(CreateBitmap(SK_ColorBLUE)); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(top_sites()->SetPageThumbnail(asdf_url, tmp_bitmap, 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore())); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateTopSitesAndBlock(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size()); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_url, querier.urls()[0].url); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_title, querier.urls()[0].title); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1)); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> read_data; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, &read_data)); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(tmp_bitmap, read_data.get())); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url2; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.url = google_url; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.title = google_title; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.redirects.push_back(url2.url); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(url2.url, url2.title); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add new thumbnail at rank 0 and shift the other result to 1. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(top_sites()->SetPageThumbnail(google_url, 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp_bitmap, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore())); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make TopSites reread from the db. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size()); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_url, querier.urls()[0].url); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_title, querier.urls()[0].title); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google_url, querier.urls()[1].url); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google_title, querier.urls()[1].title); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2)); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// More permutations of saving to db. 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, RealDatabase) { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL asdf_url("http://asdf.com"); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 asdf_title(ASCIIToUTF16("ASDF")); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google1_url("http://google.com"); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google2_url("http://google.com/redirect"); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google3_url("http://www.google.com"); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 google_title(ASCIIToUTF16("Google")); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL news_url("http://news.google.com"); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 news_title(ASCIIToUTF16("Google News")); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.url = asdf_url; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.title = asdf_title; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.redirects.push_back(url.url); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image asdf_thumbnail(CreateBitmap(SK_ColorRED)); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(top_sites()->SetPageThumbnail( 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) asdf_url, asdf_thumbnail, ThumbnailScore())); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time add_time(base::Time::Now()); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(url.url, url.title, url.redirects, add_time); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size()); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_url, querier.urls()[0].url); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_title, querier.urls()[0].title); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1)); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> read_data; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(asdf_url, &read_data)); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(asdf_thumbnail, read_data.get())); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url2; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.url = google3_url; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.title = google_title; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.redirects.push_back(google1_url); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.redirects.push_back(google2_url); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.redirects.push_back(google3_url); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(google3_url, url2.title, url2.redirects, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_time - base::TimeDelta::FromMinutes(1)); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add google twice so that it becomes the first visited site. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(google3_url, url2.title, url2.redirects, 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_time - base::TimeDelta::FromMinutes(2)); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image google_thumbnail(CreateBitmap(SK_ColorBLUE)); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(top_sites()->SetPageThumbnail( 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2.url, google_thumbnail, ThumbnailScore())); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> read_data; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size(), querier.urls().size()); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google1_url, querier.urls()[0].url); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google_title, querier.urls()[0].title); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u, querier.urls()[0].redirects.size()); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, &read_data)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(google_thumbnail, read_data.get())); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_url, querier.urls()[1].url); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(asdf_title, querier.urls()[1].title); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 2)); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image weewar_bitmap(CreateBitmap(SK_ColorYELLOW)); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time thumbnail_time(base::Time::Now()); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore low_score(1.0, true, true, thumbnail_time); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore medium_score(0.5, true, true, thumbnail_time); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore high_score(0.0, true, true, thumbnail_time); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. Set to weewar. (Writes the thumbnail to the DB.) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(google3_url, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weewar_bitmap, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) medium_score)); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> read_data; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, &read_data)); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get())); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image green_bitmap(CreateBitmap(SK_ColorGREEN)); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. Set to google - low score. 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->SetPageThumbnail(google3_url, 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) green_bitmap, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) low_score)); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3. Set to google - high score. 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(google1_url, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) green_bitmap, 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) high_score)); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the thumbnail was updated. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> read_data; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetPageThumbnail(google3_url, &read_data)); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThumbnailEqualsBytes(weewar_bitmap, read_data.get())); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(green_bitmap, read_data.get())); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, DeleteNotifications) { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google1_url("http://google.com"); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google2_url("http://google.com/redirect"); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL google3_url("http://www.google.com"); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 google_title(ASCIIToUTF16("Google")); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL news_url("http://news.google.com"); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 news_title(ASCIIToUTF16("Google News")); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(google1_url, google_title); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(news_url, news_title); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(GetPrepopulatePages().size() + 2, querier.urls().size()); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteURL(news_url); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for history to process the deletion. 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistory(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size()); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google_title, querier.urls()[0].title); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1)); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now reload. This verifies topsites actually wrote the deletion to disk. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size(), querier.urls().size()); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(google_title, querier.urls()[0].title); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 1)); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteURL(google1_url); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for history to process the deletion. 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistory(); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size()); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now reload. This verifies topsites actually wrote the deletion to disk. 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RefreshTopSitesAndRecreate(); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier.QueryTopSites(top_sites(), false); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(GetPrepopulatePages().size(), querier.urls().size()); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier, 0)); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure GetUpdateDelay is updated appropriately. 879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, GetUpdateDelay) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLastNumUrlsChanged(0); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(30, GetUpdateDelay().InSeconds()); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList url_list; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_list.resize(20); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL tmp_url(GURL("http://x")); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < url_list.size(); ++i) { 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_list[i].url = tmp_url; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_list[i].redirects.push_back(tmp_url); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(url_list); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20u, last_num_urls_changed()); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLastNumUrlsChanged(0); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(60, GetUpdateDelay().InMinutes()); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLastNumUrlsChanged(3); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(52, GetUpdateDelay().InMinutes()); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLastNumUrlsChanged(20); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetUpdateDelay().InMinutes()); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TopSitesMigrationTest, Migrate) { 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsTopSitesLoaded()); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the data was migrated to top sites. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(MigrationAssertions()); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to wait for top sites and history to finish processing requests. 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForTopSites(); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForHistory(); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure there is no longer a Thumbnails file on disk. 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(file_util::PathExists( 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetPath().Append(chrome::kThumbnailsFilename))); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate top sites and make sure everything is still there. 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateHistoryService(false, false); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateTopSitesAndBlock(); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(MigrationAssertions()); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that callbacks are notified correctly if requested before top sites 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has loaded. 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, NotifyCallbacksWhenLoaded) { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate top sites. It won't be loaded now. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsTopSitesLoaded()); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier1; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier2; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier3; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the queries. 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier1.QueryTopSites(top_sites(), false); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier2.QueryTopSites(top_sites(), false); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier3.QueryTopSites(top_sites(), false); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We shouldn't have gotten a callback. 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier1.number_of_callbacks()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier2.number_of_callbacks()); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier3.number_of_callbacks()); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for loading to complete. 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we should have gotten the callbacks. 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier1.number_of_callbacks()); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size()); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier2.number_of_callbacks()); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetPrepopulatePages().size(), querier2.urls().size()); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier3.number_of_callbacks()); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetPrepopulatePages().size(), querier3.urls().size()); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the top sites. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList pages; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.url = GURL("http://1.com/"); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.redirects.push_back(url.url); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pages.push_back(url); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.url = GURL("http://2.com/"); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.redirects.push_back(url.url); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pages.push_back(url); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(pages); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate top sites. It won't be loaded now. 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsTopSitesLoaded()); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier4; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query again. 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier4.QueryTopSites(top_sites(), false); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We shouldn't have gotten a callback. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier4.number_of_callbacks()); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for loading to complete. 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we should have gotten the callbacks. 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier4.number_of_callbacks()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size(), querier4.urls().size()); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://1.com/", querier4.urls()[0].url.spec()); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://2.com/", querier4.urls()[1].url.spec()); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier4, 2)); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the top sites again, this time don't reload. 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.url = GURL("http://3.com/"); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.redirects.push_back(url.url); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pages.push_back(url); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(pages); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query again. 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier5; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier5.QueryTopSites(top_sites(), true); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier5.number_of_callbacks()); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3u + GetPrepopulatePages().size(), querier5.urls().size()); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://1.com/", querier5.urls()[0].url.spec()); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://2.com/", querier5.urls()[1].url.spec()); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://3.com/", querier5.urls()[2].url.spec()); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(querier5, 3)); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure canceled requests are not notified. 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, CancelingRequestsForTopSites) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate top sites. It won't be loaded now. 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsTopSitesLoaded()); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier1; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier querier2; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts the queries. 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier1.QueryTopSites(top_sites(), false); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier2.QueryTopSites(top_sites(), false); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We shouldn't have gotten a callback. 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier1.number_of_callbacks()); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier2.number_of_callbacks()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) querier2.CancelRequest(); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for loading to complete. 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first callback should succeed. 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, querier1.number_of_callbacks()); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetPrepopulatePages().size(), querier1.urls().size()); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the canceled callback should not be notified. 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, querier2.number_of_callbacks()); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure temporary thumbnails are copied over correctly. 1042c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, AddTemporaryThumbnail) { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL unknown_url("http://news.google.com/"); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL invalid_url("chrome://thumb/http://google.com/"); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1a("http://google.com/"); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1b("http://www.google.com/"); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a dummy thumbnail. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Image thumbnail(CreateBitmap(SK_ColorRED)); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore medium_score(0.5, true, true, base::Time::Now()); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't store thumbnails for Javascript URLs. 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->SetPageThumbnail(invalid_url, 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail, 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) medium_score)); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store thumbnails for unknown (but valid) URLs temporarily - calls 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AddTemporaryThumbnail. 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->SetPageThumbnail(unknown_url, 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumbnail, 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) medium_score)); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We shouldn't get the thumnail back though (the url isn't in to sites yet). 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> out; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->GetPageThumbnail(unknown_url, &out)); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But we should be able to get the temporary page thumbnail score. 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore out_score; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->GetTemporaryPageThumbnailScore(unknown_url, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &out_score)); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(medium_score.Equals(out_score)); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<MostVisitedURL> list; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL mv; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.url = unknown_url; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(mv.url); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(url1a); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mv.redirects.push_back(url1b); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(mv); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update URLs. This should result in using thumbnail. 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(list); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(top_sites()->GetPageThumbnail(unknown_url, &out)); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThumbnailEqualsBytes(thumbnail, out.get())); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests variations of blacklisting. 1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, Blacklisting) { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList pages; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURL url, url1; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.url = GURL("http://bbc.com/"); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.redirects.push_back(url.url); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pages.push_back(url); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url1.url = GURL("http://google.com/"); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url1.redirects.push_back(url1.url); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pages.push_back(url1); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetTopSites(pages); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/"))); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist google.com. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->AddBlacklistedURL(GURL("http://google.com/")); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL prepopulate_url = GetPrepopulatePages()[0].url; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->HasBlacklistedItems()); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->IsBlacklisted(GURL("http://google.com/"))); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://bbc.com/"))); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->IsBlacklisted(prepopulate_url)); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the blacklisted site isn't returned in the results. 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier q; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.QueryTopSites(top_sites(), true); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size()); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec()); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1)); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Recreate top sites and make sure blacklisted url was correctly read. 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecreateTopSitesAndBlock(); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier q; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.QueryTopSites(top_sites(), true); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size(), q.urls().size()); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec()); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 1)); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blacklist one of the prepopulate urls. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->AddBlacklistedURL(prepopulate_url); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->HasBlacklistedItems()); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the blacklisted prepopulate url isn't returned. 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier q; 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.QueryTopSites(top_sites(), true); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u + GetPrepopulatePages().size() - 1, q.urls().size()); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec()); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 1; i < q.urls().size(); ++i) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(prepopulate_url.spec(), q.urls()[i].url.spec()); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark google as no longer blacklisted. 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->RemoveBlacklistedURL(GURL("http://google.com/")); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(top_sites()->HasBlacklistedItems()); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->IsBlacklisted(GURL("http://google.com/"))); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure google is returned now. 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier q; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.QueryTopSites(top_sites(), true); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size() - 1, q.urls().size()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec()); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://google.com/", q.urls()[1].url.spec()); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Android has only one prepopulated page which has been blacklisted, so 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // only 2 urls are returned. 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (q.urls().size() > 2) 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(prepopulate_url.spec(), q.urls()[2].url.spec()); 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, GetPrepopulatePages().size()); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove all blacklisted sites. 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_sites()->ClearBlacklistedURLs(); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(top_sites()->HasBlacklistedItems()); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier q; 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.QueryTopSites(top_sites(), true); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u + GetPrepopulatePages().size(), q.urls().size()); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://bbc.com/", q.urls()[0].url.spec()); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("http://google.com/", q.urls()[1].url.spec()); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 2)); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure prepopulated pages exist. 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, AddPrepopulatedPages) { 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesQuerier q; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.QueryTopSites(top_sites(), true); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetPrepopulatePages().size(), q.urls().size()); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0)); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MostVisitedURLList pages = q.urls(); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(AddPrepopulatedPages(&pages)); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetPrepopulatePages().size(), pages.size()); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q.set_urls(pages); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ContainsPrepopulatePages(q, 0)); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure creating top sites before history is created works. 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TopSitesImplTest, CreateTopSitesThenHistory) { 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->DestroyTopSites(); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->DestroyHistoryService(); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the TopSites file. This forces TopSites to wait until history loads 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before TopSites is considered loaded. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::Delete(profile()->GetPath().Append(chrome::kTopSitesFilename), 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create TopSites, but not History. 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WaitForTopSites(); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsTopSitesLoaded()); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load history, which should make TopSites finish loading too. 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateHistoryService(false, false); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsTopSitesLoaded()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TopSitesUnloadTest : public TopSitesImplTest { 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TopSitesUnloadTest() {} 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CreateHistoryAndTopSites() OVERRIDE { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TopSitesUnloadTest); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure if history is unloaded after topsites is loaded we don't hit any 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// assertions. 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TopSitesUnloadTest, UnloadHistoryTest) { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateHistoryService(false, false); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilTopSitesLoaded(); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryServiceFactory::GetForProfile( 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(), Profile::EXPLICIT_ACCESS)->UnloadBackend(); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilHistoryProcessesPendingRequests(); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure if history (with migration code) is unloaded after topsites is 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loaded we don't hit any assertions. 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TopSitesUnloadTest, UnloadWithMigration) { 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up history and thumbnails as they would be before migration. 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_path; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_path)); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path = data_path.AppendASCII("top_sites"); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExecuteSQLScript( 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("history.19.sql"), 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetPath().Append(chrome::kHistoryFilename))); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ExecuteSQLScript( 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_path.AppendASCII("thumbnails.3.sql"), 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetPath().Append(chrome::kThumbnailsFilename))); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create history and block until it's loaded. 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateHistoryService(false, false); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilHistoryProcessesPendingRequests(); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create top sites and unload history. 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver observer( 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TOP_SITES_LOADED, 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile())); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->CreateTopSites(); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryServiceFactory::GetForProfile( 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile(), Profile::EXPLICIT_ACCESS)->UnloadBackend(); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilHistoryProcessesPendingRequests(); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer.Wait(); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 1268