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