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) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/run_loop.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_test_helpers.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_utils.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_notifications.h" 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_database.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_history_backend.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_filter.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h" 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/test/test_browser_thread.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::TimeDelta; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file only tests functionality where it is most convenient to call the 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// backend directly. Most of the history backend functions are tested by the 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history unit test. Because of the elaborate callbacks involved, this is no 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// harder than calling it directly for many things. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const gfx::Size kTinySize = gfx::Size(10, 10); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const gfx::Size kSmallSize = gfx::Size(16, 16); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const gfx::Size kLargeSize = gfx::Size(32, 32); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Comparison functions as to make it easier to check results of 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetFaviconBitmaps() and GetIconMappingsForPageURL(). 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IconMappingLessThan(const history::IconMapping& a, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::IconMapping& b) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.icon_url < b.icon_url; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FaviconBitmapLessThan(const history::FaviconBitmap& a, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::FaviconBitmap& b) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return a.pixel_size.GetArea() < b.pixel_size.GetArea(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackendTest; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This must be a separate object since HistoryBackend manages its lifetime. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This just forwards the messages we're interested in to the test object. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackendTestDelegate : public HistoryBackend::Delegate { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HistoryBackendTestDelegate(HistoryBackendTest* test) : test_(test) {} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyProfileError(int backend_id, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::InitStatus init_status) OVERRIDE {} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetInMemoryBackend(int backend_id, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InMemoryHistoryBackend* backend) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BroadcastNotifications(int type, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryDetails* details) OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DBLoaded(int backend_id) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyVisitDBObserversOnAddVisit( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BriefVisitInfo& info) OVERRIDE {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not owned by us. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryBackendTest* test_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackendCancelableRequest 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CancelableRequestProvider, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public CancelableRequestConsumerTSimple<int> { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryBackendCancelableRequest() {} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<class RequestType> 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestProvider::Handle MockScheduleOfRequest( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestType* request) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRequest(request, this); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return request->handle(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryBackendTest : public testing::Test { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryBackendTest() 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : bookmark_model_(NULL), 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_(false), 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) num_broadcasted_notifications_(0), 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui_thread_(content::BrowserThread::UI, &message_loop_) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HistoryBackendTest() { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for QueryMostVisited. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnQueryMostVisited(CancelableRequestProvider::Handle handle, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::MostVisitedURLList data) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) most_visited_list_.swap(data); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for QueryFiltered. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnQueryFiltered(CancelableRequestProvider::Handle handle, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::FilteredURLList& data) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_list_ = data; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::MostVisitedURLList& get_most_visited_list() const { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return most_visited_list_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::FilteredURLList& get_filtered_list() const { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return filtered_list_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_broadcasted_notifications() const { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return num_broadcasted_notifications_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HistoryBackend> backend_; // Will be NULL on init failure. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<InMemoryHistoryBackend> mem_backend_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddRedirectChain(const char* sequence[], int page_id) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime(sequence, page_id, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddRedirectChainWithTransitionAndTime( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* sequence[], 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int page_id, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList redirects; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; sequence[i] != NULL; ++i) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(GURL(sequence[i])); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int int_scope = 1; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* scope = 0; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&scope, &int_scope, sizeof(int_scope)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::HistoryAddPageArgs request( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.back(), time, scope, page_id, GURL(), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, transition, history::SOURCE_BROWSED, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds CLIENT_REDIRECT page transition. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |url1| is the source URL and |url2| is the destination. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |did_replace| is true if the transition is non-user initiated and the 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation entry for |url2| has replaced that for |url1|. The possibly 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updated transition code of the visit records for |url1| and |url2| is 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returned by filling in |*transition1| and |*transition2|, respectively. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |time| is a time of the redirect. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddClientRedirect(const GURL& url1, const GURL& url2, bool did_replace, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* transition1, int* transition2) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* const dummy_scope = reinterpret_cast<void*>(0x87654321); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList redirects; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url1.is_valid()) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url1); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url2.is_valid()) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url2); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs request( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url2, time, dummy_scope, 0, url1, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, content::PAGE_TRANSITION_CLIENT_REDIRECT, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_BROWSED, did_replace); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *transition1 = getTransition(url1); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *transition2 = getTransition(url2); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int getTransition(const GURL& url) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id = backend_->db()->GetRowForURL(url, &row); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return visits[0].transition; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath getTestDir() { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_dir_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a gfx::Size vector with small size. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size> GetSizesSmall() { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Size> sizes_small; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_small.push_back(kSmallSize); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sizes_small; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a gfx::Size vector with large size. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size> GetSizesLarge() { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Size> sizes_large; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_large.push_back(kLargeSize); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sizes_large; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a gfx::Size vector with small and large sizes. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size> GetSizesSmallAndLarge() { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Size> sizes_small_and_large; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_small_and_large.push_back(kSmallSize); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_small_and_large.push_back(kLargeSize); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sizes_small_and_large; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a gfx::Size vector with tiny, small and large sizes. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size> GetSizesTinySmallAndLarge() { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Size> sizes_tiny_small_and_large; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_tiny_small_and_large.push_back(kTinySize); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_tiny_small_and_large.push_back(kSmallSize); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizes_tiny_small_and_large.push_back(kLargeSize); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sizes_tiny_small_and_large; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns 1x and 2x scale factors. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<ui::ScaleFactor> GetScaleFactors1x2x() { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::ScaleFactor> scale_factors_1x_2x; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scale_factors_1x_2x.push_back(ui::SCALE_FACTOR_100P); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scale_factors_1x_2x.push_back(ui::SCALE_FACTOR_200P); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scale_factors_1x_2x; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of icon mappings of |icon_type| to |page_url|. 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) size_t NumIconMappingsForPageURL(const GURL& page_url, 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::IconType icon_type) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, icon_type, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return icon_mappings.size(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the icon mappings for |page_url| sorted alphabetically by icon 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL in ascending order. Returns true if there is at least one icon 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mapping. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetSortedIconMappingsForPageURL( 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping>* icon_mappings) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings)) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(icon_mappings->begin(), icon_mappings->end(), 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingLessThan); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the favicon bitmaps for |icon_id| sorted by pixel size in 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ascending order. Returns true if there is at least one favicon bitmap. 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool GetSortedFaviconBitmaps(chrome::FaviconID icon_id, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap>* favicon_bitmaps) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backend_->thumbnail_db_->GetFaviconBitmaps(icon_id, favicon_bitmaps)) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(favicon_bitmaps->begin(), favicon_bitmaps->end(), 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmapLessThan); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there is exactly one favicon bitmap associated to 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |favicon_id|. If true, returns favicon bitmap in output parameter. 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool GetOnlyFaviconBitmap(const chrome::FaviconID icon_id, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap* favicon_bitmap) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!backend_->thumbnail_db_->GetFaviconBitmaps(icon_id, &favicon_bitmaps)) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (favicon_bitmaps.size() != 1) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *favicon_bitmap = favicon_bitmaps[0]; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates |favicon_bitmap_data| with entries for the icon_urls and sizes 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. The bitmap_data for entries are lowercase letters of the 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // alphabet starting at 'a' for the entry at index 0. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenerateFaviconBitmapData( 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url1, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size>& icon_url1_sizes, 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData>* favicon_bitmap_data) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url1, icon_url1_sizes, GURL(), 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Size>(), favicon_bitmap_data); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GenerateFaviconBitmapData( 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url1, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size>& icon_url1_sizes, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& icon_url2, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<gfx::Size>& icon_url2_sizes, 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData>* favicon_bitmap_data) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_data->clear(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char bitmap_char = 'a'; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < icon_url1_sizes.size(); ++i) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back(bitmap_char); 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconBitmapData bitmap_data_element; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.bitmap_data = 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&data); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.pixel_size = icon_url1_sizes[i]; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.icon_url = icon_url1; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_data->push_back(bitmap_data_element); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++bitmap_char; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < icon_url2_sizes.size(); ++i) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back(bitmap_char); 34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconBitmapData bitmap_data_element; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.bitmap_data = 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&data); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.pixel_size = icon_url2_sizes[i]; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.icon_url = icon_url2; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_data->push_back(bitmap_data_element); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++bitmap_char; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |bitmap_data| is equal to |expected_data|. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool BitmapDataEqual(char expected_data, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bitmap_data.get() && 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data->size() == 1u && 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *bitmap_data->front() == expected_data; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel bookmark_model_; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing::Test 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("BackendTest"), 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &test_dir_)) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = new HistoryBackend(test_dir_, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new HistoryBackendTestDelegate(this), 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bookmark_model_); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Init(std::string(), false); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool loaded_; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class HistoryBackendTestDelegate; 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (backend_.get()) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Closing(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = NULL; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem_backend_.reset(); 3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(test_dir_, true); 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::RunLoop().RunUntilIdle(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetInMemoryBackend(int backend_id, InMemoryHistoryBackend* backend) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem_backend_.reset(backend); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BroadcastNotifications(int type, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryDetails* details) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_broadcasted_notifications_; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the notifications directly to the in-memory database. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<HistoryDetails> det(details); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mem_backend_->Observe(type, content::Source<HistoryBackendTest>(NULL), det); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The backend passes ownership of the details pointer to us. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete details; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The number of notifications which were broadcasted. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_broadcasted_notifications_; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_dir_; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::MostVisitedURLList most_visited_list_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::FilteredURLList filtered_list_; 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::TestBrowserThread ui_thread_; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryBackendTestDelegate::SetInMemoryBackend(int backend_id, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InMemoryHistoryBackend* backend) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_->SetInMemoryBackend(backend_id, backend); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryBackendTestDelegate::BroadcastNotifications( 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryDetails* details) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_->BroadcastNotifications(type, details); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryBackendTestDelegate::DBLoaded(int backend_id) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_->loaded_ = true; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114287 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_Loaded DISABLED_Loaded 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_Loaded Loaded 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MAYBE_Loaded) { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(loaded_); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, DeleteAll) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add two favicons, each with two bitmaps. Note that we add favicon2 before 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // adding favicon1. This is so that favicon1 one gets ID 2 autoassigned to 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the database, which will change when the other one is deleted. This way 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we can test that updating works properly. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL favicon_url1("http://www.google.com/favicon.ico"); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL favicon_url2("http://news.google.com/favicon.ico"); 45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon2 = backend_->thumbnail_db_->AddFavicon(favicon_url2, 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::FAVICON); 45290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon1 = backend_->thumbnail_db_->AddFavicon(favicon_url1, 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome::FAVICON); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('a'); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddFaviconBitmap(favicon1, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data), Time::Now(), kSmallSize)); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[0] = 'b'; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddFaviconBitmap(favicon1, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data), Time::Now(), kLargeSize)); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[0] = 'c'; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddFaviconBitmap(favicon2, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data), Time::Now(), kSmallSize)); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[0] = 'd'; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddFaviconBitmap(favicon2, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data), Time::Now(), kLargeSize)); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First visit two URLs. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row1(GURL("http://www.google.com/")); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_visit_count(2); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_typed_count(1); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_last_visit(Time::Now()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_->AddIconMapping(row1.url(), favicon1); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row2(GURL("http://news.google.com/")); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row2.set_visit_count(1); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row2.set_last_visit(Time::Now()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_->AddIconMapping(row2.url(), favicon2); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRows rows; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row2); // Reversed order for the same reason as favicons. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row1); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPagesWithDetails(rows, history::SOURCE_BROWSED); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID row1_id = backend_->db_->GetRowForURL(row1.url(), NULL); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID row2_id = backend_->db_->GetRowForURL(row2.url(), NULL); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the two visits for the URLs we just added. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetVisitsForURL(row1_id, &visits); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits.size()); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits.clear(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetVisitsForURL(row2_id, &visits); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits.size()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The in-memory backend should have been set and it should have gotten the 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // typed URL. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mem_backend_.get()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow outrow1; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mem_backend_->db_->GetRowForURL(row1.url(), NULL)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Star row1. 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_.AddURL( 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bookmark_model_.bookmark_bar_node(), 0, base::string16(), row1.url()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now finally clear all history. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first URL should be preserved but the time should be cleared. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->db_->GetRowForURL(row1.url(), &outrow1)); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row1.url(), outrow1.url()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, outrow1.visit_count()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, outrow1.typed_count()); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(Time() == outrow1.last_visit()); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The second row should be deleted. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow outrow2; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(row2.url(), &outrow2)); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All visits should be deleted for both URLs. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector all_visits; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetAllVisitsInRange(Time(), Time(), 0, &all_visits); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, all_visits.size()); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should have a favicon and favicon bitmaps for the first URL only. We 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // look them up by favicon URL since the IDs may have changed. 53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID out_favicon1 = backend_->thumbnail_db_-> 53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetFaviconIDForFaviconURL(favicon_url1, chrome::FAVICON, NULL); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(out_favicon1); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_favicon1, &favicon_bitmaps)); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, favicon_bitmaps.size()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap favicon_bitmap1 = favicon_bitmaps[0]; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap favicon_bitmap2 = favicon_bitmaps[1]; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Favicon bitmaps do not need to be in particular order. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (favicon_bitmap1.pixel_size == kLargeSize) { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap tmp_favicon_bitmap = favicon_bitmap1; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap1 = favicon_bitmap2; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap2 = tmp_favicon_bitmap; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap1.bitmap_data)); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap1.pixel_size); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmap2.bitmap_data)); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLargeSize, favicon_bitmap2.pixel_size); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID out_favicon2 = backend_->thumbnail_db_-> 55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetFaviconIDForFaviconURL(favicon_url2, chrome::FAVICON, NULL); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(out_favicon2) << "Favicon not deleted"; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The remaining URL should still reference the same favicon, even if its 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID has changed. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> mappings; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 56390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) outrow1.url(), chrome::FAVICON, &mappings)); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, mappings.size()); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(out_favicon1, mappings[0].icon_id); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The first URL should still be bookmarked. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bookmark_model_.IsBookmarked(row1.url())); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks that adding a visit, then calling DeleteAll, and then trying to add 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data for the visited page works. This can happen when clearing the history 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// immediately after visiting a page. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, DeleteAllThenAddData) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time visit_time = Time::Now(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com/"); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs request(url, visit_time, NULL, 0, GURL(), 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_KEYWORD_GENERATED, 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_BROWSED, false); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that a row was added. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow outrow; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->db_->GetRowForURL(url, &outrow)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the visit was added. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector all_visits; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetAllVisitsInRange(Time(), Time(), 0, &all_visits); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, all_visits.size()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The row should be deleted. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(url, &outrow)); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The visit should be deleted. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetAllVisitsInRange(Time(), Time(), 0, &all_visits); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, all_visits.size()); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 604bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Try and set the title. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->SetPageTitle(url, UTF8ToUTF16("Title")); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The row should still be deleted. 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(url, &outrow)); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The visit should still be deleted. 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetAllVisitsInRange(Time(), Time(), 0, &all_visits); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, all_visits.size()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, URLsNoLongerBookmarked) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL favicon_url1("http://www.google.com/favicon.ico"); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL favicon_url2("http://news.google.com/favicon.ico"); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('1'); 62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon1 = backend_->thumbnail_db_->AddFavicon( 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_url1, 62390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data), 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now(), 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size()); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[0] = '2'; 62990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon2 = backend_->thumbnail_db_->AddFavicon( 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_url2, 63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data), 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now(), 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size()); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First visit two URLs. 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row1(GURL("http://www.google.com/")); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_visit_count(2); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_typed_count(1); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_last_visit(Time::Now()); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddIconMapping(row1.url(), favicon1)); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row2(GURL("http://news.google.com/")); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row2.set_visit_count(1); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row2.set_last_visit(Time::Now()); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddIconMapping(row2.url(), favicon2)); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRows rows; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row2); // Reversed order for the same reason as favicons. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row1); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPagesWithDetails(rows, history::SOURCE_BROWSED); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID row1_id = backend_->db_->GetRowForURL(row1.url(), NULL); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID row2_id = backend_->db_->GetRowForURL(row2.url(), NULL); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Star the two URLs. 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bookmark_utils::AddIfNotBookmarked(&bookmark_model_, row1.url(), 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bookmark_utils::AddIfNotBookmarked(&bookmark_model_, row2.url(), 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16()); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete url 2. Because url 2 is starred this won't delete the URL, only 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the visits. 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->expirer_.DeleteURL(row2.url()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure url 2 is still valid, but has no visits. 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow tmp_url_row; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row2_id, backend_->db_->GetRowForURL(row2.url(), NULL)); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetVisitsForURL(row2_id, &visits); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, visits.size()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The favicon should still be valid. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon2, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL(favicon_url2, 67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unstar row2. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::RemoveAllBookmarks(&bookmark_model_, row2.url()); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the backend it was unstarred. We have to explicitly do this as 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BookmarkModel isn't wired up to the backend during testing. 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> unstarred_urls; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unstarred_urls.insert(row2.url()); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->URLsNoLongerBookmarked(unstarred_urls); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL should no longer exist. 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(row2.url(), &tmp_url_row)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And the favicon should be deleted. 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL(favicon_url2, 69290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unstar row 1. 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::RemoveAllBookmarks(&bookmark_model_, row1.url()); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the backend it was unstarred. We have to explicitly do this as 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BookmarkModel isn't wired up to the backend during testing. 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unstarred_urls.clear(); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unstarred_urls.insert(row1.url()); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->URLsNoLongerBookmarked(unstarred_urls); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL should still exist (because there were visits). 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row1_id, backend_->db_->GetRowForURL(row1.url(), NULL)); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should still be visits. 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits.clear(); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetVisitsForURL(row1_id, &visits); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, visits.size()); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The favicon should still be valid. 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon1, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL(favicon_url1, 71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests a handful of assertions for a navigation with a type of 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KEYWORD_GENERATED. 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, KeywordGenerated) { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://google.com"); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time visit_time = Time::Now() - base::TimeDelta::FromDays(1); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs request(url, visit_time, NULL, 0, GURL(), 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_KEYWORD_GENERATED, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_BROWSED, false); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A row should have been added for the url. 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id = backend_->db()->GetRowForURL(url, &row); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(0, url_id); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The typed count should be 1. 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, row.typed_count()); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // KEYWORD_GENERATED urls should not be added to the segment db. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string segment_name = VisitSegmentDatabase::ComputeSegmentName(url); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, backend_->db()->GetSegmentNamed(segment_name)); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One visit should be added. 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->db()->GetVisitsForURL(url_id, &visits)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, visits.size()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // But no visible visits. 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits.clear(); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QueryOptions query_options; 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) query_options.max_count = 1; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db()->GetVisibleVisitsInRange(query_options, &visits); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(visits.empty()); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expire the visits. 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> restrict_urls; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->expire_backend()->ExpireHistoryBetween(restrict_urls, 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_time, Time::Now()); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The visit should have been nuked. 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits.clear(); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->db()->GetVisitsForURL(url_id, &visits)); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(visits.empty()); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As well as the url. 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, backend_->db()->GetRowForURL(url, &row)); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, ClientRedirect) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int transition1; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int transition2; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initial transition to page A. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_a("http://google.com/a"); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddClientRedirect(GURL(), url_a, false, base::Time(), 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transition1, &transition2); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transition2 & content::PAGE_TRANSITION_CHAIN_END); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User initiated redirect to page B. 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_b("http://google.com/b"); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddClientRedirect(url_a, url_b, false, base::Time(), 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transition1, &transition2); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transition1 & content::PAGE_TRANSITION_CHAIN_END); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transition2 & content::PAGE_TRANSITION_CHAIN_END); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-user initiated redirect to page C. 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_c("http://google.com/c"); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddClientRedirect(url_b, url_c, true, base::Time(), 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transition1, &transition2); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(transition1 & content::PAGE_TRANSITION_CHAIN_END); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(transition2 & content::PAGE_TRANSITION_CHAIN_END); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, ImportedFaviconsTest) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup test data - two Urls in the history, one with favicon assigned and 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one without. 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL favicon_url1("http://www.google.com/favicon.ico"); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('1'); 80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon1 = backend_->thumbnail_db_->AddFavicon( 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_url1, 80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&data), 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now(), 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size()); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row1(GURL("http://www.google.com/")); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_visit_count(1); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row1.set_last_visit(Time::Now()); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->AddIconMapping(row1.url(), favicon1)); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row2(GURL("http://news.google.com/")); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row2.set_visit_count(1); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row2.set_last_visit(Time::Now()); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRows rows; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row1); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row2); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPagesWithDetails(rows, history::SOURCE_BROWSED); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow url_row1, url_row2; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(row1.url(), &url_row1) == 0); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(row2.url(), &url_row2) == 0); 82490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(row1.url(), chrome::FAVICON)); 82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, NumIconMappingsForPageURL(row2.url(), chrome::FAVICON)); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now provide one imported favicon for both URLs already in the registry. 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The new favicon should only be used with the URL that doesn't already have 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a favicon. 830a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::vector<ImportedFaviconUsage> favicons; 831a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ImportedFaviconUsage favicon; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.favicon_url = GURL("http://news.google.com/favicon.ico"); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.png_data.push_back('2'); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.urls.insert(row1.url()); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.urls.insert(row2.url()); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicons.push_back(favicon); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->SetImportedFavicons(favicons); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(row1.url(), &url_row1) == 0); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(row2.url(), &url_row2) == 0); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> mappings; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 84390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) row1.url(), chrome::FAVICON, &mappings)); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, mappings.size()); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon1, mappings[0].icon_id); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_url1, mappings[0].icon_url); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mappings.clear(); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) row2.url(), chrome::FAVICON, &mappings)); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, mappings.size()); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon.favicon_url, mappings[0].icon_url); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A URL should not be added to history (to store favicon), if 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the URL is not bookmarked. 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url3("http://mail.google.com"); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicons.clear(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.favicon_url = GURL("http://mail.google.com/favicon.ico"); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.png_data.push_back('3'); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon.urls.insert(url3); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicons.push_back(favicon); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->SetImportedFavicons(favicons); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow url_row3; 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->db_->GetRowForURL(url3, &url_row3) == 0); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the URL is bookmarked, it should get added to history with 0 visits. 867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bookmark_model_.AddURL(bookmark_model_.bookmark_bar_node(), 0, 868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(), url3); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->SetImportedFavicons(favicons); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(backend_->db_->GetRowForURL(url3, &url_row3) == 0); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(url_row3.visit_count() == 0); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, StripUsernamePasswordTest) { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://anyuser:anypass@www.google.com"); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL stripped_url("http://www.google.com"); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Visit the url with username, password. 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPageVisit(url, base::Time::Now(), 0, 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransitionFromInt( 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransitionGetQualifier(content::PAGE_TRANSITION_TYPED)), 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_BROWSED); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch the row information about stripped url from history db. 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID row_id = backend_->db_->GetRowForURL(stripped_url, NULL); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetVisitsForURL(row_id, &visits); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if stripped url is stored in database. 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits.size()); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, AddPageVisitSource) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.google.com"); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume visiting the url from an externsion. 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPageVisit( 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, base::Time::Now(), 0, content::PAGE_TRANSITION_TYPED, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_EXTENSION); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume the url is imported from Firefox. 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPageVisit(url, base::Time::Now(), 0, 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_FIREFOX_IMPORTED); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume this url is also synced. 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPageVisit(url, base::Time::Now(), 0, 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_SYNCED); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fetch the row information about the url from history db. 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID row_id = backend_->db_->GetRowForURL(url, NULL); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->GetVisitsForURL(row_id, &visits); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if all the visits to the url are stored in database. 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, visits.size()); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitSourceMap visit_sources; 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->GetVisitsSource(visits, &visit_sources)); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, visit_sources.size()); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sources = 0; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; i++) { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (visit_sources[visits[i].visit_id]) { 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case history::SOURCE_EXTENSION: 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sources |= 0x1; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case history::SOURCE_FIREFOX_IMPORTED: 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sources |= 0x2; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case history::SOURCE_SYNCED: 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sources |= 0x4; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0x7, sources); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(HistoryBackendTest, AddPageVisitNotLastVisit) { 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(backend_.get()); 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL url("http://www.google.com"); 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear all history. 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) backend_->DeleteAllHistory(); 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create visit times 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time recent_time = base::Time::Now(); 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta visit_age = base::TimeDelta::FromDays(3); 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Time older_time = recent_time - visit_age; 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Visit the url with recent time. 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) backend_->AddPageVisit(url, recent_time, 0, 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PageTransitionFromInt( 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PageTransitionGetQualifier(content::PAGE_TRANSITION_TYPED)), 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::SOURCE_BROWSED); 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add to the url a visit with older time (could be syncing from another 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // client, etc.). 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) backend_->AddPageVisit(url, older_time, 0, 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PageTransitionFromInt( 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::PageTransitionGetQualifier(content::PAGE_TRANSITION_TYPED)), 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::SOURCE_SYNCED); 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Fetch the row information about url from history db. 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VisitVector visits; 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLRow row; 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) URLID row_id = backend_->db_->GetRowForURL(url, &row); 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) backend_->db_->GetVisitsForURL(row_id, &visits); 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Last visit time should be the most recent time, not the most recently added 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // visit. 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(2U, visits.size()); 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(recent_time, row.last_visit()); 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, AddPageArgsSource) { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://testpageargs.com"); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume this page is browsed by user. 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs request1(url, base::Time::Now(), NULL, 0, GURL(), 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_KEYWORD_GENERATED, 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_BROWSED, false); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request1); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume this page is synced. 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs request2(url, base::Time::Now(), NULL, 0, GURL(), 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_SYNCED, false); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request2); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Assume this page is browsed again. 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAddPageArgs request3(url, base::Time::Now(), NULL, 0, GURL(), 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED, 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::SOURCE_BROWSED, false); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddPage(request3); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Three visits should be added with proper sources. 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id = backend_->db()->GetRowForURL(url, &row); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, visits.size()); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitSourceMap visit_sources; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->GetVisitsSource(visits, &visit_sources)); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visit_sources.size()); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(history::SOURCE_SYNCED, visit_sources.begin()->second); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, AddVisitsSource) { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1("http://www.cnn.com"); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<VisitInfo> visits1, visits2; 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(5), 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(1), 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now(), content::PAGE_TRANSITION_LINK)); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url2("http://www.example.com"); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits2.push_back(VisitInfo( 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(10), 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits2.push_back(VisitInfo(Time::Now(), content::PAGE_TRANSITION_LINK)); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the visits. 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url1, visits1, history::SOURCE_IE_IMPORTED); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url2, visits2, history::SOURCE_SYNCED); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the visits were added with their sources. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id = backend_->db()->GetRowForURL(url1, &row); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, visits.size()); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitSourceMap visit_sources; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->GetVisitsSource(visits, &visit_sources)); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, visit_sources.size()); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; i++) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(history::SOURCE_IE_IMPORTED, visit_sources[visits[i].visit_id]); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = backend_->db()->GetRowForURL(url2, &row); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, visits.size()); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->GetVisitsSource(visits, &visit_sources)); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, visit_sources.size()); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; i++) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(history::SOURCE_SYNCED, visit_sources[visits[i].visit_id]); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetMostRecentVisits) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1("http://www.cnn.com"); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<VisitInfo> visits1; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(5), 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(1), 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now(), content::PAGE_TRANSITION_LINK)); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the visits. 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url1, visits1, history::SOURCE_IE_IMPORTED); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the visits were added with their sources. 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id = backend_->db()->GetRowForURL(url1, &row); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetMostRecentVisitsForURL(id, 1, &visits)); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits.size()); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(visits1[2].first, visits[0].visit_time); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, RemoveVisitsTransitions) { 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1("http://www.cnn.com"); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitInfo typed_visit( 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(6), 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitInfo reload_visit( 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(5), 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_RELOAD); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitInfo link_visit( 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(4), 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<VisitInfo> visits_to_add; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits_to_add.push_back(typed_visit); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits_to_add.push_back(reload_visit); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits_to_add.push_back(link_visit); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the visits. 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url1, visits_to_add, history::SOURCE_SYNCED); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the various counts are what we expect. 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id = backend_->db()->GetRowForURL(url1, &row); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, visits.size()); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, row.typed_count()); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, row.visit_count()); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now, delete the typed visit and verify that typed_count is updated. 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->RemoveVisits(VisitVector(1, visits[0]))); 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = backend_->db()->GetRowForURL(url1, &row); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, visits.size()); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, row.typed_count()); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, row.visit_count()); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the reload visit now and verify that none of the counts have 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed. 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->RemoveVisits(VisitVector(1, visits[0]))); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = backend_->db()->GetRowForURL(url1, &row); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits.size()); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, row.typed_count()); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, row.visit_count()); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the last visit and verify that we delete the URL. 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->RemoveVisits(VisitVector(1, visits[0]))); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, backend_->db()->GetRowForURL(url1, &row)); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, RemoveVisitsSource) { 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1("http://www.cnn.com"); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<VisitInfo> visits1, visits2; 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo( 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(5), 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1.push_back(VisitInfo(Time::Now(), 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url2("http://www.example.com"); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits2.push_back(VisitInfo( 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time::Now() - base::TimeDelta::FromDays(10), 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits2.push_back(VisitInfo(Time::Now(), content::PAGE_TRANSITION_LINK)); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the visits. 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url1, visits1, history::SOURCE_IE_IMPORTED); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url2, visits2, history::SOURCE_SYNCED); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the visits of url1 were added. 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID id = backend_->db()->GetRowForURL(url1, &row); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, visits.size()); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove these visits. 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->RemoveVisits(visits)); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now check only url2's source in visit_source table. 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitSourceMap visit_sources; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->GetVisitsSource(visits, &visit_sources)); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0U, visit_sources.size()); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id = backend_->db()->GetRowForURL(url2, &row); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, visits.size()); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->GetVisitsSource(visits, &visit_sources)); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, visit_sources.size()); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; i++) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(history::SOURCE_SYNCED, visit_sources[visits[i].visit_id]); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for migration of adding visit_source table. 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MigrationVisitSource) { 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Closing(); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = NULL; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath old_history_path; 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &old_history_path)); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_history_path = old_history_path.AppendASCII("History"); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_history_path = old_history_path.AppendASCII("HistoryNoSource"); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy history database file to current directory so that it will be deleted 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in Teardown. 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_history_path(getTestDir()); 12127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(new_history_path, true); 1213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(new_history_path); 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_history_file = 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_history_path.Append(chrome::kHistoryFilename); 12167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(old_history_path, new_history_file)); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = new HistoryBackend(new_history_path, 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new HistoryBackendTestDelegate(this), 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bookmark_model_); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Init(std::string(), false); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Closing(); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = NULL; 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now the database should already be migrated. 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check version first. 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur_version = HistoryDatabase::GetCurrentVersion(); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection db; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.Open(new_history_file)); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement s(db.GetUniqueStatement( 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT value FROM meta WHERE key = 'version'")); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(s.Step()); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_version = s.ColumnInt(0); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cur_version, file_version); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check visit_source table is created and empty. 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s.Assign(db.GetUniqueStatement( 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT name FROM sqlite_master WHERE name=\"visit_source\"")); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(s.Step()); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s.Assign(db.GetUniqueStatement("SELECT * FROM visit_source LIMIT 10")); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(s.Step()); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that SetFaviconMappingsForPageAndRedirects correctly updates icon 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mappings based on redirects, icon URLs and icon types. 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, SetFaviconMappingsForPageAndRedirects) { 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Init recent_redirects_ 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url1("http://www.google.com"); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url2("http://www.google.com/m"); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow url_info1(url1); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info1.set_visit_count(0); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info1.set_typed_count(0); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info1.set_last_visit(base::Time()); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info1.set_hidden(false); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->AddURL(url_info1); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow url_info2(url2); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info2.set_visit_count(0); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info2.set_typed_count(0); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info2.set_last_visit(base::Time()); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_info2.set_hidden(false); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->db_->AddURL(url_info2); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList redirects; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url2); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url1); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->recent_redirects_.Put(url1, redirects); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url1("http://www.google.com/icon"); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url2("http://www.google.com/icon2"); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate bitmap data for a page with two favicons. 127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> two_favicon_bitmap_data; 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url1, GetSizesSmallAndLarge(), 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_url2, GetSizesSmallAndLarge(), &two_favicon_bitmap_data); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generate bitmap data for a page with a single favicon. 127990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> one_favicon_bitmap_data; 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url1, GetSizesSmallAndLarge(), 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &one_favicon_bitmap_data); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add two favicons 128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url1, chrome::FAVICON, two_favicon_bitmap_data); 128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2u, NumIconMappingsForPageURL(url1, chrome::FAVICON)); 128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2u, NumIconMappingsForPageURL(url2, chrome::FAVICON)); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add one touch_icon 128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url1, chrome::TOUCH_ICON, one_favicon_bitmap_data); 129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url1, chrome::TOUCH_ICON)); 129190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url2, chrome::TOUCH_ICON)); 129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2u, NumIconMappingsForPageURL(url1, chrome::FAVICON)); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add one TOUCH_PRECOMPOSED_ICON 129590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons( 129690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url1, chrome::TOUCH_PRECOMPOSED_ICON, one_favicon_bitmap_data); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The touch_icon was replaced. 129890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, NumIconMappingsForPageURL(url1, chrome::TOUCH_ICON)); 129990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2u, NumIconMappingsForPageURL(url1, chrome::FAVICON)); 130090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, 130190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NumIconMappingsForPageURL(url1, chrome::TOUCH_PRECOMPOSED_ICON)); 130290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, 130390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NumIconMappingsForPageURL(url2, chrome::TOUCH_PRECOMPOSED_ICON)); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a touch_icon. 130690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url1, chrome::TOUCH_ICON, one_favicon_bitmap_data); 130790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url1, chrome::TOUCH_ICON)); 130890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2u, NumIconMappingsForPageURL(url1, chrome::FAVICON)); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The TOUCH_PRECOMPOSED_ICON was replaced. 131090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0u, 131190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NumIconMappingsForPageURL(url1, chrome::TOUCH_PRECOMPOSED_ICON)); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a single favicon. 131490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url1, chrome::FAVICON, one_favicon_bitmap_data); 131590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url1, chrome::TOUCH_ICON)); 131690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url1, chrome::FAVICON)); 131790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url2, chrome::FAVICON)); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add two favicons. 132090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url1, chrome::FAVICON, two_favicon_bitmap_data); 132190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1u, NumIconMappingsForPageURL(url1, chrome::TOUCH_ICON)); 132290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2u, NumIconMappingsForPageURL(url1, chrome::FAVICON)); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that there is no churn in icon mappings from calling 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// SetFavicons() twice with the same |favicon_bitmap_data| parameter. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, SetFaviconMappingsForPageDuplicates) { 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url("http://www.google.com/"); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url("http://www.google.com/icon"); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmallAndLarge(), 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &favicon_bitmap_data); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url, chrome::FAVICON, favicon_bitmap_data); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 133990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, chrome::FAVICON, &icon_mappings)); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IconMappingID mapping_id = icon_mappings[0].mapping_id; 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url, chrome::FAVICON, favicon_bitmap_data); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, chrome::FAVICON, &icon_mappings)); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The same row in the icon_mapping table should be used for the mapping as 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before. 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(mapping_id, icon_mappings[0].mapping_id); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that calling SetFavicons() with FaviconBitmapData of different pixel 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sizes than the initially passed in FaviconBitmapData deletes the no longer 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// used favicon bitmaps. 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryBackendTest, SetFaviconsDeleteBitmaps) { 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL icon_url("http://www.google.com/icon"); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmallAndLarge(), 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmap_data); 136590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test initial state. 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<IconMapping> icon_mappings; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetSortedIconMappingsForPageURL(page_url, &icon_mappings)); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings[0].icon_url); 137290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, icon_mappings[0].icon_type); 137390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon_id = icon_mappings[0].icon_id; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetSortedFaviconBitmaps(favicon_id, &favicon_bitmaps)); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, favicon_bitmaps.size()); 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconBitmapID small_bitmap_id = favicon_bitmaps[0].bitmap_id; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, small_bitmap_id); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmaps[0].bitmap_data)); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmaps[0].pixel_size); 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconBitmapID large_bitmap_id = favicon_bitmaps[1].bitmap_id; 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, large_bitmap_id); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmaps[1].bitmap_data)); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kLargeSize, favicon_bitmaps[1].pixel_size); 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call SetFavicons() with bitmap data for only the large bitmap. Check that 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the small bitmap is in fact deleted. 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesLarge(), &favicon_bitmap_data); 139090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data_out; 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size pixel_size_out; 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(backend_->thumbnail_db_->GetFaviconBitmap(small_bitmap_id, 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, &bitmap_data_out, &pixel_size_out)); 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmap(large_bitmap_id, 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, &bitmap_data_out, &pixel_size_out)); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', bitmap_data_out)); 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kLargeSize, pixel_size_out); 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings.clear(); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call SetFavicons() with no bitmap data. Check that the bitmaps and icon 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mappings are deleted. 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_data.clear(); 141090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(backend_->thumbnail_db_->GetFaviconBitmap(large_bitmap_id, NULL, 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, NULL)); 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifications should have been broadcast for each call to SetFavicons(). 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, num_broadcasted_notifications()); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test updating a single favicon bitmap's data via SetFavicons. 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, SetFaviconsReplaceBitmapData) { 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url("http://www.google.com/icon"); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data_initial; 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_initial.push_back('a'); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconBitmapData bitmap_data_element; 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.bitmap_data = 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&data_initial); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.pixel_size = kSmallSize; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data_element.icon_url = icon_url; 143590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmap_data.push_back(bitmap_data_element); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add bitmap to the database. 143990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID original_favicon_id = 144290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 144390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL); 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, original_favicon_id); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap original_favicon_bitmap; 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOnlyFaviconBitmap(original_favicon_id, &original_favicon_bitmap)); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', original_favicon_bitmap.bitmap_data)); 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, num_broadcasted_notifications()); 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call SetFavicons() with completely identical data. 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> updated_data; 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updated_data.push_back('a'); 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); 145690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID updated_favicon_id = 145990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 146090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, updated_favicon_id); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap updated_favicon_bitmap; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', updated_favicon_bitmap.bitmap_data)); 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because the bitmap data is byte equivalent, no notifications should have 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // been broadcasted. 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, num_broadcasted_notifications()); 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Call SetFavicons() with identical data but a different bitmap. 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updated_data[0] = 'b'; 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) favicon_bitmap_data[0].bitmap_data = new base::RefCountedBytes(updated_data); 147490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updated_favicon_id = 147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 147890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, updated_favicon_id); 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE( 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetOnlyFaviconBitmap(updated_favicon_id, &updated_favicon_bitmap)); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', updated_favicon_bitmap.bitmap_data)); 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There should be no churn in FaviconIDs or FaviconBitmapIds even though 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the bitmap data changed. 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_favicon_bitmap.icon_id, updated_favicon_bitmap.icon_id); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(original_favicon_bitmap.bitmap_id, 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updated_favicon_bitmap.bitmap_id); 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A notification should have been broadcasted as the favicon bitmap data has 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed. 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, num_broadcasted_notifications()); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that if two pages share the same FaviconID, changing the favicon for 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one page does not affect the other. 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, SetFaviconsSameFaviconURLForTwoPages) { 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url("http://www.google.com/favicon.ico"); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url_new("http://www.google.com/favicon2.ico"); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url1("http://www.google.com"); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url2("http://www.google.ca"); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 150390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmallAndLarge(), 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmap_data); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 150790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url1, chrome::FAVICON, favicon_bitmap_data); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 151290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results; 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->UpdateFaviconMappingsAndFetch( 151490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url2, icon_urls, chrome::FAVICON, kSmallSize.width(), 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScaleFactors1x2x(), &bitmap_results); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the same FaviconID is mapped to both page URLs. 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url1, &icon_mappings)); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 152290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon_id = icon_mappings[0].icon_id; 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, favicon_id); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url2, &icon_mappings)); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the icon URL that |page_url1| is mapped to. 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url_new, GetSizesSmall(), 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmap_data); 153490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url1, chrome::FAVICON, favicon_bitmap_data); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url1| should map to a new FaviconID and have valid bitmap data. 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url1, &icon_mappings)); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url_new, icon_mappings[0].icon_url); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(favicon_id, icon_mappings[0].icon_id); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps( 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings[0].icon_id, &favicon_bitmaps)); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, favicon_bitmaps.size()); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url2| should still map to the same FaviconID and have valid bitmap 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data. 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_url2, &icon_mappings)); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmaps.clear(); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps(favicon_id, 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmaps)); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, favicon_bitmaps.size()); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A notification should have been broadcast for each call to SetFavicons() 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and each call to UpdateFaviconMappingsAndFetch(). 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, num_broadcasted_notifications()); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that no notifications are broadcast as a result of calling 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// UpdateFaviconMappingsAndFetch() for an icon URL which is already 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// mapped to the passed in page URL. 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoChange) { 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://www.google.com"); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url("http://www.google.com/favicon.ico"); 157390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmall(), &favicon_bitmap_data); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID icon_id = 157990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 158090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL); 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, icon_id); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_broadcasted_notifications()); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_url); 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results; 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->UpdateFaviconMappingsAndFetch( 158990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_urls, chrome::FAVICON, kSmallSize.width(), 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScaleFactors1x2x(), &bitmap_results); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_id, backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 159390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL)); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No notification should have been broadcast as no icon mapping, favicon, 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or favicon bitmap was updated, added or removed. 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, num_broadcasted_notifications()); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test repeatedly calling MergeFavicon(). |page_url| is initially not known 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the database. 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MergeFaviconPageURLNotInDB) { 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://www.google.com"); 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL icon_url("http:/www.google.com/favicon.ico"); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('a'); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data)); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 161190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 161290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_url, chrome::FAVICON, bitmap_data, kSmallSize); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |page_url| should now be mapped to |icon_url| and the favicon bitmap should 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not be expired. 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings)); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings[0].icon_url); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FaviconBitmap favicon_bitmap; 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[0] = 'b'; 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data = new base::RefCountedBytes(data); 163090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 163190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_url, chrome::FAVICON, bitmap_data, kSmallSize); 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url| should still have a single favicon bitmap. The bitmap data 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be updated. 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings)); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings[0].icon_url); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmap.bitmap_data)); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test calling MergeFavicon() when |page_url| is known to the database. 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MergeFaviconPageURLInDB) { 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://www.google.com"); 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL icon_url1("http:/www.google.com/favicon.ico"); 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL icon_url2("http://www.google.com/favicon2.ico"); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url1, GetSizesSmall(), 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmap_data); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test initial state. 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings)); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconBitmap favicon_bitmap; 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, num_broadcasted_notifications()); 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1) Merge identical favicon bitmap. 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.push_back('a'); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data)); 167990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 168090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_url1, chrome::FAVICON, bitmap_data, kSmallSize); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All the data should stay the same and no notifications should have been 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // sent. 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings)); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, num_broadcasted_notifications()); 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2) Merge favicon bitmap of the same size. 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data[0] = 'b'; 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_data = new base::RefCountedBytes(data); 170090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 170190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_url1, chrome::FAVICON, bitmap_data, kSmallSize); 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The small favicon bitmap at |icon_url1| should be overwritten. 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings.clear(); 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmap.bitmap_data)); 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 3) Merge favicon for the same icon URL, but a pixel size for which there is 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no favicon bitmap. 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data[0] = 'c'; 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_data = new base::RefCountedBytes(data); 171990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 172090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_url1, chrome::FAVICON, bitmap_data, kTinySize); 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A new favicon bitmap should be created and the preexisting favicon bitmap 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ('b') should be expired. 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings.clear(); 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url1, icon_mappings[0].icon_url); 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetSortedFaviconBitmaps(icon_mappings[0].icon_id, 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmaps)); 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmaps[0].last_updated); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time(), favicon_bitmaps[1].last_updated); 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmaps[1].bitmap_data)); 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 4) Merge favicon for an icon URL different from the icon URLs already 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mapped to page URL. 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data[0] = 'd'; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_data = new base::RefCountedBytes(data); 174490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 174590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, icon_url2, chrome::FAVICON, bitmap_data, kSmallSize); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The existing favicon bitmaps should be copied over to the newly created 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // favicon at |icon_url2|. |page_url| should solely be mapped to |icon_url2|. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url2, icon_mappings[0].icon_url); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_bitmaps.clear(); 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetSortedFaviconBitmaps(icon_mappings[0].icon_id, 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &favicon_bitmaps)); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time(), favicon_bitmaps[0].last_updated); 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('c', favicon_bitmaps[0].bitmap_data)); 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTinySize, favicon_bitmaps[0].pixel_size); 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The favicon being merged should take precedence over the preexisting 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // favicon bitmaps. 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmaps[1].last_updated); 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('d', favicon_bitmaps[1].bitmap_data)); 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmaps[1].pixel_size); 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A notification should have been broadcast for each call to SetFavicons() 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and MergeFavicon(). 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, num_broadcasted_notifications()); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test calling MergeFavicon() when |icon_url| is known to the database but not 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// mapped to |page_url|. 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryBackendTest, MergeFaviconIconURLMappedToDifferentPageURL) { 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL page_url1("http://www.google.com"); 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL page_url2("http://news.google.com"); 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL page_url3("http://maps.google.com"); 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL icon_url("http:/www.google.com/favicon.ico"); 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 178090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmall(), 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &favicon_bitmap_data); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url1, chrome::FAVICON, favicon_bitmap_data); 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test initial state. 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<IconMapping> icon_mappings; 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url1, 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url, icon_mappings[0].icon_url); 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FaviconBitmap favicon_bitmap; 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(icon_mappings[0].icon_id, &favicon_bitmap)); 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1) Merge in an identical favicon bitmap data but for a different page URL. 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('a'); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data)); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 180690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url2, icon_url, chrome::FAVICON, bitmap_data, kSmallSize); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID favicon_id = 180990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 181090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL); 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, favicon_id); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(favicon_id, &favicon_bitmap)); 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('a', favicon_bitmap.bitmap_data)); 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 2) Merging a favicon bitmap with different bitmap data for the same icon 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // URL should overwrite the small favicon bitmap at |icon_url|. 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap_data->data()[0] = 'b'; 182190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 182290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url3, icon_url, chrome::FAVICON, bitmap_data, kSmallSize); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) favicon_id = backend_->thumbnail_db_->GetFaviconIDForFaviconURL( 182590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_url, chrome::FAVICON, NULL); 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, favicon_id); 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetOnlyFaviconBitmap(favicon_id, &favicon_bitmap)); 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(base::Time(), favicon_bitmap.last_updated); 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', favicon_bitmap.bitmap_data)); 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSmallSize, favicon_bitmap.pixel_size); 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |icon_url| should be mapped to all three page URLs. 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings.clear(); 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url1, 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings.clear(); 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url2, 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings.clear(); 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url3, 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(favicon_id, icon_mappings[0].icon_id); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A notification should have been broadcast for each call to SetFavicons() 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and MergeFavicon(). 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, num_broadcasted_notifications()); 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that MergeFavicon() does not add more than 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |kMaxFaviconBitmapsPerIconURL| to a favicon. 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MergeFaviconMaxFaviconBitmapsPerIconURL) { 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://www.google.com"); 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string icon_url_string("http://www.google.com/favicon.ico"); 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t replace_index = icon_url_string.size() - 1; 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('a'); 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data = 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&data); 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pixel_size = 1; 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kMaxFaviconBitmapsPerIconURL + 1; ++i) { 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_url_string[replace_index] = '0' + i; 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL icon_url(icon_url_string); 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 187490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon(page_url, icon_url, chrome::FAVICON, bitmap_data, 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(pixel_size, pixel_size)); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++pixel_size; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There should be a single favicon mapped to |page_url| with exactly 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kMaxFaviconBitmapsPerIconURL favicon bitmaps. 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<IconMapping> icon_mappings; 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url, 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &icon_mappings)); 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FaviconBitmap> favicon_bitmaps; 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetFaviconBitmaps( 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_mappings[0].icon_id, &favicon_bitmaps)); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMaxFaviconBitmapsPerIconURL, favicon_bitmaps.size()); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the favicon set by MergeFavicon() shows up in the result of 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetFaviconsForURL(). 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MergeFaviconShowsUpInGetFaviconsForURLResult) { 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url("http://www.google.com"); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_url("http://www.google.com/favicon.ico"); 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL merged_icon_url("http://wwww.google.com/favicon2.ico"); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 189890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmallAndLarge(), 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmap_data); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set some preexisting favicons for |page_url|. 190390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Merge small favicon. 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('c'); 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::RefCountedBytes(data)); 191090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->MergeFavicon( 191190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url, merged_icon_url, chrome::FAVICON, bitmap_data, kSmallSize); 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request favicon bitmaps for both 1x and 2x to simulate request done by 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BookmarkModel::GetFavicon(). 191590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results; 191690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->GetFaviconsForURL(page_url, chrome::FAVICON, kSmallSize.width(), 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScaleFactors1x2x(), &bitmap_results); 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, bitmap_results.size()); 192090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chrome::FaviconBitmapResult& first_result = bitmap_results[0]; 192190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const chrome::FaviconBitmapResult& result = 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (first_result.pixel_size == kSmallSize) ? first_result 19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : bitmap_results[1]; 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('c', result.bitmap_data)); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Tests GetFaviconsForURL with icon_types priority, 19288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HistoryBackendTest, TestGetFaviconsForURLWithIconTypesPriority) { 19298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL page_url("http://www.google.com"); 19308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL icon_url("http://www.google.com/favicon.ico"); 19318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL touch_icon_url("http://wwww.google.com/touch_icon.ico"); 19328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 19348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<gfx::Size> favicon_size; 19358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) favicon_size.push_back(gfx::Size(16, 16)); 19368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) favicon_size.push_back(gfx::Size(32, 32)); 19378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, favicon_size, &favicon_bitmap_data); 19388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(2u, favicon_bitmap_data.size()); 19398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> touch_icon_bitmap_data; 19418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<gfx::Size> touch_icon_size; 19428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) touch_icon_size.push_back(gfx::Size(64, 64)); 19438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, touch_icon_size, &touch_icon_bitmap_data); 19448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1u, touch_icon_bitmap_data.size()); 19458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Set some preexisting favicons for |page_url|. 19478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 19488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::TOUCH_ICON, touch_icon_bitmap_data); 19498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::FaviconBitmapResult result; 19518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<int> icon_types; 19528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types.push_back(chrome::FAVICON); 19538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types.push_back(chrome::TOUCH_ICON); 19548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->GetLargestFaviconForURL(page_url, icon_types, 16, &result); 19568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Verify the result icon is 32x32 favicon. 19588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(gfx::Size(32, 32), result.pixel_size); 19598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, result.icon_type); 19608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Change Minimal size to 32x32 and verify the 64x64 touch icon returned. 19628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->GetLargestFaviconForURL(page_url, icon_types, 32, &result); 19638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(gfx::Size(64, 64), result.pixel_size); 19648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_ICON, result.icon_type); 19658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 19668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Test the the first types of icon is returned if its size equal to the 19688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// second types icon. 19698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HistoryBackendTest, TestGetFaviconsForURLReturnFavicon) { 19708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL page_url("http://www.google.com"); 19718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL icon_url("http://www.google.com/favicon.ico"); 19728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL touch_icon_url("http://wwww.google.com/touch_icon.ico"); 19738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 19758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<gfx::Size> favicon_size; 19768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) favicon_size.push_back(gfx::Size(16, 16)); 19778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) favicon_size.push_back(gfx::Size(32, 32)); 19788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, favicon_size, &favicon_bitmap_data); 19798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(2u, favicon_bitmap_data.size()); 19808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> touch_icon_bitmap_data; 19828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<gfx::Size> touch_icon_size; 19838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) touch_icon_size.push_back(gfx::Size(32, 32)); 19848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, touch_icon_size, &touch_icon_bitmap_data); 19858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1u, touch_icon_bitmap_data.size()); 19868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Set some preexisting favicons for |page_url|. 19888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 19898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::TOUCH_ICON, touch_icon_bitmap_data); 19908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::FaviconBitmapResult result; 19928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<int> icon_types; 19938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types.push_back(chrome::FAVICON); 19948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types.push_back(chrome::TOUCH_ICON); 19958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->GetLargestFaviconForURL(page_url, icon_types, 16, &result); 19978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 19988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Verify the result icon is 32x32 favicon. 19998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(gfx::Size(32, 32), result.pixel_size); 20008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, result.icon_type); 20018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Change minimal size to 32x32 and verify the 32x32 favicon returned. 20038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::FaviconBitmapResult result1; 20048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->GetLargestFaviconForURL(page_url, icon_types, 32, &result1); 20058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(gfx::Size(32, 32), result1.pixel_size); 20068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, result1.icon_type); 20078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 20088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Test the favicon is returned if its size is smaller than minimal size, 20108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// because it is only one available. 20118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(HistoryBackendTest, TestGetFaviconsForURLReturnFaviconEvenItSmaller) { 20128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL page_url("http://www.google.com"); 20138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GURL icon_url("http://www.google.com/favicon.ico"); 20148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 20168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<gfx::Size> favicon_size; 20178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) favicon_size.push_back(gfx::Size(16, 16)); 20188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) GenerateFaviconBitmapData(icon_url, favicon_size, &favicon_bitmap_data); 20198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT_EQ(1u, favicon_bitmap_data.size()); 20208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Set preexisting favicons for |page_url|. 20228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 20238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chrome::FaviconBitmapResult result; 20258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::vector<int> icon_types; 20268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types.push_back(chrome::FAVICON); 20278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types.push_back(chrome::TOUCH_ICON); 20288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) backend_->GetLargestFaviconForURL(page_url, icon_types, 32, &result); 20308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Verify 16x16 icon is returned, even it small than minimal_size. 20328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(gfx::Size(16, 16), result.pixel_size); 20338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, result.icon_type); 20348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 20358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test UpdateFaviconMapingsAndFetch() when multiple icon types are passed in. 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchMultipleIconTypes) { 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url1("http://www.google.com"); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url2("http://news.google.com"); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url3("http://mail.google.com"); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_urla("http://www.google.com/favicon1.ico"); 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_urlb("http://www.google.com/favicon2.ico"); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL icon_urlc("http://www.google.com/favicon3.ico"); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url1| is mapped to |icon_urla| which if of type TOUCH_ICON. 204690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_urla, GetSizesSmall(), &favicon_bitmap_data); 204890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url1, chrome::TOUCH_ICON, favicon_bitmap_data); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url2| is mapped to |icon_urlb| and |icon_urlc| which are of type 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TOUCH_PRECOMPOSED_ICON. 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_urlb, GetSizesSmall(), icon_urlc, 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSizesSmall(), &favicon_bitmap_data); 205490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons( 205590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url2, chrome::TOUCH_PRECOMPOSED_ICON, favicon_bitmap_data); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> icon_urls; 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_urla); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_urlb); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_urls.push_back(icon_urlc); 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 206290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results; 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->UpdateFaviconMappingsAndFetch( 206490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_url3, 206590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) icon_urls, 206690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (chrome::TOUCH_ICON | chrome::TOUCH_PRECOMPOSED_ICON), 206790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kSmallSize.width(), 206890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetScaleFactors1x2x(), 206990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &bitmap_results); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url1| and |page_url2| should still be mapped to the same icon URLs. 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<IconMapping> icon_mappings; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL(page_url1, 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &icon_mappings)); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, icon_mappings.size()); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_urla, icon_mappings[0].icon_url); 207790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_ICON, icon_mappings[0].icon_type); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetSortedIconMappingsForPageURL(page_url2, &icon_mappings)); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, icon_mappings.size()); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_urlb, icon_mappings[0].icon_url); 208390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_PRECOMPOSED_ICON, icon_mappings[0].icon_type); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_urlc, icon_mappings[1].icon_url); 208590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_PRECOMPOSED_ICON, icon_mappings[1].icon_type); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |page_url3| should be mapped only to |icon_urlb| and |icon_urlc| as 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TOUCH_PRECOMPOSED_ICON is the largest IconType. 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_mappings.clear(); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetSortedIconMappingsForPageURL(page_url3, &icon_mappings)); 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, icon_mappings.size()); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_urlb, icon_mappings[0].icon_url); 209390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_PRECOMPOSED_ICON, icon_mappings[0].icon_type); 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_urlc, icon_mappings[1].icon_url); 209590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_PRECOMPOSED_ICON, icon_mappings[1].icon_type); 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the results of GetFaviconsFromDB() when there are no found 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// favicons. 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetFaviconsFromDBEmpty) { 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results; 210490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(backend_->GetFaviconsFromDB(page_url, chrome::FAVICON, 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results)); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bitmap_results.empty()); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the results of GetFaviconsFromDB() when there are matching favicons 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but there are no associated favicon bitmaps. 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetFaviconsFromDBNoFaviconBitmaps) { 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url("http://www.google.com/icon1"); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID icon_id = backend_->thumbnail_db_->AddFavicon( 2116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch icon_url, chrome::FAVICON); 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, icon_id); 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, backend_->thumbnail_db_->AddIconMapping(page_url, icon_id)); 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results_out; 212190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(backend_->GetFaviconsFromDB(page_url, chrome::FAVICON, 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bitmap_results_out.empty()); 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that GetFaviconsFromDB() returns results for the bitmaps which most 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// closely match the passed in desired size and scale factors. 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetFaviconsFromDBSelectClosestMatch) { 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url("http://www.google.com/icon1"); 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesTinySmallAndLarge(), 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &favicon_bitmap_data); 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results_out; 213990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(page_url, 214090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 214190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kSmallSize.width(), 214290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetScaleFactors1x2x(), 214390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &bitmap_results_out)); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The bitmap data for the small and large bitmaps should be returned as their 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // sizes match exactly. 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, bitmap_results_out.size()); 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No required order for results. 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bitmap_results_out[0].pixel_size == kLargeSize) { 215090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconBitmapResult tmp_result = bitmap_results_out[0]; 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_results_out[0] = bitmap_results_out[1]; 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_results_out[1] = tmp_result; 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bitmap_results_out[0].expired); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('b', bitmap_results_out[0].bitmap_data)); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSmallSize, bitmap_results_out[0].pixel_size); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url, bitmap_results_out[0].icon_url); 215990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, bitmap_results_out[0].icon_type); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bitmap_results_out[1].expired); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(BitmapDataEqual('c', bitmap_results_out[1].bitmap_data)); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLargeSize, bitmap_results_out[1].pixel_size); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url, bitmap_results_out[1].icon_url); 216590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, bitmap_results_out[1].icon_type); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that GetFaviconsFromDB() returns results from the icon URL whose 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bitmaps most closely match the passed in desired size and scale factors. 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetFaviconsFromDBSingleIconURL) { 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url1("http://www.google.com/icon1"); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url2("http://www.google.com/icon2"); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url1, GetSizesSmall(), icon_url2, 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSizesLarge(), &favicon_bitmap_data); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results_out; 218390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(page_url, 218490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 218590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kSmallSize.width(), 218690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetScaleFactors1x2x(), 218790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) &bitmap_results_out)); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The results should have results for the icon URL with the large bitmap as 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // downscaling is preferred to upscaling. 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, bitmap_results_out.size()); 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLargeSize, bitmap_results_out[0].pixel_size); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(icon_url2, bitmap_results_out[0].icon_url); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the results of GetFaviconsFromDB() when called with different 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |icon_types|. 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetFaviconsFromDBIconType) { 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url1("http://www.google.com/icon1.png"); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url2("http://www.google.com/icon2.png"); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url1, GetSizesSmall(), &favicon_bitmap_data); 220590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::FAVICON, favicon_bitmap_data); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url2, GetSizesSmall(), &favicon_bitmap_data); 220890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(page_url, chrome::TOUCH_ICON, favicon_bitmap_data); 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results_out; 221190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(page_url, chrome::FAVICON, 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, bitmap_results_out.size()); 221590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::FAVICON, bitmap_results_out[0].icon_type); 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url1, bitmap_results_out[0].icon_url); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap_results_out.clear(); 221990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(page_url, chrome::TOUCH_ICON, 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, bitmap_results_out.size()); 222390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(chrome::TOUCH_ICON, bitmap_results_out[0].icon_type); 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(icon_url2, bitmap_results_out[0].icon_url); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that GetFaviconsFromDB() correctly sets the expired flag for bitmap 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reults. 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, GetFaviconsFromDBExpired) { 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL page_url("http://www.google.com/"); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url("http://www.google.com/icon.png"); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> data; 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.push_back('a'); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedBytes> bitmap_data( 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&data)); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_updated = base::Time::FromTimeT(0); 223890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FaviconID icon_id = 223990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->thumbnail_db_->AddFavicon(icon_url, 224090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) chrome::FAVICON, 224190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bitmap_data, 224290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) last_updated, 224390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kSmallSize); 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, icon_id); 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, backend_->thumbnail_db_->AddIconMapping(page_url, icon_id)); 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 224790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results_out; 224890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(page_url, chrome::FAVICON, 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, bitmap_results_out.size()); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bitmap_results_out[0].expired); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check that UpdateFaviconMappingsAndFetch() call back to the UI when there is 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// no valid thumbnail database. 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryBackendTest, UpdateFaviconMappingsAndFetchNoDB) { 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the thumbnail database invalid. 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->thumbnail_db_.reset(); 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results; 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->UpdateFaviconMappingsAndFetch( 226490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL(), std::vector<GURL>(), chrome::FAVICON, kSmallSize.width(), 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScaleFactors1x2x(), &bitmap_results); 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(bitmap_results.empty()); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, CloneFaviconIsRestrictedToSameDomain) { 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL url("http://www.google.com/"); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL same_domain_url("http://www.google.com/subdir/index.html"); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL foreign_domain_url("http://www.not-google.com/"); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL icon_url("http://www.google.com/icon.png"); 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a favicon 227790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapData> favicon_bitmap_data; 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateFaviconBitmapData(icon_url, GetSizesSmall(), &favicon_bitmap_data); 227990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) backend_->SetFavicons(url, chrome::FAVICON, favicon_bitmap_data); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(backend_->thumbnail_db_->GetIconMappingsForPageURL( 228190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, chrome::FAVICON, NULL)); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validate starting state. 228490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<chrome::FaviconBitmapResult> bitmap_results_out; 228590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(url, chrome::FAVICON, 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 228790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(backend_->GetFaviconsFromDB(same_domain_url, chrome::FAVICON, 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 228990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(backend_->GetFaviconsFromDB(foreign_domain_url, chrome::FAVICON, 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same-domain cloning should work. 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->CloneFavicons(url, same_domain_url); 229490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(backend_->GetFaviconsFromDB(same_domain_url, chrome::FAVICON, 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Foreign-domain cloning is forbidden. 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->CloneFavicons(url, foreign_domain_url); 229990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(backend_->GetFaviconsFromDB(foreign_domain_url, chrome::FAVICON, 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSmallSize.width(), GetScaleFactors1x2x(), &bitmap_results_out)); 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, QueryFilteredURLs) { 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* google = "http://www.google.com/"; 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* yahoo = "http://www.yahoo.com/"; 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* yahoo_sports = "http://sports.yahoo.com/"; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* yahoo_sports_with_article1 = 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://sports.yahoo.com/article1.htm"; 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* yahoo_sports_with_article2 = 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://sports.yahoo.com/article2.htm"; 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* yahoo_sports_soccer = "http://sports.yahoo.com/soccer"; 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* apple = "http://www.apple.com/"; 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time tested_time = Time::Now().LocalMidnight() + 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromHours(4); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta half_an_hour = base::TimeDelta::FromMinutes(30); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta one_hour = base::TimeDelta::FromHours(1); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta one_day = base::TimeDelta::FromDays(1); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::PageTransition kTypedTransition = 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_TYPED; 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::PageTransition kKeywordGeneratedTransition = 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_KEYWORD_GENERATED; 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* redirect_sequence[2]; 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence[1] = NULL; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence[0] = google; 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, kTypedTransition, 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day - half_an_hour * 2); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTypedTransition, tested_time - one_day); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTypedTransition, tested_time - half_an_hour / 2); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTypedTransition, tested_time); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a visit with a transition that will make sure that no segment gets 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created for this page (so the subsequent entries will have different URLIDs 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and SegmentIDs). 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence[0] = apple; 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, kKeywordGeneratedTransition, 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day + one_hour * 6); 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence[0] = yahoo; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, kTypedTransition, 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day + half_an_hour); 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, kTypedTransition, 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day + half_an_hour * 2); 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence[0] = yahoo_sports; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, kTypedTransition, 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day - half_an_hour * 2); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime( 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence, 0, kTypedTransition, 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day); 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int transition1, transition2; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddClientRedirect(GURL(yahoo_sports), GURL(yahoo_sports_with_article1), false, 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day + half_an_hour, 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transition1, &transition2); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddClientRedirect(GURL(yahoo_sports_with_article1), 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(yahoo_sports_with_article2), 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - one_day + half_an_hour * 2, 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transition1, &transition2); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirect_sequence[0] = yahoo_sports_soccer; 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRedirectChainWithTransitionAndTime(redirect_sequence, 0, 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTypedTransition, 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time - half_an_hour); 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Commit(); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<QueryFilteredURLsRequest> request1 = 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest( 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryBackendTest::OnQueryFiltered, 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(static_cast<HistoryBackendTest*>(this)))); 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryBackendCancelableRequest cancellable_request; 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancellable_request.MockScheduleOfRequest<QueryFilteredURLsRequest>( 2390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request1.get()); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitFilter filter; 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time limit is |tested_time| +/- 45 min. 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta three_quarters_of_an_hour = base::TimeDelta::FromMinutes(45); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterTime(tested_time); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterWidth(three_quarters_of_an_hour); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->QueryFilteredURLs(request1, 100, filter, false); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4U, get_filtered_list().size()); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(google), get_filtered_list()[0].url.spec()); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports_soccer), 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_filtered_list()[1].url.spec()); 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo), get_filtered_list()[2].url.spec()); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports), 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_filtered_list()[3].url.spec()); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time limit is between |tested_time| and |tested_time| + 2 hours. 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<QueryFilteredURLsRequest> request2 = 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest( 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryBackendTest::OnQueryFiltered, 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(static_cast<HistoryBackendTest*>(this)))); 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancellable_request.MockScheduleOfRequest<QueryFilteredURLsRequest>( 2413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request2.get()); 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterTime(tested_time + one_hour); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterWidth(one_hour); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->QueryFilteredURLs(request2, 100, filter, false); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, get_filtered_list().size()); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(google), get_filtered_list()[0].url.spec()); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo), get_filtered_list()[1].url.spec()); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports), get_filtered_list()[2].url.spec()); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time limit is between |tested_time| - 2 hours and |tested_time|. 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<QueryFilteredURLsRequest> request3 = 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest( 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryBackendTest::OnQueryFiltered, 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(static_cast<HistoryBackendTest*>(this)))); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancellable_request.MockScheduleOfRequest<QueryFilteredURLsRequest>( 2429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request3.get()); 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterTime(tested_time - one_hour); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterWidth(one_hour); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->QueryFilteredURLs(request3, 100, filter, false); 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, get_filtered_list().size()); 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(google), get_filtered_list()[0].url.spec()); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports_soccer), 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_filtered_list()[1].url.spec()); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports), get_filtered_list()[2].url.spec()); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.ClearFilters(); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Exploded exploded_time; 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tested_time.LocalExplode(&exploded_time); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Today. 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<QueryFilteredURLsRequest> request4 = 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest( 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryBackendTest::OnQueryFiltered, 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(static_cast<HistoryBackendTest*>(this)))); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancellable_request.MockScheduleOfRequest<QueryFilteredURLsRequest>( 2450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request4.get()); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterTime(tested_time); 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetDayOfTheWeekFilter(static_cast<int>(exploded_time.day_of_week)); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->QueryFilteredURLs(request4, 100, filter, false); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, get_filtered_list().size()); 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(google), get_filtered_list()[0].url.spec()); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports_soccer), 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_filtered_list()[1].url.spec()); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Today + time limit - only yahoo_sports_soccer should fit. 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<QueryFilteredURLsRequest> request5 = 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest( 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryBackendTest::OnQueryFiltered, 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(static_cast<HistoryBackendTest*>(this)))); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancellable_request.MockScheduleOfRequest<QueryFilteredURLsRequest>( 2466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request5.get()); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterTime(tested_time - base::TimeDelta::FromMinutes(40)); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterWidth(base::TimeDelta::FromMinutes(20)); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->QueryFilteredURLs(request5, 100, filter, false); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, get_filtered_list().size()); 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports_soccer), 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_filtered_list()[0].url.spec()); 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we get debug data if we request it. 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<QueryFilteredURLsRequest> request6 = 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest( 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryBackendTest::OnQueryFiltered, 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(static_cast<HistoryBackendTest*>(this)))); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cancellable_request.MockScheduleOfRequest<QueryFilteredURLsRequest>( 2481868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) request6.get()); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterTime(tested_time); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.SetFilterWidth(one_hour * 2); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->QueryFilteredURLs(request6, 100, filter, true); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the SegmentID is used by QueryFilteredURLs when generating the debug 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // data instead of the URLID, the |total_visits| for the |yahoo_sports_soccer| 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry will be zero instead of 1. 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_GE(get_filtered_list().size(), 2U); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(google), get_filtered_list()[0].url.spec()); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(yahoo_sports_soccer), 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_filtered_list()[1].url.spec()); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4U, get_filtered_list()[0].extended_info.total_visits); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, get_filtered_list()[1].extended_info.total_visits); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, UpdateVisitDuration) { 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This unit test will test adding and deleting visit details information. 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1("http://www.cnn.com"); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<VisitInfo> visit_info1, visit_info2; 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time start_ts = Time::Now() - base::TimeDelta::FromDays(5); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time end_ts = start_ts + base::TimeDelta::FromDays(2); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_info1.push_back(VisitInfo(start_ts, content::PAGE_TRANSITION_LINK)); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url2("http://www.example.com"); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_info2.push_back(VisitInfo(Time::Now() - base::TimeDelta::FromDays(10), 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK)); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all history. 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->DeleteAllHistory(); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the visits. 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url1, visit_info1, history::SOURCE_BROWSED); 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->AddVisits(url2, visit_info2, history::SOURCE_BROWSED); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the entries for both visits were added in visit_details. 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisitVector visits1, visits2; 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow row; 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id1 = backend_->db()->GetRowForURL(url1, &row); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(url_id1, &visits1)); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits1.size()); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visits1[0].visit_duration.ToInternalValue()); 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id2 = backend_->db()->GetRowForURL(url2, &row); 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(url_id2, &visits2)); 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits2.size()); 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visits2[0].visit_duration.ToInternalValue()); 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the visit to cnn.com. 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->UpdateVisitDuration(visits1[0].visit_id, end_ts); 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the duration for visiting cnn.com was correctly updated. 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->db()->GetVisitsForURL(url_id1, &visits1)); 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, visits1.size()); 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta expected_duration = end_ts - start_ts; 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_duration.ToInternalValue(), 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visits1[0].visit_duration.ToInternalValue()); 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the visit to cnn.com. 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_->RemoveVisits(visits1)); 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for migration of adding visit_duration column. 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, MigrationVisitDuration) { 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(backend_.get()); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Closing(); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = NULL; 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath old_history_path, old_history, old_archived; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &old_history_path)); 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_history_path = old_history_path.AppendASCII("History"); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_history = old_history_path.AppendASCII("HistoryNoDuration"); 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_archived = old_history_path.AppendASCII("ArchivedNoDuration"); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy history database file to current directory so that it will be deleted 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in Teardown. 25592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_history_path(getTestDir()); 25607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(new_history_path, true); 2561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(new_history_path); 25622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_history_file = 25632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_history_path.Append(chrome::kHistoryFilename); 25642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_archived_file = 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_history_path.Append(chrome::kArchivedHistoryFilename); 25667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(old_history, new_history_file)); 25677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(base::CopyFile(old_archived, new_archived_file)); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = new HistoryBackend(new_history_path, 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new HistoryBackendTestDelegate(this), 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &bookmark_model_); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Init(std::string(), false); 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Closing(); 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_ = NULL; 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now both history and archived_history databases should already be migrated. 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check version in history database first. 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur_version = HistoryDatabase::GetCurrentVersion(); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection db; 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db.Open(new_history_file)); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement s(db.GetUniqueStatement( 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT value FROM meta WHERE key = 'version'")); 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(s.Step()); 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_version = s.ColumnInt(0); 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cur_version, file_version); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check visit_duration column in visits table is created and set to 0. 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s.Assign(db.GetUniqueStatement( 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT visit_duration FROM visits LIMIT 1")); 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(s.Step()); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, s.ColumnInt(0)); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repeat version and visit_duration checks in archived history database 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also. 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur_version = ArchivedDatabase::GetCurrentVersion(); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection archived_db; 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(archived_db.Open(new_archived_file)); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement s1(archived_db.GetUniqueStatement( 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT value FROM meta WHERE key = 'version'")); 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(s1.Step()); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_version = s1.ColumnInt(0); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cur_version, file_version); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check visit_duration column in visits table is created and set to 0. 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s1.Assign(archived_db.GetUniqueStatement( 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT visit_duration FROM visits LIMIT 1")); 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(s1.Step()); 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, s1.ColumnInt(0)); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(HistoryBackendTest, AddPageNoVisitForBookmark) { 26142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(backend_.get()); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url("http://www.google.com"); 2617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title(UTF8ToUTF16("Bookmark title")); 26182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->AddPageNoVisitForBookmark(url, title); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRow row; 26212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->GetURL(url, &row); 26222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url, row.url()); 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(title, row.title()); 26242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, row.visit_count()); 26252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->DeleteURL(url); 2627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) backend_->AddPageNoVisitForBookmark(url, base::string16()); 26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->GetURL(url, &row); 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url, row.url()); 26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(UTF8ToUTF16(url.spec()), row.title()); 26312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, row.visit_count()); 26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryBackendTest, ExpireHistoryForTimes) { 26352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(backend_.get()); 26362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryAddPageArgs args[10]; 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(args); ++i) { 26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args[i].url = GURL("http://example" + 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string((i % 2 == 0 ? ".com" : ".net"))); 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args[i].time = base::Time::FromInternalValue(i); 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->AddPage(args[i]); 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time(), backend_->GetFirstRecordedTimeForTest()); 26452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRow row; 26472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(args); ++i) { 26482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->GetURL(args[i].url, &row)); 26492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<base::Time> times; 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) times.insert(args[5].time); 26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->ExpireHistoryForTimes(times, 26542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::FromInternalValue(2), 26552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::FromInternalValue(8)); 26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(0), 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->GetFirstRecordedTimeForTest()); 26592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Visits to http://example.com are untouched. 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VisitVector visit_vector; 26622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->GetVisitsForURL( 26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db_->GetRowForURL(GURL("http://example.com"), NULL), 26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &visit_vector)); 26652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(5u, visit_vector.size()); 26662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(0), visit_vector[0].visit_time); 26672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(2), visit_vector[1].visit_time); 26682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(4), visit_vector[2].visit_time); 26692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(6), visit_vector[3].visit_time); 26702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(8), visit_vector[4].visit_time); 26712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Visits to http://example.net between [2,8] are removed. 26732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visit_vector.clear(); 26742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->GetVisitsForURL( 26752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db_->GetRowForURL(GURL("http://example.net"), NULL), 26762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &visit_vector)); 26772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, visit_vector.size()); 26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(1), visit_vector[0].visit_time); 26792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(9), visit_vector[1].visit_time); 26802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(base::Time::FromInternalValue(0), 26822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->GetFirstRecordedTimeForTest()); 26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 26842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryBackendTest, ExpireHistory) { 26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(backend_.get()); 26872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since history operations are dependent on the local timezone, make all 26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // entries relative to a fixed, local reference time. 26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time reference_time = base::Time::UnixEpoch().LocalMidnight() + 26902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromHours(12); 26912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Insert 4 entries into the database. 26932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryAddPageArgs args[4]; 26942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(args); ++i) { 26952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args[i].url = GURL("http://example" + base::IntToString(i) + ".com"); 26962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args[i].time = reference_time + base::TimeDelta::FromDays(i); 26972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->AddPage(args[i]); 26982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 26992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRow url_rows[4]; 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned int i = 0; i < arraysize(args); ++i) 27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(backend_->GetURL(args[i].url, &url_rows[i])); 27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ExpireHistoryArgs> expire_list; 27052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VisitVector visits; 27062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Passing an empty map should be a no-op. 27082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->ExpireHistory(expire_list); 27092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db()->GetAllVisitsInRange(base::Time(), base::Time(), 0, &visits); 27102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4U, visits.size()); 27112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Trying to delete an unknown URL with the time of the first visit should 27132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // also be a no-op. 27142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list.resize(expire_list.size() + 1); 27152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list[0].SetTimeRangeForOneDay(args[0].time); 27162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list[0].urls.insert(GURL("http://google.does-not-exist")); 27172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->ExpireHistory(expire_list); 27182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db()->GetAllVisitsInRange(base::Time(), base::Time(), 0, &visits); 27192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4U, visits.size()); 27202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now add the first URL with the same time -- it should get deleted. 27222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list.back().urls.insert(url_rows[0].url()); 27232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->ExpireHistory(expire_list); 27242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db()->GetAllVisitsInRange(base::Time(), base::Time(), 0, &visits); 27262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(3U, visits.size()); 27272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(visits[0].url_id, url_rows[1].id()); 27282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(visits[1].url_id, url_rows[2].id()); 27292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(visits[2].url_id, url_rows[3].id()); 27302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first recorded time should also get updated. 27322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(backend_->GetFirstRecordedTimeForTest(), args[1].time); 27332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now delete the rest of the visits in one call. 27352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned int i = 1; i < arraysize(args); ++i) { 27362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list.resize(expire_list.size() + 1); 27372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list[i].SetTimeRangeForOneDay(args[i].time); 27382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expire_list[i].urls.insert(args[i].url); 27392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->ExpireHistory(expire_list); 27412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db()->GetAllVisitsInRange(base::Time(), base::Time(), 0, &visits); 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(0U, visits.size()); 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2746d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)TEST_F(HistoryBackendTest, DeleteMatchingUrlsForKeyword) { 2747d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // Set up urls and keyword_search_terms 2748d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) GURL url1("https://www.bing.com/?q=bar"); 2749d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) URLRow url_info1(url1); 2750d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info1.set_visit_count(0); 2751d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info1.set_typed_count(0); 2752d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info1.set_last_visit(Time()); 2753d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info1.set_hidden(false); 2754d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const URLID url1_id = backend_->db()->AddURL(url_info1); 2755d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_NE(0, url1_id); 2756d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2757d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) TemplateURLID keyword_id = 1; 2758d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) base::string16 keyword = UTF8ToUTF16("bar"); 2759d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ASSERT_TRUE(backend_->db()->SetKeywordSearchTermsForURL( 2760d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url1_id, keyword_id, keyword)); 2761d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2762d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) GURL url2("https://www.google.com/?q=bar"); 2763d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) URLRow url_info2(url2); 2764d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info2.set_visit_count(0); 2765d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info2.set_typed_count(0); 2766d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info2.set_last_visit(Time()); 2767d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info2.set_hidden(false); 2768d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const URLID url2_id = backend_->db()->AddURL(url_info2); 2769d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_NE(0, url2_id); 2770d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2771d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) TemplateURLID keyword_id2 = 2; 2772d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ASSERT_TRUE(backend_->db()->SetKeywordSearchTermsForURL( 2773d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url2_id, keyword_id2, keyword)); 2774d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2775d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // Add another visit to the same URL 2776d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) URLRow url_info3(url2); 2777d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info3.set_visit_count(0); 2778d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info3.set_typed_count(0); 2779d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info3.set_last_visit(Time()); 2780d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url_info3.set_hidden(false); 2781d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) const URLID url3_id = backend_->db()->AddURL(url_info3); 2782d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_NE(0, url3_id); 2783d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) ASSERT_TRUE(backend_->db()->SetKeywordSearchTermsForURL( 2784d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) url3_id, keyword_id2, keyword)); 2785d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2786d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // Test that deletion works correctly 2787d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) backend_->DeleteMatchingURLsForKeyword(keyword_id2, keyword); 2788d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2789d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // Test that rows 2 and 3 are deleted, while 1 is intact 2790d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) URLRow row; 2791d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_TRUE(backend_->db()->GetURLRow(url1_id, &row)); 2792d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_EQ(url1.spec(), row.url().spec()); 2793d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_FALSE(backend_->db()->GetURLRow(url2_id, &row)); 2794d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_FALSE(backend_->db()->GetURLRow(url3_id, &row)); 2795d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 2796d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // Test that corresponding keyword search terms are deleted for rows 2 & 3, 2797d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) // but not for row 1 2798d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_TRUE(backend_->db()->GetKeywordSearchTermRow(url1_id, NULL)); 2799d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_FALSE(backend_->db()->GetKeywordSearchTermRow(url2_id, NULL)); 2800d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) EXPECT_FALSE(backend_->db()->GetKeywordSearchTermRow(url3_id, NULL)); 2801d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)} 2802d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) 28032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class HistoryBackendSegmentDurationTest : public HistoryBackendTest { 28042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 28052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryBackendSegmentDurationTest() {} 28062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 28082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 28092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kTrackActiveVisitTime); 28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HistoryBackendTest::SetUp(); 28112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 28122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 28142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HistoryBackendSegmentDurationTest); 28152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 28162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Assertions around segment durations. 28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(HistoryBackendSegmentDurationTest, SegmentDuration) { 28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL url1("http://www.google.com"); 28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL url2("http://www.foo.com/m"); 28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string segment1(VisitSegmentDatabase::ComputeSegmentName(url1)); 28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string segment2(VisitSegmentDatabase::ComputeSegmentName(url2)); 28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time segment_time(VisitSegmentDatabase::SegmentTime(Time::Now())); 28252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRow url_info1(url1); 28262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info1.set_visit_count(0); 28272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info1.set_typed_count(0); 28282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info1.set_last_visit(segment_time); 28292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info1.set_hidden(false); 28302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const URLID url1_id = backend_->db()->AddURL(url_info1); 28312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, url1_id); 28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLRow url_info2(url2); 28342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info2.set_visit_count(0); 28352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info2.set_typed_count(0); 28362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info2.set_last_visit(Time()); 28372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_info2.set_hidden(false); 28382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const URLID url2_id = backend_->db()->AddURL(url_info2); 28392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, url2_id); 28402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(url1_id, url2_id); 28412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should not have any segments for the urls. 28432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, backend_->db()->GetSegmentNamed(segment1)); 28442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, backend_->db()->GetSegmentNamed(segment2)); 28452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update the duration, which should implicitly create the segments. 28472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TimeDelta segment1_time_delta(TimeDelta::FromHours(1)); 28482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TimeDelta segment2_time_delta(TimeDelta::FromHours(2)); 28492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->IncreaseSegmentDuration(url1, segment_time, segment1_time_delta); 28502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->IncreaseSegmentDuration(url2, segment_time, segment2_time_delta); 28512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the ids of the segments that were created. 28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SegmentID segment1_id = backend_->db()->GetSegmentNamed(segment1); 28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, segment1_id); 28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SegmentID segment2_id = backend_->db()->GetSegmentNamed(segment2); 28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, segment2_id); 28572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(segment1_id, segment2_id); 28582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the values made it to the db. 28602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SegmentDurationID segment1_duration_id; 28612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta fetched_delta; 28622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->db()->GetSegmentDuration( 28632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) segment1_id, segment_time, &segment1_duration_id, 28642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &fetched_delta)); 28652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, segment1_duration_id); 28662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(segment1_time_delta.InHours(), fetched_delta.InHours()); 28672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SegmentDurationID segment2_duration_id; 28692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(backend_->db()->GetSegmentDuration( 28702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) segment2_id, segment_time, &segment2_duration_id, 28712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &fetched_delta)); 28722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(0, segment2_duration_id); 28732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(segment1_duration_id, segment2_duration_id); 28742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(segment2_time_delta.InHours(), fetched_delta.InHours()); 28752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Query by duration. |url2| should be first as it has a longer view time. 28772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedVector<PageUsageData> data; 28782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->db()->QuerySegmentDuration(segment_time, 10, &data.get()); 28792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, data.size()); 28802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url2.spec(), data[0]->GetURL().spec()); 28812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url2_id, data[0]->GetID()); 28822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(segment2_time_delta.InHours(), data[0]->duration().InHours()); 28832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1.spec(), data[1]->GetURL().spec()); 28852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(url1_id, data[1]->GetID()); 28862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(segment1_time_delta.InHours(), data[1]->duration().InHours()); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 288990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Simple test that removes a bookmark. This test exercises the code paths in 289090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// History that block till bookmark bar model is loaded. 289190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(HistoryBackendTest, RemoveNotification) { 289290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<TestingProfile> profile(new TestingProfile()); 289390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2894bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(profile->CreateHistoryService(false, false)); 289590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile->CreateBookmarkModel(true); 289690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BookmarkModel* model = BookmarkModelFactory::GetForProfile(profile.get()); 289758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test::WaitForBookmarkModelToLoad(model); 289890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 289990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add a URL. 290090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL url("http://www.google.com"); 290190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bookmark_utils::AddIfNotBookmarked(model, url, base::string16()); 290290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 290390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HistoryService* service = HistoryServiceFactory::GetForProfile( 290490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) profile.get(), Profile::EXPLICIT_ACCESS); 290590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 290690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) service->AddPage( 290790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url, base::Time::Now(), NULL, 1, GURL(), RedirectList(), 290890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::PAGE_TRANSITION_TYPED, SOURCE_BROWSED, false); 290990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 291090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This won't actually delete the URL, rather it'll empty out the visits. 291190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This triggers blocking on the BookmarkModel. 291290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) service->DeleteURL(url); 291390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 291490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2915bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Test DeleteFTSIndexDatabases deletes expected files. 2916bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(HistoryBackendTest, DeleteFTSIndexDatabases) { 2917bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(backend_.get()); 2918bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2919bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::FilePath history_path(getTestDir()); 2920bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::FilePath db1(history_path.AppendASCII("History Index 2013-05")); 2921bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::FilePath db1_journal(db1.InsertBeforeExtensionASCII("-journal")); 2922bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::FilePath db1_wal(db1.InsertBeforeExtensionASCII("-wal")); 2923bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::FilePath db2_symlink(history_path.AppendASCII("History Index 2013-06")); 2924bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::FilePath db2_actual(history_path.AppendASCII("Underlying DB")); 2925bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2926bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Setup dummy index database files. 292768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const char* data = "Dummy"; 292868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const size_t data_len = 5; 292968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(file_util::WriteFile(db1, data, data_len)); 293068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(file_util::WriteFile(db1_journal, data, data_len)); 293168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(file_util::WriteFile(db1_wal, data, data_len)); 293268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_TRUE(file_util::WriteFile(db2_actual, data, data_len)); 2933bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#if defined(OS_POSIX) 2934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(base::CreateSymbolicLink(db2_actual, db2_symlink)); 2935bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#endif 2936bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2937bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Delete all DTS index databases. 2938bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch backend_->DeleteFTSIndexDatabases(); 2939bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(base::PathExists(db1)); 2940bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(base::PathExists(db1_wal)); 2941bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(base::PathExists(db1_journal)); 2942bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_FALSE(base::PathExists(db2_symlink)); 2943bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch EXPECT_TRUE(base::PathExists(db2_actual)); // Symlinks shouldn't be followed. 2944bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2945bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 2947