| 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 |