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