| // 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(); |
| CreateKeywordSearchTermsIndices(); |
| } |
| 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<KeywordSearchTermVisit> 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<KeywordSearchTermVisit> matches; |
| GetMostRecentKeywordSearchTerms(1, UTF8ToUTF16("visit"), 10, &matches); |
| ASSERT_EQ(0U, matches.size()); |
| } |
| |
| } // namespace history |