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 "base/files/scoped_temp_dir.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/shortcuts_database.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ShortcutsDatabaseTestInfo { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string guid; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string title; // The text that orginally was searched for. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string contents_class; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string description; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string description_class; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int typed_count; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int days_from_now; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} shortcut_test_db[] = { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "BD85DBA2-8C29-49F9-84AE-48E1E90880DF", 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.google.com/", "goog", 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Google", "0,1,4,0", "Google", "0,3,4,1", 100, 1 }, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "BD85DBA2-8C29-49F9-84AE-48E1E90880E0", 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://slashdot.org/", "slash", 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "slashdot.org", "0,3,5,1", 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Slashdot - News for nerds, stuff that matters", "0,2,5,0", 100, 0}, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "BD85DBA2-8C29-49F9-84AE-48E1E90880E1", 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://slashdot.org/", "news", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "slashdot.org", "0,1", 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Slashdot - News for nerds, stuff that matters", "0,0,11,2,15,0", 5, 0}, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShortcutsDatabaseTest : public testing::Test { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearDB(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t CountRecords() const; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsBackend::Shortcut ShortcutFromTestInfo( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ShortcutsDatabaseTestInfo& info); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAll(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestingProfile> profile_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ShortcutsDatabase> db_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsDatabaseTest::SetUp() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_.reset(new TestingProfile()); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_ = new ShortcutsDatabase(profile_.get()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db_->Init()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearDB(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsDatabaseTest::TearDown() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_ = NULL; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsDatabaseTest::ClearDB() { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s(db_->db_.GetUniqueStatement("DELETE FROM omni_box_shortcuts")); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(s.Run()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t ShortcutsDatabaseTest::CountRecords() const { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement s(db_->db_.GetUniqueStatement( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT count(*) FROM omni_box_shortcuts")); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(s.Step()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<size_t>(s.ColumnInt(0)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShortcutsBackend::Shortcut ShortcutsDatabaseTest::ShortcutFromTestInfo( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ShortcutsDatabaseTestInfo& info) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ShortcutsBackend::Shortcut(info.guid, ASCIIToUTF16(info.title), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL(info.url), ASCIIToUTF16(info.contents), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch::ClassificationsFromString(info.contents_class), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16(info.description), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutocompleteMatch::ClassificationsFromString(info.description_class), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - base::TimeDelta::FromDays(info.days_from_now), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.typed_count); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShortcutsDatabaseTest::AddAll() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearDB(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(shortcut_test_db); ++i) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->AddShortcut(ShortcutFromTestInfo(shortcut_test_db[i])); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(arraysize(shortcut_test_db), CountRecords()); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsDatabaseTest, AddShortcut) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearDB(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, CountRecords()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->AddShortcut(ShortcutFromTestInfo(shortcut_test_db[0]))); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1U, CountRecords()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->AddShortcut(ShortcutFromTestInfo(shortcut_test_db[1]))); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2U, CountRecords()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->AddShortcut(ShortcutFromTestInfo(shortcut_test_db[2]))); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3U, CountRecords()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsDatabaseTest, UpdateShortcut) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddAll(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsBackend::Shortcut shortcut( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutFromTestInfo(shortcut_test_db[1])); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut.contents = ASCIIToUTF16("gro.todhsals"); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->UpdateShortcut(shortcut)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap shortcuts; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->LoadShortcuts(&shortcuts)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap::iterator it = 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcuts.find(shortcut.id); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it != shortcuts.end()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it->second.contents == shortcut.contents); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsDatabaseTest, DeleteShortcutsWithIds) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddAll(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> shortcut_ids; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_ids.push_back(shortcut_test_db[0].guid); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcut_ids.push_back(shortcut_test_db[2].guid); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->DeleteShortcutsWithIds(shortcut_ids)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(arraysize(shortcut_test_db) - 2, CountRecords()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap shortcuts; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->LoadShortcuts(&shortcuts)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap::iterator it = 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcuts.find(shortcut_test_db[0].guid); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it == shortcuts.end()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = shortcuts.find(shortcut_test_db[1].guid); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it != shortcuts.end()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = shortcuts.find(shortcut_test_db[2].guid); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it == shortcuts.end()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsDatabaseTest, DeleteShortcutsWithUrl) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddAll(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->DeleteShortcutsWithUrl("http://slashdot.org/")); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(arraysize(shortcut_test_db) - 2, CountRecords()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap shortcuts; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->LoadShortcuts(&shortcuts)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap::iterator it = 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortcuts.find(shortcut_test_db[0].guid); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it != shortcuts.end()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = shortcuts.find(shortcut_test_db[1].guid); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it == shortcuts.end()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = shortcuts.find(shortcut_test_db[2].guid); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(it == shortcuts.end()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsDatabaseTest, LoadShortcuts) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddAll(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap shortcuts; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->LoadShortcuts(&shortcuts)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(shortcut_test_db); ++i) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Looking for shortcut #%d", 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(i))); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(shortcuts.find(shortcut_test_db[i].guid) != shortcuts.end()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShortcutsDatabaseTest, DeleteAllShortcuts) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddAll(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShortcutsDatabase::GuidToShortcutMap shortcuts; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->LoadShortcuts(&shortcuts)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(arraysize(shortcut_test_db), shortcuts.size()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->DeleteAllShortcuts()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(db_->LoadShortcuts(&shortcuts)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, shortcuts.size()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 192