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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/url_database.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_database.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsVisitInfoEqual(const VisitRow& a,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const VisitRow& b) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return a.visit_id == b.visit_id &&
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         a.url_id == b.url_id &&
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         a.visit_time == b.visit_time &&
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         a.referring_visit == b.referring_visit &&
32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch         a.transition == b.transition;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisitDatabaseTest : public PlatformTest,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public URLDatabase,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public VisitDatabase {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitDatabaseTest() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test setup.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlatformTest::SetUp();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath db_file = temp_dir_.path().AppendASCII("VisitTest.db");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(db_.Open(db_file));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize the tables for this test.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateURLTable(false);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CreateMainURLIndex();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitVisitTable();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_.Close();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PlatformTest::TearDown();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provided for URL/VisitDatabase.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual sql::Connection& GetDB() OVERRIDE {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return db_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Connection db_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VisitDatabaseTest, Add) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add one visit.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info1(1, Time::Now(), 0, content::PAGE_TRANSITION_LINK, 0);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddVisit(&visit_info1, SOURCE_BROWSED));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add second visit for the same page.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info2(visit_info1.url_id,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visit_info1.visit_time + TimeDelta::FromSeconds(1), 1,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PAGE_TRANSITION_TYPED, 0);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddVisit(&visit_info2, SOURCE_BROWSED));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add third visit for a different page.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info3(2,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visit_info1.visit_time + TimeDelta::FromSeconds(2), 0,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PAGE_TRANSITION_LINK, 0);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddVisit(&visit_info3, SOURCE_BROWSED));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query the first two.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<VisitRow> matches;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetVisitsForURL(visit_info1.url_id, &matches));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<size_t>(2), matches.size());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure we got both (order in result set is visit time).
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(matches[0], visit_info1) &&
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IsVisitInfoEqual(matches[1], visit_info2));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VisitDatabaseTest, Delete) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add three visits that form a chain of navigation, and then delete the
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // middle one. We should be left with the outer two visits, and the chain
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should link them.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kTime1 = 1000;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info1(1, Time::FromInternalValue(kTime1), 0,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       content::PAGE_TRANSITION_LINK, 0);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddVisit(&visit_info1, SOURCE_BROWSED));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kTime2 = kTime1 + 1;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info2(1, Time::FromInternalValue(kTime2),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       visit_info1.visit_id, content::PAGE_TRANSITION_LINK, 0);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddVisit(&visit_info2, SOURCE_BROWSED));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kTime3 = kTime2 + 1;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info3(1, Time::FromInternalValue(kTime3),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       visit_info2.visit_id, content::PAGE_TRANSITION_LINK, 0);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(AddVisit(&visit_info3, SOURCE_BROWSED));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First make sure all the visits are there.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<VisitRow> matches;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetVisitsForURL(visit_info1.url_id, &matches));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<size_t>(3), matches.size());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(matches[0], visit_info1) &&
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IsVisitInfoEqual(matches[1], visit_info2) &&
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IsVisitInfoEqual(matches[2], visit_info3));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the middle one.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeleteVisit(visit_info2);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The outer two should be left, and the last one should have the first as
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the referrer.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visit_info3.referring_visit = visit_info1.visit_id;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches.clear();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GetVisitsForURL(visit_info1.url_id, &matches));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<size_t>(2), matches.size());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(matches[0], visit_info1) &&
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IsVisitInfoEqual(matches[1], visit_info3));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VisitDatabaseTest, Update) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make something in the database.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow original(1, Time::Now(), 23, content::PageTransitionFromInt(0), 19);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddVisit(&original, SOURCE_BROWSED);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mutate that row.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow modification(original);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modification.url_id = 2;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modification.transition = content::PAGE_TRANSITION_TYPED;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modification.visit_time = Time::Now() + TimeDelta::FromDays(1);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modification.referring_visit = 9292;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateVisitRow(modification);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the mutated version was written.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow final;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetRowForVisit(original.visit_id, &final);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(modification, final));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(brettw) write test for GetMostRecentVisitForURL!
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<VisitRow> GetTestVisitRows() {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tests can be sensitive to the local timezone, so use a local time as the
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // basis for all visit times.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time base_time = Time::UnixEpoch().LocalMidnight();
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add one visit.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisitRow visit_info1(1, base_time + TimeDelta::FromMinutes(1), 0,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<content::PageTransition>(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_LINK |
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_START |
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_END),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visit_info1.visit_id = 1;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add second visit for the same page.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info2(visit_info1.url_id,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visit_info1.visit_time + TimeDelta::FromSeconds(1), 1,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<content::PageTransition>(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_TYPED |
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_START |
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_END),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visit_info2.visit_id = 2;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add third visit for a different page.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info3(2,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visit_info1.visit_time + TimeDelta::FromSeconds(2), 0,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<content::PageTransition>(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_LINK |
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_START),
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visit_info3.visit_id = 3;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a redirect visit from the last page.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info4(3,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visit_info1.visit_time + TimeDelta::FromSeconds(3), visit_info3.visit_id,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<content::PageTransition>(
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_SERVER_REDIRECT |
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_END),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visit_info4.visit_id = 4;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a subframe visit.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info5(4,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      visit_info1.visit_time + TimeDelta::FromSeconds(4), visit_info4.visit_id,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<content::PageTransition>(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_AUTO_SUBFRAME |
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_START |
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_END),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  visit_info5.visit_id = 5;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add third visit for the same URL as visit 1 and 2, but exactly a day
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // later than visit 2.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisitRow visit_info6(visit_info1.url_id,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      visit_info2.visit_time + TimeDelta::FromDays(1), 1,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<content::PageTransition>(
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::PAGE_TRANSITION_TYPED |
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_START |
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          content::PAGE_TRANSITION_CHAIN_END),
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  visit_info6.visit_id = 6;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<VisitRow> test_visit_rows;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_visit_rows.push_back(visit_info1);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_visit_rows.push_back(visit_info2);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_visit_rows.push_back(visit_info3);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_visit_rows.push_back(visit_info4);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_visit_rows.push_back(visit_info5);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_visit_rows.push_back(visit_info6);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return test_visit_rows;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(VisitDatabaseTest, GetVisitsForTimes) {
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<VisitRow> test_visit_rows = GetTestVisitRows();
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < test_visit_rows.size(); ++i) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(AddVisit(&test_visit_rows[i], SOURCE_BROWSED));
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Query the visits for all our times.  We should get all visits.
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<base::Time> times;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < test_visit_rows.size(); ++i) {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      times.push_back(test_visit_rows[i].visit_time);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VisitVector results;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetVisitsForTimes(times, &results);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(test_visit_rows.size(), results.size());
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Query the visits for a single time.
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < test_visit_rows.size(); ++i) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<base::Time> times;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    times.push_back(test_visit_rows[i].visit_time);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VisitVector results;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetVisitsForTimes(times, &results);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(static_cast<size_t>(1), results.size());
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[i]));
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(VisitDatabaseTest, GetAllVisitsInRange) {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<VisitRow> test_visit_rows = GetTestVisitRows();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < test_visit_rows.size(); ++i) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(AddVisit(&test_visit_rows[i], SOURCE_BROWSED));
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Query the visits for all time.  We should get all visits.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitVector results;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetAllVisitsInRange(Time(), Time(), 0, &results);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(test_visit_rows.size(), results.size());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < test_visit_rows.size(); ++i) {
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(IsVisitInfoEqual(results[i], test_visit_rows[i]));
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query a time range and make sure beginning is inclusive and ending is
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exclusive.
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetAllVisitsInRange(test_visit_rows[1].visit_time,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      test_visit_rows[3].visit_time, 0,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      &results);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(2), results.size());
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[1]));
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[1], test_visit_rows[2]));
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Query for a max count and make sure we get only that number.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetAllVisitsInRange(Time(), Time(), 1, &results);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), results.size());
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[0]));
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(VisitDatabaseTest, GetVisibleVisitsInRange) {
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<VisitRow> test_visit_rows = GetTestVisitRows();
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < test_visit_rows.size(); ++i) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(AddVisit(&test_visit_rows[i], SOURCE_BROWSED));
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Query the visits for all time.  We should not get the first or the second
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // visit (duplicates of the sixth) or the redirect or subframe visits.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisitVector results;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QueryOptions options;
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetVisibleVisitsInRange(options, &results);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(2), results.size());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[5]));
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[1], test_visit_rows[3]));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now try with only per-day de-duping -- the second visit should appear,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // since it's a duplicate of visit6 but on a different day.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.duplicate_policy = QueryOptions::REMOVE_DUPLICATES_PER_DAY;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetVisibleVisitsInRange(options, &results);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(3), results.size());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[5]));
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[1], test_visit_rows[3]));
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[2], test_visit_rows[1]));
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now try without de-duping, expect to see all visible visits.
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.duplicate_policy = QueryOptions::KEEP_ALL_DUPLICATES;
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetVisibleVisitsInRange(options, &results);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(4), results.size());
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[5]));
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[1], test_visit_rows[3]));
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[2], test_visit_rows[1]));
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[3], test_visit_rows[0]));
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the end time to exclude the second visit. The first visit should be
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // returned. Even though the second is a more recent visit, it's not in the
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // query range.
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.end_time = test_visit_rows[1].visit_time;
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetVisibleVisitsInRange(options, &results);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), results.size());
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[0]));
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options = QueryOptions();  // Reset to options to default.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query for a max count and make sure we get only that number.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.max_count = 1;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetVisibleVisitsInRange(options, &results);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), results.size());
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[5]));
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Query a time range and make sure beginning is inclusive and ending is
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exclusive.
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.begin_time = test_visit_rows[1].visit_time;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.end_time = test_visit_rows[3].visit_time;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  options.max_count = 0;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetVisibleVisitsInRange(options, &results);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(1), results.size());
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsVisitInfoEqual(results[0], test_visit_rows[1]));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VisitDatabaseTest, VisitSource) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add visits.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info1(111, Time::Now(), 0, content::PAGE_TRANSITION_LINK, 0);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddVisit(&visit_info1, SOURCE_BROWSED));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info2(112, Time::Now(), 1, content::PAGE_TRANSITION_TYPED, 0);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddVisit(&visit_info2, SOURCE_SYNCED));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitRow visit_info3(113, Time::Now(), 0, content::PAGE_TRANSITION_TYPED, 0);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddVisit(&visit_info3, SOURCE_EXTENSION));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Query each visit.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<VisitRow> matches;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetVisitsForURL(111, &matches));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, matches.size());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VisitSourceMap sources;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetVisitsSource(matches, &sources);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sources.size());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetVisitsForURL(112, &matches));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, matches.size());
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetVisitsSource(matches, &sources);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, sources.size());
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SOURCE_SYNCED, sources[matches[0].visit_id]);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetVisitsForURL(113, &matches));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, matches.size());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetVisitsSource(matches, &sources);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, sources.size());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SOURCE_EXTENSION, sources[matches[0].visit_id]);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
389