// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "app/sql/connection.h" #include "base/file_path.h" #include "base/file_util.h" #include "base/path_service.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/history/url_database.h" #include "testing/gtest/include/gtest/gtest.h" using base::Time; using base::TimeDelta; namespace history { namespace { bool IsURLRowEqual(const URLRow& a, const URLRow& b) { // TODO(brettw) when the database stores an actual Time value rather than // a time_t, do a reaul comparison. Instead, we have to do a more rough // comparison since the conversion reduces the precision. return a.title() == b.title() && a.visit_count() == b.visit_count() && a.typed_count() == b.typed_count() && a.last_visit() - b.last_visit() <= TimeDelta::FromSeconds(1) && a.hidden() == b.hidden(); } } // namespace class URLDatabaseTest : public testing::Test, public URLDatabase { public: URLDatabaseTest() { } private: // Test setup. void SetUp() { FilePath temp_dir; PathService::Get(base::DIR_TEMP, &temp_dir); db_file_ = temp_dir.AppendASCII("URLTest.db"); EXPECT_TRUE(db_.Open(db_file_)); // Initialize the tables for this test. CreateURLTable(false); CreateMainURLIndex(); CreateSupplimentaryURLIndices(); InitKeywordSearchTermsTable(); } void TearDown() { db_.Close(); file_util::Delete(db_file_, false); } // Provided for URL/VisitDatabase. virtual sql::Connection& GetDB() { return db_; } FilePath db_file_; sql::Connection db_; }; // Test add and query for the URL table in the HistoryDatabase. TEST_F(URLDatabaseTest, AddURL) { // First, add two URLs. const GURL url1("http://www.google.com/"); URLRow url_info1(url1); url_info1.set_title(UTF8ToUTF16("Google")); url_info1.set_visit_count(4); url_info1.set_typed_count(2); url_info1.set_last_visit(Time::Now() - TimeDelta::FromDays(1)); url_info1.set_hidden(false); EXPECT_TRUE(AddURL(url_info1)); const GURL url2("http://mail.google.com/"); URLRow url_info2(url2); url_info2.set_title(UTF8ToUTF16("Google Mail")); url_info2.set_visit_count(3); url_info2.set_typed_count(0); url_info2.set_last_visit(Time::Now() - TimeDelta::FromDays(2)); url_info2.set_hidden(true); EXPECT_TRUE(AddURL(url_info2)); // Query both of them. URLRow info; EXPECT_TRUE(GetRowForURL(url1, &info)); EXPECT_TRUE(IsURLRowEqual(url_info1, info)); URLID id2 = GetRowForURL(url2, &info); EXPECT_TRUE(id2); EXPECT_TRUE(IsURLRowEqual(url_info2, info)); // Update the second. url_info2.set_title(UTF8ToUTF16("Google Mail Too")); url_info2.set_visit_count(4); url_info2.set_typed_count(1); url_info2.set_typed_count(91011); url_info2.set_hidden(false); EXPECT_TRUE(UpdateURLRow(id2, url_info2)); // Make sure it got updated. URLRow info2; EXPECT_TRUE(GetRowForURL(url2, &info2)); EXPECT_TRUE(IsURLRowEqual(url_info2, info2)); // Query a nonexistent URL. EXPECT_EQ(0, GetRowForURL(GURL("http://news.google.com/"), &info)); // Delete all urls in the domain. // TODO(acw): test the new url based delete domain // EXPECT_TRUE(db.DeleteDomain(kDomainID)); // Make sure the urls have been properly removed. // TODO(acw): commented out because remove no longer works. // EXPECT_TRUE(db.GetURLInfo(url1, NULL) == NULL); // EXPECT_TRUE(db.GetURLInfo(url2, NULL) == NULL); } // Tests adding, querying and deleting keyword visits. TEST_F(URLDatabaseTest, KeywordSearchTermVisit) { const GURL url1("http://www.google.com/"); URLRow url_info1(url1); url_info1.set_title(UTF8ToUTF16("Google")); url_info1.set_visit_count(4); url_info1.set_typed_count(2); url_info1.set_last_visit(Time::Now() - TimeDelta::FromDays(1)); url_info1.set_hidden(false); URLID url_id = AddURL(url_info1); ASSERT_TRUE(url_id != 0); // Add a keyword visit. ASSERT_TRUE(SetKeywordSearchTermsForURL(url_id, 1, UTF8ToUTF16("visit"))); // Make sure we get it back. std::vector matches; GetMostRecentKeywordSearchTerms(1, UTF8ToUTF16("visit"), 10, &matches); ASSERT_EQ(1U, matches.size()); ASSERT_EQ(UTF8ToUTF16("visit"), matches[0].term); // Delete the keyword visit. DeleteAllSearchTermsForKeyword(1); // Make sure we don't get it back when querying. matches.clear(); GetMostRecentKeywordSearchTerms(1, UTF8ToUTF16("visit"), 10, &matches); ASSERT_EQ(0U, matches.size()); } // Make sure deleting a URL also deletes a keyword visit. TEST_F(URLDatabaseTest, DeleteURLDeletesKeywordSearchTermVisit) { const GURL url1("http://www.google.com/"); URLRow url_info1(url1); url_info1.set_title(UTF8ToUTF16("Google")); url_info1.set_visit_count(4); url_info1.set_typed_count(2); url_info1.set_last_visit(Time::Now() - TimeDelta::FromDays(1)); url_info1.set_hidden(false); URLID url_id = AddURL(url_info1); ASSERT_TRUE(url_id != 0); // Add a keyword visit. ASSERT_TRUE(SetKeywordSearchTermsForURL(url_id, 1, UTF8ToUTF16("visit"))); // Delete the url. ASSERT_TRUE(DeleteURLRow(url_id)); // Make sure the keyword visit was deleted. std::vector matches; GetMostRecentKeywordSearchTerms(1, UTF8ToUTF16("visit"), 10, &matches); ASSERT_EQ(0U, matches.size()); } } // namespace history