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/visit_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/urls_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 VisitSQLHandlerTest : public testing::Test { 24 public: 25 VisitSQLHandlerTest() 26 : urls_sql_handler_(&history_db_), 27 visit_sql_handler_(&history_db_) { 28 } 29 virtual ~VisitSQLHandlerTest() {} 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(VisitSQLHandlerTest); 50}; 51 52// Insert a url with only url set to verify no visit was inserted in visit 53// table. 54TEST_F(VisitSQLHandlerTest, 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 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 61 62 URLRow url_row; 63 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 64 65 // Noting should be inserted to visit table. 66 VisitVector visits; 67 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 68 EXPECT_EQ(0u, visits.size()); 69} 70 71// Insert a url with last visit time set to verify a visit was inserted. 72TEST_F(VisitSQLHandlerTest, 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 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 80 81 URLRow url_row; 82 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 83 84 VisitVector visits; 85 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 86 EXPECT_EQ(1u, visits.size()); 87 EXPECT_EQ(row.last_visit_time(), visits[0].visit_time); 88} 89 90// Insert a urls with created time to verify the a visit was inserted. 91TEST_F(VisitSQLHandlerTest, InsertURLWithCreatedTime) { 92 HistoryAndBookmarkRow row; 93 row.set_raw_url("http://google.com"); 94 row.set_url(GURL("http://google.com")); 95 row.set_title(base::UTF8ToUTF16("Google")); 96 row.set_created(Time::Now()); 97 98 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 99 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 100 101 URLRow url_row; 102 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 103 104 VisitVector visits; 105 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 106 EXPECT_EQ(1u, visits.size()); 107 EXPECT_EQ(row.created(), visits[0].visit_time); 108} 109 110// Insert a URL with visit count as 1 to verify a visit was inserted. 111TEST_F(VisitSQLHandlerTest, InsertURLWithVisitCount) { 112 HistoryAndBookmarkRow row; 113 row.set_raw_url("http://google.com"); 114 row.set_url(GURL("http://google.com")); 115 row.set_visit_count(1); 116 117 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 118 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 119 120 URLRow url_row; 121 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 122 123 VisitVector visits; 124 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 125 EXPECT_EQ(1u, visits.size()); 126 EXPECT_NE(Time(), visits[0].visit_time); 127} 128 129// Insert a URL with all values set to verify the visit rows 130// were inserted correctly. 131TEST_F(VisitSQLHandlerTest, Insert) { 132 HistoryAndBookmarkRow row; 133 row.set_raw_url("http://google.com"); 134 row.set_url(GURL("http://google.com")); 135 row.set_visit_count(10); 136 row.set_last_visit_time(Time::Now()); 137 row.set_created(Time::Now() - TimeDelta::FromDays(1)); 138 139 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 140 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 141 142 URLRow url_row; 143 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 144 145 VisitVector visits; 146 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 147 // 10 row were inserted. 148 EXPECT_EQ(10u, visits.size()); 149 // The earlies one has created time set. 150 EXPECT_EQ(row.created(), visits[0].visit_time); 151 // The latest one has last visit time set. 152 EXPECT_EQ(row.last_visit_time(), visits[9].visit_time); 153} 154 155// Test the case that both visit time and visit count updated. 156TEST_F(VisitSQLHandlerTest, UpdateVisitTimeAndVisitCount) { 157 HistoryAndBookmarkRow row; 158 row.set_raw_url("http://google.com"); 159 row.set_url(GURL("http://google.com")); 160 row.set_title(base::UTF8ToUTF16("Google")); 161 row.set_visit_count(10); 162 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 163 164 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 165 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 166 167 URLRow url_row; 168 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 169 170 HistoryAndBookmarkRow update_row; 171 update_row.set_last_visit_time(Time::Now()); 172 update_row.set_visit_count(1); 173 174 TableIDRow id; 175 id.url_id = url_row.id(); 176 TableIDRows ids; 177 ids.push_back(id); 178 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 179 ASSERT_TRUE(visit_sql_handler_.Update(update_row, ids)); 180 181 VisitVector visits; 182 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 183 EXPECT_EQ(1u, visits.size()); 184 EXPECT_EQ(update_row.last_visit_time(), visits[0].visit_time); 185} 186 187// Update visit count to zero to verify the visit rows of this url 188// were removed. 189TEST_F(VisitSQLHandlerTest, UpdateVisitCountZero) { 190 HistoryAndBookmarkRow row; 191 row.set_raw_url("http://google.com"); 192 row.set_url(GURL("http://google.com")); 193 row.set_visit_count(10); 194 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 195 196 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 197 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 198 199 URLRow url_row; 200 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 201 202 HistoryAndBookmarkRow update_row; 203 update_row.set_visit_count(0); 204 TableIDRow id; 205 id.url_id = url_row.id(); 206 TableIDRows ids; 207 ids.push_back(id); 208 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 209 ASSERT_TRUE(visit_sql_handler_.Update(update_row, ids)); 210 211 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 212 EXPECT_EQ(0, url_row.visit_count()); 213 // Last visit is reset. 214 EXPECT_EQ(Time(), url_row.last_visit()); 215 VisitVector visits; 216 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 217 EXPECT_EQ(0u, visits.size()); 218} 219 220// Update both last visit time and created time to verify 221// that visits row are updated correctly. 222TEST_F(VisitSQLHandlerTest, UpdateBothTime) { 223 HistoryAndBookmarkRow row; 224 row.set_raw_url("http://google.com"); 225 row.set_url(GURL("http://google.com")); 226 row.set_visit_count(10); 227 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 228 229 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 230 ASSERT_TRUE(visit_sql_handler_.Insert(&row)); 231 URLRow url_row; 232 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 233 234 HistoryAndBookmarkRow update_row; 235 update_row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(9)); 236 update_row.set_created(Time::Now() - TimeDelta::FromDays(10)); 237 TableIDRow id; 238 id.url_id = url_row.id(); 239 TableIDRows ids; 240 ids.push_back(id); 241 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 242 ASSERT_TRUE(visit_sql_handler_.Update(update_row, ids)); 243 244 VisitVector visits; 245 ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits)); 246 // Though both time are updated, visit count was increase by 1 because of 247 // last visit time's change. 248 EXPECT_EQ(11u, visits.size()); 249 EXPECT_EQ(update_row.created(), visits[0].visit_time); 250 EXPECT_EQ(update_row.last_visit_time(), visits[10].visit_time); 251} 252 253// Update the visit count to verify the new visits are inserted. 254TEST_F(VisitSQLHandlerTest, UpdateVisitCountIncreased) { 255 HistoryAndBookmarkRow row; 256 row.set_raw_url("http://google.com"); 257 row.set_url(GURL("http://google.com")); 258 row.set_visit_count(10); 259 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 260 261 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 262 URLRow url_row; 263 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 264 EXPECT_EQ(row.url(), url_row.url()); 265 EXPECT_EQ(10, url_row.visit_count()); 266 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 267 268 HistoryAndBookmarkRow update_row; 269 update_row.set_visit_count(11); 270 TableIDRow id; 271 id.url_id = url_row.id(); 272 TableIDRows ids; 273 ids.push_back(id); 274 ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids)); 275 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 276 EXPECT_EQ(row.url(), url_row.url()); 277 EXPECT_EQ(11, url_row.visit_count()); 278 EXPECT_LT(row.last_visit_time(), url_row.last_visit()); 279} 280 281TEST_F(VisitSQLHandlerTest, Delete) { 282 HistoryAndBookmarkRow row; 283 row.set_raw_url("http://google.com"); 284 row.set_url(GURL("http://google.com")); 285 row.set_visit_count(10); 286 row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10)); 287 288 ASSERT_TRUE(urls_sql_handler_.Insert(&row)); 289 URLRow url_row; 290 ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row)); 291 EXPECT_EQ(row.url(), url_row.url()); 292 EXPECT_EQ(10, url_row.visit_count()); 293 EXPECT_EQ(row.last_visit_time(), url_row.last_visit()); 294 295 TableIDRow id; 296 id.url_id = url_row.id(); 297 TableIDRows ids; 298 ids.push_back(id); 299 ASSERT_TRUE(urls_sql_handler_.Delete(ids)); 300 EXPECT_FALSE(history_db_.GetURLRow(row.url_id(), &url_row)); 301} 302 303} // namespace history 304