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