OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "app/sql/connection.h" | 5 #include "app/sql/connection.h" |
6 #include "base/file_path.h" | 6 #include "base/file_path.h" |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/utf_string_conversions.h" | |
10 #include "chrome/browser/history/text_database_manager.h" | 9 #include "chrome/browser/history/text_database_manager.h" |
11 #include "chrome/browser/history/visit_database.h" | 10 #include "chrome/browser/history/visit_database.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
13 | 12 |
14 using base::Time; | 13 using base::Time; |
15 using base::TimeDelta; | 14 using base::TimeDelta; |
16 using base::TimeTicks; | 15 using base::TimeTicks; |
17 | 16 |
18 namespace history { | 17 namespace history { |
19 | 18 |
20 namespace { | 19 namespace { |
21 | 20 |
22 const char* kURL1 = "http://www.google.com/asdf"; | 21 const char* kURL1 = "http://www.google.com/asdf"; |
23 const wchar_t* kTitle1 = L"Google A"; | 22 const wchar_t* kTitle1 = L"Google A"; |
24 const char* kBody1 = "FOO page one."; | 23 const wchar_t* kBody1 = L"FOO page one."; |
25 | 24 |
26 const char* kURL2 = "http://www.google.com/qwer"; | 25 const char* kURL2 = "http://www.google.com/qwer"; |
27 const wchar_t* kTitle2 = L"Google B"; | 26 const wchar_t* kTitle2 = L"Google B"; |
28 const char* kBody2 = "FOO two."; | 27 const wchar_t* kBody2 = L"FOO two."; |
29 | 28 |
30 const char* kURL3 = "http://www.google.com/zxcv"; | 29 const char* kURL3 = "http://www.google.com/zxcv"; |
31 const wchar_t* kTitle3 = L"Google C"; | 30 const wchar_t* kTitle3 = L"Google C"; |
32 const char* kBody3 = "FOO drei"; | 31 const wchar_t* kBody3 = L"FOO drei"; |
33 | 32 |
34 const char* kURL4 = "http://www.google.com/hjkl"; | 33 const char* kURL4 = "http://www.google.com/hjkl"; |
35 const wchar_t* kTitle4 = L"Google D"; | 34 const wchar_t* kTitle4 = L"Google D"; |
36 const char* kBody4 = "FOO lalala four."; | 35 const wchar_t* kBody4 = L"FOO lalala four."; |
37 | 36 |
38 const char* kURL5 = "http://www.google.com/uiop"; | 37 const char* kURL5 = "http://www.google.com/uiop"; |
39 const wchar_t* kTitle5 = L"Google cinq"; | 38 const wchar_t* kTitle5 = L"Google cinq"; |
40 const char* kBody5 = "FOO page one."; | 39 const wchar_t* kBody5 = L"FOO page one."; |
41 | 40 |
42 // This provides a simple implementation of a URL+VisitDatabase using an | 41 // This provides a simple implementation of a URL+VisitDatabase using an |
43 // in-memory sqlite connection. The text database manager expects to be able to | 42 // in-memory sqlite connection. The text database manager expects to be able to |
44 // update the visit database to keep in sync. | 43 // update the visit database to keep in sync. |
45 class InMemDB : public URLDatabase, public VisitDatabase { | 44 class InMemDB : public URLDatabase, public VisitDatabase { |
46 public: | 45 public: |
47 InMemDB() { | 46 InMemDB() { |
48 EXPECT_TRUE(db_.OpenInMemory()); | 47 EXPECT_TRUE(db_.OpenInMemory()); |
49 CreateURLTable(false); | 48 CreateURLTable(false); |
50 InitVisitTable(); | 49 InitVisitTable(); |
(...skipping 25 matching lines...) Expand all Loading... |
76 visit_row.url_id = 1; | 75 visit_row.url_id = 1; |
77 visit_row.visit_time = Time::FromUTCExploded(exploded); | 76 visit_row.visit_time = Time::FromUTCExploded(exploded); |
78 visit_row.referring_visit = 0; | 77 visit_row.referring_visit = 0; |
79 visit_row.transition = 0; | 78 visit_row.transition = 0; |
80 visit_row.segment_id = 0; | 79 visit_row.segment_id = 0; |
81 visit_row.is_indexed = false; | 80 visit_row.is_indexed = false; |
82 VisitID visit_id = visit_db->AddVisit(&visit_row); | 81 VisitID visit_id = visit_db->AddVisit(&visit_row); |
83 | 82 |
84 times->push_back(visit_row.visit_time); | 83 times->push_back(visit_row.visit_time); |
85 manager.AddPageData(GURL(kURL1), visit_row.url_id, visit_row.visit_id, | 84 manager.AddPageData(GURL(kURL1), visit_row.url_id, visit_row.visit_id, |
86 visit_row.visit_time, kTitle1, UTF8ToUTF16(kBody1)); | 85 visit_row.visit_time, kTitle1, kBody1); |
87 | 86 |
88 exploded.day_of_month++; | 87 exploded.day_of_month++; |
89 visit_row.url_id = 2; | 88 visit_row.url_id = 2; |
90 visit_row.visit_time = Time::FromUTCExploded(exploded); | 89 visit_row.visit_time = Time::FromUTCExploded(exploded); |
91 visit_id = visit_db->AddVisit(&visit_row); | 90 visit_id = visit_db->AddVisit(&visit_row); |
92 times->push_back(visit_row.visit_time); | 91 times->push_back(visit_row.visit_time); |
93 manager.AddPageData(GURL(kURL2), visit_row.url_id, visit_row.visit_id, | 92 manager.AddPageData(GURL(kURL2), visit_row.url_id, visit_row.visit_id, |
94 visit_row.visit_time, kTitle2, UTF8ToUTF16(kBody2)); | 93 visit_row.visit_time, kTitle2, kBody2); |
95 | 94 |
96 exploded.day_of_month++; | 95 exploded.day_of_month++; |
97 visit_row.url_id = 2; | 96 visit_row.url_id = 2; |
98 visit_row.visit_time = Time::FromUTCExploded(exploded); | 97 visit_row.visit_time = Time::FromUTCExploded(exploded); |
99 visit_id = visit_db->AddVisit(&visit_row); | 98 visit_id = visit_db->AddVisit(&visit_row); |
100 times->push_back(visit_row.visit_time); | 99 times->push_back(visit_row.visit_time); |
101 manager.AddPageData(GURL(kURL3), visit_row.url_id, visit_row.visit_id, | 100 manager.AddPageData(GURL(kURL3), visit_row.url_id, visit_row.visit_id, |
102 visit_row.visit_time, kTitle3, UTF8ToUTF16(kBody3)); | 101 visit_row.visit_time, kTitle3, kBody3); |
103 | 102 |
104 // Put the next ones in the next month. | 103 // Put the next ones in the next month. |
105 exploded.month++; | 104 exploded.month++; |
106 visit_row.url_id = 2; | 105 visit_row.url_id = 2; |
107 visit_row.visit_time = Time::FromUTCExploded(exploded); | 106 visit_row.visit_time = Time::FromUTCExploded(exploded); |
108 visit_id = visit_db->AddVisit(&visit_row); | 107 visit_id = visit_db->AddVisit(&visit_row); |
109 times->push_back(visit_row.visit_time); | 108 times->push_back(visit_row.visit_time); |
110 manager.AddPageData(GURL(kURL4), visit_row.url_id, visit_row.visit_id, | 109 manager.AddPageData(GURL(kURL4), visit_row.url_id, visit_row.visit_id, |
111 visit_row.visit_time, kTitle4, UTF8ToUTF16(kBody4)); | 110 visit_row.visit_time, kTitle4, kBody4); |
112 | 111 |
113 exploded.day_of_month++; | 112 exploded.day_of_month++; |
114 visit_row.url_id = 2; | 113 visit_row.url_id = 2; |
115 visit_row.visit_time = Time::FromUTCExploded(exploded); | 114 visit_row.visit_time = Time::FromUTCExploded(exploded); |
116 visit_id = visit_db->AddVisit(&visit_row); | 115 visit_id = visit_db->AddVisit(&visit_row); |
117 times->push_back(visit_row.visit_time); | 116 times->push_back(visit_row.visit_time); |
118 manager.AddPageData(GURL(kURL5), visit_row.url_id, visit_row.visit_id, | 117 manager.AddPageData(GURL(kURL5), visit_row.url_id, visit_row.visit_id, |
119 visit_row.visit_time, kTitle5, UTF8ToUTF16(kBody5)); | 118 visit_row.visit_time, kTitle5, kBody5); |
120 | 119 |
121 // Put the first one in again in the second month. | 120 // Put the first one in again in the second month. |
122 exploded.day_of_month++; | 121 exploded.day_of_month++; |
123 visit_row.url_id = 2; | 122 visit_row.url_id = 2; |
124 visit_row.visit_time = Time::FromUTCExploded(exploded); | 123 visit_row.visit_time = Time::FromUTCExploded(exploded); |
125 visit_id = visit_db->AddVisit(&visit_row); | 124 visit_id = visit_db->AddVisit(&visit_row); |
126 times->push_back(visit_row.visit_time); | 125 times->push_back(visit_row.visit_time); |
127 manager.AddPageData(GURL(kURL1), visit_row.url_id, visit_row.visit_id, | 126 manager.AddPageData(GURL(kURL1), visit_row.url_id, visit_row.visit_id, |
128 visit_row.visit_time, kTitle1, UTF8ToUTF16(kBody1)); | 127 visit_row.visit_time, kTitle1, kBody1); |
129 } | 128 } |
130 | 129 |
131 bool ResultsHaveURL(const std::vector<TextDatabase::Match>& results, | 130 bool ResultsHaveURL(const std::vector<TextDatabase::Match>& results, |
132 const char* url) { | 131 const char* url) { |
133 GURL gurl(url); | 132 GURL gurl(url); |
134 for (size_t i = 0; i < results.size(); i++) { | 133 for (size_t i = 0; i < results.size(); i++) { |
135 if (results[i].url == gurl) | 134 if (results[i].url == gurl) |
136 return true; | 135 return true; |
137 } | 136 } |
138 return false; | 137 return false; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 TEST_F(TextDatabaseManagerTest, InsertCompleteNoVisit) { | 197 TEST_F(TextDatabaseManagerTest, InsertCompleteNoVisit) { |
199 ASSERT_TRUE(Init()); | 198 ASSERT_TRUE(Init()); |
200 InMemDB visit_db; | 199 InMemDB visit_db; |
201 TextDatabaseManager manager(dir_, &visit_db, &visit_db); | 200 TextDatabaseManager manager(dir_, &visit_db, &visit_db); |
202 ASSERT_TRUE(manager.Init(NULL)); | 201 ASSERT_TRUE(manager.Init(NULL)); |
203 | 202 |
204 // First add one without a visit. | 203 // First add one without a visit. |
205 const GURL url(kURL1); | 204 const GURL url(kURL1); |
206 manager.AddPageURL(url, 0, 0, Time::Now()); | 205 manager.AddPageURL(url, 0, 0, Time::Now()); |
207 manager.AddPageTitle(url, kTitle1); | 206 manager.AddPageTitle(url, kTitle1); |
208 manager.AddPageContents(url, UTF8ToUTF16(kBody1)); | 207 manager.AddPageContents(url, kBody1); |
209 | 208 |
210 // Check that the page got added. | 209 // Check that the page got added. |
211 QueryOptions options; | 210 QueryOptions options; |
212 std::vector<TextDatabase::Match> results; | 211 std::vector<TextDatabase::Match> results; |
213 Time first_time_searched; | 212 Time first_time_searched; |
214 | 213 |
215 manager.GetTextMatches(L"FOO", options, &results, &first_time_searched); | 214 manager.GetTextMatches(L"FOO", options, &results, &first_time_searched); |
216 ASSERT_EQ(1U, results.size()); | 215 ASSERT_EQ(1U, results.size()); |
217 EXPECT_EQ(kTitle1, results[0].title); | 216 EXPECT_EQ(kTitle1, results[0].title); |
218 } | 217 } |
(...skipping 13 matching lines...) Expand all Loading... |
232 visit.visit_time = Time::Now(); | 231 visit.visit_time = Time::Now(); |
233 visit.referring_visit = 0; | 232 visit.referring_visit = 0; |
234 visit.transition = PageTransition::LINK; | 233 visit.transition = PageTransition::LINK; |
235 visit.segment_id = 0; | 234 visit.segment_id = 0; |
236 visit.is_indexed = false; | 235 visit.is_indexed = false; |
237 visit_db.AddVisit(&visit); | 236 visit_db.AddVisit(&visit); |
238 | 237 |
239 // Add a full text indexed entry for that visit. | 238 // Add a full text indexed entry for that visit. |
240 const GURL url(kURL2); | 239 const GURL url(kURL2); |
241 manager.AddPageURL(url, visit.url_id, visit.visit_id, visit.visit_time); | 240 manager.AddPageURL(url, visit.url_id, visit.visit_id, visit.visit_time); |
242 manager.AddPageContents(url, UTF8ToUTF16(kBody2)); | 241 manager.AddPageContents(url, kBody2); |
243 manager.AddPageTitle(url, kTitle2); | 242 manager.AddPageTitle(url, kTitle2); |
244 | 243 |
245 // Check that the page got added. | 244 // Check that the page got added. |
246 QueryOptions options; | 245 QueryOptions options; |
247 std::vector<TextDatabase::Match> results; | 246 std::vector<TextDatabase::Match> results; |
248 Time first_time_searched; | 247 Time first_time_searched; |
249 | 248 |
250 manager.GetTextMatches(L"FOO", options, &results, &first_time_searched); | 249 manager.GetTextMatches(L"FOO", options, &results, &first_time_searched); |
251 ASSERT_EQ(1U, results.size()); | 250 ASSERT_EQ(1U, results.size()); |
252 EXPECT_EQ(kTitle2, results[0].title); | 251 EXPECT_EQ(kTitle2, results[0].title); |
(...skipping 16 matching lines...) Expand all Loading... |
269 manager.AddPageURL(url1, 0, 0, Time::Now()); | 268 manager.AddPageURL(url1, 0, 0, Time::Now()); |
270 | 269 |
271 // Now add a second one with a URL and title. | 270 // Now add a second one with a URL and title. |
272 GURL url2(kURL2); | 271 GURL url2(kURL2); |
273 manager.AddPageURL(url2, 0, 0, Time::Now()); | 272 manager.AddPageURL(url2, 0, 0, Time::Now()); |
274 manager.AddPageTitle(url2, kTitle2); | 273 manager.AddPageTitle(url2, kTitle2); |
275 | 274 |
276 // The third one has a URL and body. | 275 // The third one has a URL and body. |
277 GURL url3(kURL3); | 276 GURL url3(kURL3); |
278 manager.AddPageURL(url3, 0, 0, Time::Now()); | 277 manager.AddPageURL(url3, 0, 0, Time::Now()); |
279 manager.AddPageContents(url3, UTF8ToUTF16(kBody3)); | 278 manager.AddPageContents(url3, kBody3); |
280 | 279 |
281 // Expire stuff very fast. This assumes that the time between the first | 280 // Expire stuff very fast. This assumes that the time between the first |
282 // AddPageURL and this line is less than the expiration time (20 seconds). | 281 // AddPageURL and this line is less than the expiration time (20 seconds). |
283 TimeTicks added_time = TimeTicks::Now(); | 282 TimeTicks added_time = TimeTicks::Now(); |
284 TimeTicks expire_time = added_time + TimeDelta::FromSeconds(5); | 283 TimeTicks expire_time = added_time + TimeDelta::FromSeconds(5); |
285 manager.FlushOldChangesForTime(expire_time); | 284 manager.FlushOldChangesForTime(expire_time); |
286 | 285 |
287 // Do a query, nothing should be added yet. | 286 // Do a query, nothing should be added yet. |
288 QueryOptions options; | 287 QueryOptions options; |
289 std::vector<TextDatabase::Match> results; | 288 std::vector<TextDatabase::Match> results; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 manager.AddPageTitle(url, L"Some unique title"); | 335 manager.AddPageTitle(url, L"Some unique title"); |
337 Time first_time_searched; | 336 Time first_time_searched; |
338 QueryOptions options; | 337 QueryOptions options; |
339 std::vector<TextDatabase::Match> results; | 338 std::vector<TextDatabase::Match> results; |
340 manager.GetTextMatches(L"unique", options, &results, &first_time_searched); | 339 manager.GetTextMatches(L"unique", options, &results, &first_time_searched); |
341 EXPECT_EQ(1U, results.size()); | 340 EXPECT_EQ(1U, results.size()); |
342 manager.GetTextMatches(L"chocolate", options, &results, &first_time_searched); | 341 manager.GetTextMatches(L"chocolate", options, &results, &first_time_searched); |
343 EXPECT_EQ(0U, results.size()); | 342 EXPECT_EQ(0U, results.size()); |
344 | 343 |
345 // Now add the body, which should be queryable. | 344 // Now add the body, which should be queryable. |
346 manager.AddPageContents(url, UTF8ToUTF16("Very awesome body")); | 345 manager.AddPageContents(url, L"Very awesome body"); |
347 manager.GetTextMatches(L"awesome", options, &results, &first_time_searched); | 346 manager.GetTextMatches(L"awesome", options, &results, &first_time_searched); |
348 EXPECT_EQ(1U, results.size()); | 347 EXPECT_EQ(1U, results.size()); |
349 | 348 |
350 // Adding the body will actually copy the title from the URL table rather | 349 // Adding the body will actually copy the title from the URL table rather |
351 // than the previously indexed row (we made them not match above). This isn't | 350 // than the previously indexed row (we made them not match above). This isn't |
352 // necessarily what we want, but it's how it's implemented, and we don't want | 351 // necessarily what we want, but it's how it's implemented, and we don't want |
353 // to regress it. | 352 // to regress it. |
354 manager.GetTextMatches(L"chocolate", options, &results, &first_time_searched); | 353 manager.GetTextMatches(L"chocolate", options, &results, &first_time_searched); |
355 EXPECT_EQ(1U, results.size()); | 354 EXPECT_EQ(1U, results.size()); |
356 } | 355 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 EXPECT_TRUE(ResultsHaveURL(results, kURL2)); | 507 EXPECT_TRUE(ResultsHaveURL(results, kURL2)); |
509 EXPECT_TRUE(ResultsHaveURL(results, kURL1)); | 508 EXPECT_TRUE(ResultsHaveURL(results, kURL1)); |
510 | 509 |
511 // Try to query some more, there should be no results. | 510 // Try to query some more, there should be no results. |
512 options.end_time = first_time_searched; | 511 options.end_time = first_time_searched; |
513 manager.GetTextMatches(L"FOO", options, &results, &first_time_searched); | 512 manager.GetTextMatches(L"FOO", options, &results, &first_time_searched); |
514 EXPECT_EQ(0U, results.size()); | 513 EXPECT_EQ(0U, results.size()); |
515 } | 514 } |
516 | 515 |
517 } // namespace history | 516 } // namespace history |
OLD | NEW |