1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <vector> 6 7#include "chrome/browser/history/android/urls_sql_handler.h" 8 9#include "base/files/file_path.h" 10#include "base/files/scoped_temp_dir.h" 11#include "base/strings/stringprintf.h" 12#include "base/strings/utf_string_conversions.h" 13#include "chrome/browser/history/android/visit_sql_handler.h" 14#include "chrome/browser/history/history_database.h" 15#include "chrome/common/chrome_constants.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18using base::Time; 19using base::TimeDelta; 20 21namespace history { 22 23class UrlsSQLHandlerTest : public testing::Test { 24 public: 25 UrlsSQLHandlerTest() 26 : urls_sql_handler_(&history_db_), 27 visit_sql_handler_(&history_db_) { 28 } 29 virtual ~UrlsSQLHandlerTest() {} 30 31 protected: 32 virtual void SetUp() { 33 // Get a temporary directory for the test DB files. 34 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 35 base::FilePath history_db_name = temp_dir_.path().AppendASCII( 36 chrome::kHistoryFilename); 37 ASSERT_EQ(sql::INIT_OK, history_db_.Init(history_db_name)); 38 } 39 40 virtual void TearDown() { 41 } 42 43 HistoryDatabase history_db_; 44 base::ScopedTempDir temp_dir_; 45 UrlsSQLHandler urls_sql_handler_; 46 VisitSQLHandler visit_sql_handler_; 47 48 private: 49 DISALLOW_COPY_AND_ASSIGN(UrlsSQLHandlerTest); 50}; 51 52// Insert a row only has URL to verify the visit count and last visit time 53// are also set by UrlsSQLHandler. 54TEST_F(UrlsSQLHandlerTest, InsertURL) { 55 HistoryAndBookmarkRow row; 56 row.set_raw_url("http://google.com"); 57 row.set_url(GURL("http://google.com")); 58 59 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 60 URLRow url_row; 61 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 62 EXPECT_EQ(row.url(), url_row.url()); 63 // Both visit count and last visit time are default value. 64 EXPECT_EQ(0, url_row.visit_count()); 65 EXPECT_EQ(Time(), url_row.last_visit()); 66 // The new row's id was set in url_row correctly. 67 EXPECT_EQ(row.url_id(), url_row.id()); 68} 69 70// Insert a row with last visit time to verify the visit count is set to 1 by 71// the UrlsSQLHandler. 72TEST_F(UrlsSQLHandlerTest, InsertURLWithLastVisitTime) { 73 HistoryAndBookmarkRow row; 74 row.set_raw_url("http://google.com"); 75 row.set_url(GURL("http://google.com")); 76 row.set_last_visit_time(Time::Now()); 77 78 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 79 URLRow url_row; 80 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 81 EXPECT_EQ(row.url_id(), url_row.id()); 82 EXPECT_EQ(row.url(), url_row.url()); 83 // Visit count should be set to 1 automatically. 84 EXPECT_EQ(1, url_row.visit_count()); 85 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 86} 87 88// Insert a row with different last visit time and created time to verify the 89// visit count is set to 2 by the UrlsSQLHandler. 90TEST_F(UrlsSQLHandlerTest, InsertURLWithBothTime) { 91 HistoryAndBookmarkRow row; 92 row.set_raw_url("http://google.com"); 93 row.set_url(GURL("http://google.com")); 94 row.set_last_visit_time(Time::Now()); 95 row.set_created(Time::Now() - TimeDelta::FromDays(1)); 96 97 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 98 URLRow url_row; 99 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 100 EXPECT_EQ(row.url_id(), url_row.id()); 101 EXPECT_EQ(row.url(), url_row.url()); 102 // Visit count should be set to 2 automatically. 103 EXPECT_EQ(2, url_row.visit_count()); 104 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 105} 106 107// Insert a row with created time to verify the visit count is also set to 1 108// and last visit time is set to created time by the UrlsSQLHanlder. 109TEST_F(UrlsSQLHandlerTest, InsertURLWithCreatedTime) { 110 HistoryAndBookmarkRow row; 111 row.set_raw_url("http://google.com"); 112 row.set_url(GURL("http://google.com")); 113 row.set_title(base::UTF8ToUTF16("Google")); 114 row.set_created(Time::Now()); 115 116 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 117 URLRow url_row; 118 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 119 EXPECT_EQ(row.url_id(), url_row.id()); 120 EXPECT_EQ(row.url(), url_row.url()); 121 // Visit count should be set to 1 automatically. 122 EXPECT_EQ(1, url_row.visit_count()); 123 // Last visit time should be set as created time. 124 EXPECT_EQ(row.created(), url_row.last_visit()); 125 EXPECT_EQ(row.title(), url_row.title()); 126} 127 128// Insert a row with the visit count as 1 to verify the last visit 129// time is set by the UrlsSQLHandler. 130TEST_F(UrlsSQLHandlerTest, InsertURLWithVisitCount) { 131 HistoryAndBookmarkRow row; 132 row.set_raw_url("http://google.com"); 133 row.set_url(GURL("http://google.com")); 134 row.set_visit_count(1); 135 136 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 137 URLRow url_row; 138 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 139 EXPECT_EQ(row.url_id(), url_row.id()); 140 EXPECT_EQ(row.url(), url_row.url()); 141 EXPECT_EQ(1, url_row.visit_count()); 142 // Last visit time should be set to the time when it inserted. 143 EXPECT_NE(Time(), url_row.last_visit()); 144} 145 146// Insert a row with all columns set. 147TEST_F(UrlsSQLHandlerTest, Insert) { 148 HistoryAndBookmarkRow row; 149 row.set_raw_url("http://google.com"); 150 row.set_url(GURL("http://google.com")); 151 row.set_visit_count(10); 152 row.set_last_visit_time(Time::Now()); 153 row.set_title(base::UTF8ToUTF16("Google")); 154 155 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 156 URLRow url_row; 157 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 158 EXPECT_EQ(row.url_id(), url_row.id()); 159 EXPECT_EQ(row.url(), url_row.url()); 160 EXPECT_EQ(10, url_row.visit_count()); 161 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 162 EXPECT_EQ(row.title(), url_row.title()); 163} 164 165// Update all columns except URL which can not be updated. 166TEST_F(UrlsSQLHandlerTest, Update) { 167 HistoryAndBookmarkRow row; 168 row.set_raw_url("http://google.com"); 169 row.set_url(GURL("http://google.com")); 170 row.set_title(base::UTF8ToUTF16("Google")); 171 row.set_visit_count(10); 172 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 173 174 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 175 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 176 URLRow url_row; 177 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 178 EXPECT_EQ(row.url(), url_row.url()); 179 EXPECT_EQ(10, url_row.visit_count()); 180 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 181 182 HistoryAndBookmarkRow update_row; 183 update_row.set_last_visit_time(Time::Now()); 184 update_row.set_visit_count(1); 185 update_row.set_title(base::UTF8ToUTF16("Google Inc")); 186 TableIDRow id; 187 id.url_id = url_row.id(); 188 TableIDRows ids; 189 ids.push_back(id); 190 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 191 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 192 EXPECT_EQ(1, url_row.visit_count()); 193 EXPECT_EQ(update_row.last_visit_time(), url_row.last_visit()); 194 EXPECT_EQ(update_row.title(), url_row.title()); 195} 196 197// Update the both time to verify the created time is not impact to visit_count 198// as the history will be rebuild. 199TEST_F(UrlsSQLHandlerTest, UpdateLastBothTime) { 200 HistoryAndBookmarkRow row; 201 row.set_raw_url("http://google.com"); 202 row.set_url(GURL("http://google.com")); 203 row.set_title(base::UTF8ToUTF16("Google")); 204 row.set_visit_count(10); 205 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 206 207 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 208 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 209 URLRow url_row; 210 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 211 EXPECT_EQ(row.url(), url_row.url()); 212 EXPECT_EQ(10, url_row.visit_count()); 213 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 214 215 HistoryAndBookmarkRow update_row1; 216 update_row1.set_created(url_row.last_visit()); 217 update_row1.set_last_visit_time(Time::Now()); 218 219 TableIDRow id; 220 id.url_id = url_row.id(); 221 TableIDRows ids; 222 ids.push_back(id); 223 ASSERT_TRUE(urls_sql_handler_.Update(update_row1, ids)); 224 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 225 EXPECT_EQ(11, url_row.visit_count()); 226 EXPECT_EQ(update_row1.last_visit_time(), url_row.last_visit()); 227 228 HistoryAndBookmarkRow update_row; 229 update_row.set_created(Time::Now()); 230 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 231 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 232 // Visit count will not changed. 233 EXPECT_EQ(11, url_row.visit_count()); 234 EXPECT_EQ(update_row1.last_visit_time(), url_row.last_visit()); 235} 236 237// Update the visit count be zero to verify last visit time also set to zero. 238TEST_F(UrlsSQLHandlerTest, UpdateVisitCountZero) { 239 HistoryAndBookmarkRow row; 240 row.set_raw_url("http://google.com"); 241 row.set_url(GURL("http://google.com")); 242 row.set_visit_count(100); 243 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 244 245 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 246 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 247 URLRow url_row; 248 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 249 EXPECT_EQ(row.url(), url_row.url()); 250 EXPECT_EQ(100, url_row.visit_count()); 251 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 252 253 HistoryAndBookmarkRow update_row; 254 update_row.set_visit_count(0); 255 TableIDRow id; 256 id.url_id = url_row.id(); 257 TableIDRows ids; 258 ids.push_back(id); 259 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 260 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 261 EXPECT_EQ(0, url_row.visit_count()); 262 // Last visit is reset. 263 EXPECT_EQ(Time(), url_row.last_visit()); 264} 265 266// Update the last visit time be a time earlier than current one to verify 267// update failed. 268TEST_F(UrlsSQLHandlerTest, UpdateEarlyLastVisit) { 269 HistoryAndBookmarkRow row; 270 row.set_raw_url("http://google.com"); 271 row.set_url(GURL("http://google.com")); 272 row.set_visit_count(100); 273 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 274 275 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 276 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 277 URLRow url_row; 278 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 279 EXPECT_EQ(row.url(), url_row.url()); 280 EXPECT_EQ(100, url_row.visit_count()); 281 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 282 283 HistoryAndBookmarkRow update_row; 284 update_row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(11)); 285 TableIDRow id; 286 id.url_id = url_row.id(); 287 TableIDRows ids; 288 ids.push_back(id); 289 EXPECT_FALSE(urls_sql_handler_.Update(update_row, ids)); 290} 291 292// Increase the visit count to verify the last visit time is also update. 293TEST_F(UrlsSQLHandlerTest, UpdateVisitCountIncreased) { 294 HistoryAndBookmarkRow row; 295 row.set_raw_url("http://google.com"); 296 row.set_url(GURL("http://google.com")); 297 row.set_visit_count(10); 298 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 299 300 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 301 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 302 URLRow url_row; 303 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 304 EXPECT_EQ(row.url(), url_row.url()); 305 EXPECT_EQ(10, url_row.visit_count()); 306 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 307 308 HistoryAndBookmarkRow update_row; 309 update_row.set_visit_count(11); 310 TableIDRow id; 311 id.url_id = url_row.id(); 312 TableIDRows ids; 313 ids.push_back(id); 314 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 315 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 316 EXPECT_EQ(row.url(), url_row.url()); 317 EXPECT_EQ(11, url_row.visit_count()); 318 EXPECT_LT(row.last_visit_time(), url_row.last_visit()); 319} 320 321TEST_F(UrlsSQLHandlerTest, Delete) { 322 HistoryAndBookmarkRow row; 323 row.set_raw_url("http://google.com"); 324 row.set_url(GURL("http://google.com")); 325 row.set_visit_count(10); 326 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 327 328 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 329 URLRow url_row; 330 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 331 EXPECT_EQ(row.url(), url_row.url()); 332 EXPECT_EQ(10, url_row.visit_count()); 333 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 334 335 TableIDRow id; 336 id.url_id = url_row.id(); 337 TableIDRows ids; 338 ids.push_back(id); 339 ASSERT_TRUE(urls_sql_handler_.Delete(ids)); 340 EXPECT_FALSE(history_db_.GetURLRow(row.url_id(), &url_row)); 341} 342 343} // namespace history 344