// Copyright (c) 2012 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 #include "chrome/browser/history/android/urls_sql_handler.h" #include "base/file_path.h" #include "base/file_util.h" #include "base/scoped_temp_dir.h" #include "base/stringprintf.h" #include "base/utf_string_conversions.h" #include "chrome/browser/history/android/visit_sql_handler.h" #include "chrome/browser/history/history_database.h" #include "chrome/common/chrome_constants.h" #include "testing/gtest/include/gtest/gtest.h" using base::Time; using base::TimeDelta; namespace history { class UrlsSQLHandlerTest : public testing::Test { public: UrlsSQLHandlerTest() : urls_sql_handler_(&history_db_), visit_sql_handler_(&history_db_) { } ~UrlsSQLHandlerTest() { } protected: virtual void SetUp() { // Get a temporary directory for the test DB files. ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); FilePath history_db_name = temp_dir_.path().AppendASCII( chrome::kHistoryFilename); FilePath bookmark_temp = temp_dir_.path().AppendASCII("bookmark_temp"); ASSERT_TRUE(file_util::CreateDirectory(bookmark_temp)); ASSERT_EQ(sql::INIT_OK, history_db_.Init(history_db_name, bookmark_temp)); } virtual void TearDown() { } HistoryDatabase history_db_; ScopedTempDir temp_dir_; UrlsSQLHandler urls_sql_handler_; VisitSQLHandler visit_sql_handler_; private: DISALLOW_COPY_AND_ASSIGN(UrlsSQLHandlerTest); }; // Insert a row only has URL to verify the visit count and last visit time // are also set by UrlsSQLHandler. TEST_F(UrlsSQLHandlerTest, InsertURL) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); // Both visit count and last visit time are default value. EXPECT_EQ(0, url_row.visit_count()); EXPECT_EQ(Time(), url_row.last_visit()); // The new row's id was set in url_row correctly. EXPECT_EQ(row.url_id(), url_row.id()); } // Insert a row with last visit time to verify the visit count is set to 1 by // the UrlsSQLHandler. TEST_F(UrlsSQLHandlerTest, InsertURLWithLastVisitTime) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_last_visit_time(Time::Now()); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url_id(), url_row.id()); EXPECT_EQ(row.url(), url_row.url()); // Visit count should be set to 1 automatically. EXPECT_EQ(1, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); } // Insert a row with different last visit time and created time to verify the // visit count is set to 2 by the UrlsSQLHandler. TEST_F(UrlsSQLHandlerTest, InsertURLWithBothTime) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_last_visit_time(Time::Now()); row.set_created(Time::Now() - TimeDelta::FromDays(1)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url_id(), url_row.id()); EXPECT_EQ(row.url(), url_row.url()); // Visit count should be set to 2 automatically. EXPECT_EQ(2, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); } // Insert a row with created time to verify the visit count is also set to 1 // and last visit time is set to created time by the UrlsSQLHanlder. TEST_F(UrlsSQLHandlerTest, InsertURLWithCreatedTime) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_title(UTF8ToUTF16("Google")); row.set_created(Time::Now()); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url_id(), url_row.id()); EXPECT_EQ(row.url(), url_row.url()); // Visit count should be set to 1 automatically. EXPECT_EQ(1, url_row.visit_count()); // Last visit time should be set as created time. EXPECT_EQ(row.created(), url_row.last_visit()); EXPECT_EQ(row.title(), url_row.title()); } // Insert a row with the visit count as 1 to verify the last visit // time is set by the UrlsSQLHandler. TEST_F(UrlsSQLHandlerTest, InsertURLWithVisitCount) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_visit_count(1); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url_id(), url_row.id()); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(1, url_row.visit_count()); // Last visit time should be set to the time when it inserted. EXPECT_NE(Time(), url_row.last_visit()); } // Insert a row with all columns set. TEST_F(UrlsSQLHandlerTest, Insert) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_visit_count(10); row.set_last_visit_time(Time::Now()); row.set_title(UTF8ToUTF16("Google")); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url_id(), url_row.id()); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(10, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); EXPECT_EQ(row.title(), url_row.title()); } // Update all columns except URL which can not be updated. TEST_F(UrlsSQLHandlerTest, Update) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_title(UTF8ToUTF16("Google")); row.set_visit_count(10); row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); ASSERT_TRUE(visit_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(10, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); HistoryAndBookmarkRow update_row; update_row.set_last_visit_time(Time::Now()); update_row.set_visit_count(1); update_row.set_title(UTF8ToUTF16("Google Inc")); TableIDRow id; id.url_id = url_row.id(); TableIDRows ids; ids.push_back(id); ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(1, url_row.visit_count()); EXPECT_EQ(update_row.last_visit_time(), url_row.last_visit()); EXPECT_EQ(update_row.title(), url_row.title()); } // Update the both time to verify the created time is not impact to visit_count // as the history will be rebuild. TEST_F(UrlsSQLHandlerTest, UpdateLastBothTime) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_title(UTF8ToUTF16("Google")); row.set_visit_count(10); row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); ASSERT_TRUE(visit_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(10, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); HistoryAndBookmarkRow update_row1; update_row1.set_created(url_row.last_visit()); update_row1.set_last_visit_time(Time::Now()); TableIDRow id; id.url_id = url_row.id(); TableIDRows ids; ids.push_back(id); ASSERT_TRUE(urls_sql_handler_.Update(update_row1, ids)); ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(11, url_row.visit_count()); EXPECT_EQ(update_row1.last_visit_time(), url_row.last_visit()); HistoryAndBookmarkRow update_row; update_row.set_created(Time::Now()); ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); // Visit count will not changed. EXPECT_EQ(11, url_row.visit_count()); EXPECT_EQ(update_row1.last_visit_time(), url_row.last_visit()); } // Update the visit count be zero to verify last visit time also set to zero. TEST_F(UrlsSQLHandlerTest, UpdateVisitCountZero) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_visit_count(100); row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); ASSERT_TRUE(visit_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(100, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); HistoryAndBookmarkRow update_row; update_row.set_visit_count(0); TableIDRow id; id.url_id = url_row.id(); TableIDRows ids; ids.push_back(id); ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(0, url_row.visit_count()); // Last visit is reset. EXPECT_EQ(Time(), url_row.last_visit()); } // Update the last visit time be a time earlier than current one to verify // update failed. TEST_F(UrlsSQLHandlerTest, UpdateEarlyLastVisit) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_visit_count(100); row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); ASSERT_TRUE(visit_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(100, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); HistoryAndBookmarkRow update_row; update_row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(11)); TableIDRow id; id.url_id = url_row.id(); TableIDRows ids; ids.push_back(id); EXPECT_FALSE(urls_sql_handler_.Update(update_row, ids)); } // Increase the visit count to verify the last visit time is also update. TEST_F(UrlsSQLHandlerTest, UpdateVisitCountIncreased) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_visit_count(10); row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); ASSERT_TRUE(visit_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(10, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); HistoryAndBookmarkRow update_row; update_row.set_visit_count(11); TableIDRow id; id.url_id = url_row.id(); TableIDRows ids; ids.push_back(id); ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(11, url_row.visit_count()); EXPECT_LT(row.last_visit_time(), url_row.last_visit()); } TEST_F(UrlsSQLHandlerTest, Delete) { HistoryAndBookmarkRow row; row.set_raw_url("http://google.com"); row.set_url(GURL("http://google.com")); row.set_visit_count(10); row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); ASSERT_TRUE(urls_sql_handler_.Insert(&row)); URLRow url_row; ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); EXPECT_EQ(row.url(), url_row.url()); EXPECT_EQ(10, url_row.visit_count()); EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); TableIDRow id; id.url_id = url_row.id(); TableIDRows ids; ids.push_back(id); ASSERT_TRUE(urls_sql_handler_.Delete(ids)); EXPECT_FALSE(history_db_.GetURLRow(row.url_id(), &url_row)); } } // namespace history