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