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