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