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