Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(498)

Side by Side Diff: chrome/browser/history/in_memory_url_index_unittest.cc

Issue 9316109: Move Ownership of IMUI to HistoryService. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Qualify globally scoped friend classes. Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 <fstream> 5 #include <fstream>
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/message_loop.h"
9 #include "base/path_service.h" 10 #include "base/path_service.h"
11 #include "base/string_util.h"
10 #include "base/string16.h" 12 #include "base/string16.h"
11 #include "base/string_util.h"
12 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/autocomplete/autocomplete.h" 14 #include "chrome/browser/autocomplete/autocomplete.h"
14 #include "chrome/browser/history/in_memory_database.h" 15 #include "chrome/browser/history/history.h"
16 #include "chrome/browser/history/history_backend.h"
17 #include "chrome/browser/history/history_database.h"
18 #include "chrome/browser/history/in_memory_url_index_types.h"
15 #include "chrome/browser/history/in_memory_url_index.h" 19 #include "chrome/browser/history/in_memory_url_index.h"
16 #include "chrome/browser/history/in_memory_url_index_types.h" 20 #include "chrome/browser/history/url_index_private_data.h"
17 #include "chrome/common/chrome_paths.h" 21 #include "chrome/common/chrome_paths.h"
22 #include "chrome/test/base/testing_profile.h"
23 #include "content/test/test_browser_thread.h"
18 #include "sql/transaction.h" 24 #include "sql/transaction.h"
19 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
20 26
21 // The test version of the history url database table ('url') is contained in 27 // The test version of the history url database table ('url') is contained in
22 // a database file created from a text file('url_history_provider_test.db.txt'). 28 // a database file created from a text file('url_history_provider_test.db.txt').
23 // The only difference between this table and a live 'urls' table from a 29 // The only difference between this table and a live 'urls' table from a
24 // profile is that the last_visit_time column in the test table contains a 30 // profile is that the last_visit_time column in the test table contains a
25 // number specifying the number of days relative to 'today' to which the 31 // number specifying the number of days relative to 'today' to which the
26 // absolute time should be set during the test setup stage. 32 // absolute time should be set during the test setup stage.
27 // 33 //
28 // The format of the test database text file is of a SQLite .dump file. 34 // The format of the test database text file is of a SQLite .dump file.
29 // Note that only lines whose first character is an upper-case letter are 35 // Note that only lines whose first character is an upper-case letter are
30 // processed when creating the test database. 36 // processed when creating the test database.
31 37
32 namespace history { 38 namespace history {
33 39
34 class InMemoryURLIndexTest : public testing::Test, 40 class InMemoryURLIndexTest : public testing::Test {
35 public InMemoryDatabase {
36 public: 41 public:
37 InMemoryURLIndexTest() { InitFromScratch(); } 42 InMemoryURLIndexTest();
38 43
39 protected: 44 protected:
40 // Test setup. 45 // Test setup.
41 virtual void SetUp(); 46 virtual void SetUp();
42 47
43 // Allows the database containing the test data to be customized by 48 // Allows the database containing the test data to be customized by
44 // subclasses. 49 // subclasses.
45 virtual FilePath::StringType TestDBName() const; 50 virtual FilePath::StringType TestDBName() const;
46 51
47 // Convenience function to create a URLRow with basic data for |url|, |title|, 52 // Convenience function to create a URLRow with basic data for |url|, |title|,
48 // |visit_count|, and |typed_count|. |last_visit_ago| gives the number of 53 // |visit_count|, and |typed_count|. |last_visit_ago| gives the number of
49 // days from now to set the URL's last_visit. 54 // days from now to set the URL's last_visit.
50 URLRow MakeURLRow(const char* url, 55 URLRow MakeURLRow(const char* url,
51 const char* title, 56 const char* title,
52 int visit_count, 57 int visit_count,
53 int last_visit_ago, 58 int last_visit_ago,
54 int typed_count); 59 int typed_count);
55 60
56 // Convenience functions for easily creating vectors of search terms. 61 // Convenience functions for easily creating vectors of search terms.
57 String16Vector Make1Term(const char* term) const; 62 String16Vector Make1Term(const char* term) const;
58 String16Vector Make2Terms(const char* term_1, const char* term_2) const; 63 String16Vector Make2Terms(const char* term_1, const char* term_2) const;
59 64
60 // Validates that the given |term| is contained in |cache| and that it is 65 // Validates that the given |term| is contained in |cache| and that it is
61 // marked as in-use. 66 // marked as in-use.
62 void CheckTerm(const URLIndexPrivateData::SearchTermCacheMap& cache, 67 void CheckTerm(const URLIndexPrivateData::SearchTermCacheMap& cache,
63 string16 term) const; 68 string16 term) const;
64 69
70 // Pass-through function to simplify our friendship with HistoryService.
71 sql::Connection& GetDB();
72
73 // Pass-through functions to simplify our friendship with InMemoryURLIndex.
74 URLIndexPrivateData* GetPrivateData() const;
75 bool GetCacheFilePath(FilePath* file_path) const;
76 void ClearHistoryDir() const;
77
78 // Pass-through functions to simplify our friendship with URLIndexPrivateData.
79 bool UpdateURL(const URLRow& row);
80 bool DeleteURL(const GURL& url);
81
82 MessageLoopForUI message_loop_;
83 content::TestBrowserThread ui_thread_;
84 content::TestBrowserThread file_thread_;
85 TestingProfile profile_;
86
65 scoped_ptr<InMemoryURLIndex> url_index_; 87 scoped_ptr<InMemoryURLIndex> url_index_;
88 HistoryDatabase* history_database_;
66 }; 89 };
67 90
91 InMemoryURLIndexTest::InMemoryURLIndexTest()
92 : ui_thread_(content::BrowserThread::UI, &message_loop_),
93 file_thread_(content::BrowserThread::FILE, &message_loop_) {
94 }
95
96 sql::Connection& InMemoryURLIndexTest::GetDB() {
97 return history_database_->GetDB();
98 }
99
100 URLIndexPrivateData* InMemoryURLIndexTest::GetPrivateData() const {
101 DCHECK(url_index_->private_data_.get());
102 return url_index_->private_data_.get();
103 }
104
105 bool InMemoryURLIndexTest::GetCacheFilePath(FilePath* file_path) const {
106 DCHECK(file_path);
107 return url_index_->GetCacheFilePath(file_path);
108 }
109
110 void InMemoryURLIndexTest::ClearHistoryDir() const {
111 url_index_->history_dir_.clear();
112 }
113
114 bool InMemoryURLIndexTest::UpdateURL(const URLRow& row) {
115 return url_index_->private_data_->UpdateURL(row);
116 }
117
118 bool InMemoryURLIndexTest::DeleteURL(const GURL& url) {
119 return url_index_->private_data_->DeleteURL(url);
120 }
121
68 void InMemoryURLIndexTest::SetUp() { 122 void InMemoryURLIndexTest::SetUp() {
123 // We cannot access the database until the backend has been loaded.
124 profile_.CreateHistoryService(true, false);
125 profile_.CreateBookmarkModel(true);
126 profile_.BlockUntilBookmarkModelLoaded();
127 profile_.BlockUntilHistoryProcessesPendingRequests();
128 HistoryService* history_service =
129 profile_.GetHistoryService(Profile::EXPLICIT_ACCESS);
130 ASSERT_TRUE(history_service);
131 HistoryBackend* backend = history_service->history_backend_.get();
132 history_database_ = backend->db();
133
69 // Create and populate a working copy of the URL history database. 134 // Create and populate a working copy of the URL history database.
70 FilePath history_proto_path; 135 FilePath history_proto_path;
71 PathService::Get(chrome::DIR_TEST_DATA, &history_proto_path); 136 PathService::Get(chrome::DIR_TEST_DATA, &history_proto_path);
72 history_proto_path = history_proto_path.Append( 137 history_proto_path = history_proto_path.Append(
73 FILE_PATH_LITERAL("History")); 138 FILE_PATH_LITERAL("History"));
74 history_proto_path = history_proto_path.Append(TestDBName()); 139 history_proto_path = history_proto_path.Append(TestDBName());
75 EXPECT_TRUE(file_util::PathExists(history_proto_path)); 140 EXPECT_TRUE(file_util::PathExists(history_proto_path));
76 141
77 std::ifstream proto_file(history_proto_path.value().c_str()); 142 std::ifstream proto_file(history_proto_path.value().c_str());
78 static const size_t kCommandBufferMaxSize = 2048; 143 static const size_t kCommandBufferMaxSize = 2048;
79 char sql_cmd_line[kCommandBufferMaxSize]; 144 char sql_cmd_line[kCommandBufferMaxSize];
80 145
81 sql::Connection& db(GetDB()); 146 sql::Connection& db(GetDB());
147 ASSERT_TRUE(db.is_open());
82 { 148 {
83 sql::Transaction transaction(&db); 149 sql::Transaction transaction(&db);
84 transaction.Begin(); 150 transaction.Begin();
85 while (!proto_file.eof()) { 151 while (!proto_file.eof()) {
86 proto_file.getline(sql_cmd_line, kCommandBufferMaxSize); 152 proto_file.getline(sql_cmd_line, kCommandBufferMaxSize);
87 if (!proto_file.eof()) { 153 if (!proto_file.eof()) {
88 // We only process lines which begin with a upper-case letter. 154 // We only process lines which begin with a upper-case letter.
89 // TODO(mrossetti): Can iswupper() be used here? 155 // TODO(mrossetti): Can iswupper() be used here?
90 if (sql_cmd_line[0] >= 'A' && sql_cmd_line[0] <= 'Z') { 156 if (sql_cmd_line[0] >= 'A' && sql_cmd_line[0] <= 'Z') {
91 std::string sql_cmd(sql_cmd_line); 157 std::string sql_cmd(sql_cmd_line);
(...skipping 11 matching lines...) Expand all
103 sql::Statement statement(db.GetUniqueStatement( 169 sql::Statement statement(db.GetUniqueStatement(
104 "SELECT" HISTORY_URL_ROW_FIELDS "FROM urls;")); 170 "SELECT" HISTORY_URL_ROW_FIELDS "FROM urls;"));
105 ASSERT_TRUE(statement.is_valid()); 171 ASSERT_TRUE(statement.is_valid());
106 base::Time time_right_now = base::Time::NowFromSystemTime(); 172 base::Time time_right_now = base::Time::NowFromSystemTime();
107 base::TimeDelta day_delta = base::TimeDelta::FromDays(1); 173 base::TimeDelta day_delta = base::TimeDelta::FromDays(1);
108 { 174 {
109 sql::Transaction transaction(&db); 175 sql::Transaction transaction(&db);
110 transaction.Begin(); 176 transaction.Begin();
111 while (statement.Step()) { 177 while (statement.Step()) {
112 URLRow row; 178 URLRow row;
113 FillURLRow(statement, &row); 179 history_database_->FillURLRow(statement, &row);
114 base::Time last_visit = time_right_now; 180 base::Time last_visit = time_right_now;
115 for (int64 i = row.last_visit().ToInternalValue(); i > 0; --i) 181 for (int64 i = row.last_visit().ToInternalValue(); i > 0; --i)
116 last_visit -= day_delta; 182 last_visit -= day_delta;
117 row.set_last_visit(last_visit); 183 row.set_last_visit(last_visit);
118 UpdateURLRow(row.id(), row); 184 history_database_->UpdateURLRow(row.id(), row);
119 } 185 }
120 transaction.Commit(); 186 transaction.Commit();
121 } 187 }
188
189 url_index_.reset(
190 new InMemoryURLIndex(&profile_, FilePath(), "en,ja,hi,zh"));
191 url_index_->Init();
192 url_index_->RebuildFromHistory(history_database_);
122 } 193 }
123 194
124 FilePath::StringType InMemoryURLIndexTest::TestDBName() const { 195 FilePath::StringType InMemoryURLIndexTest::TestDBName() const {
125 return FILE_PATH_LITERAL("url_history_provider_test.db.txt"); 196 return FILE_PATH_LITERAL("url_history_provider_test.db.txt");
126 } 197 }
127 198
128 URLRow InMemoryURLIndexTest::MakeURLRow(const char* url, 199 URLRow InMemoryURLIndexTest::MakeURLRow(const char* url,
129 const char* title, 200 const char* title,
130 int visit_count, 201 int visit_count,
131 int last_visit_ago, 202 int last_visit_ago,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 259
189 class LimitedInMemoryURLIndexTest : public InMemoryURLIndexTest { 260 class LimitedInMemoryURLIndexTest : public InMemoryURLIndexTest {
190 protected: 261 protected:
191 FilePath::StringType TestDBName() const; 262 FilePath::StringType TestDBName() const;
192 }; 263 };
193 264
194 FilePath::StringType LimitedInMemoryURLIndexTest::TestDBName() const { 265 FilePath::StringType LimitedInMemoryURLIndexTest::TestDBName() const {
195 return FILE_PATH_LITERAL("url_history_provider_test_limited.db.txt"); 266 return FILE_PATH_LITERAL("url_history_provider_test_limited.db.txt");
196 } 267 }
197 268
198 TEST_F(InMemoryURLIndexTest, Construction) {
199 url_index_.reset(new InMemoryURLIndex(FilePath()));
200 EXPECT_TRUE(url_index_.get());
201 }
202
203 TEST_F(LimitedInMemoryURLIndexTest, Initialization) { 269 TEST_F(LimitedInMemoryURLIndexTest, Initialization) {
204 // Verify that the database contains the expected number of items, which 270 // Verify that the database contains the expected number of items, which
205 // is the pre-filtered count, i.e. all of the items. 271 // is the pre-filtered count, i.e. all of the items.
206 sql::Statement statement(GetDB().GetUniqueStatement("SELECT * FROM urls;")); 272 sql::Connection& db(GetDB());
273 sql::Statement statement(db.GetUniqueStatement("SELECT * FROM urls;"));
207 ASSERT_TRUE(statement.is_valid()); 274 ASSERT_TRUE(statement.is_valid());
208 uint64 row_count = 0; 275 uint64 row_count = 0;
209 while (statement.Step()) ++row_count; 276 while (statement.Step()) ++row_count;
210 EXPECT_EQ(1U, row_count); 277 EXPECT_EQ(1U, row_count);
211 url_index_.reset(new InMemoryURLIndex(FilePath())); 278 url_index_.reset(
212 url_index_->Init(this, "en,ja,hi,zh"); 279 new InMemoryURLIndex(&profile_, FilePath(), "en,ja,hi,zh"));
280 url_index_->Init();
281 url_index_->RebuildFromHistory(history_database_);
213 URLIndexPrivateData& private_data(*(url_index_->private_data_)); 282 URLIndexPrivateData& private_data(*(url_index_->private_data_));
214 283
215 // history_info_map_ should have the same number of items as were filtered. 284 // history_info_map_ should have the same number of items as were filtered.
216 EXPECT_EQ(1U, private_data.history_info_map_.size()); 285 EXPECT_EQ(1U, private_data.history_info_map_.size());
217 EXPECT_EQ(35U, private_data.char_word_map_.size()); 286 EXPECT_EQ(35U, private_data.char_word_map_.size());
218 EXPECT_EQ(17U, private_data.word_map_.size()); 287 EXPECT_EQ(17U, private_data.word_map_.size());
219 } 288 }
220 289
221 TEST_F(InMemoryURLIndexTest, Retrieval) { 290 TEST_F(InMemoryURLIndexTest, Retrieval) {
222 url_index_.reset(new InMemoryURLIndex(FilePath()));
223 url_index_->Init(this, "en,ja,hi,zh");
224 // The term will be lowercased by the search.
225
226 // See if a very specific term gives a single result. 291 // See if a very specific term gives a single result.
227 ScoredHistoryMatches matches = 292 ScoredHistoryMatches matches =
228 url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport")); 293 url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport"));
229 ASSERT_EQ(1U, matches.size()); 294 ASSERT_EQ(1U, matches.size());
230 295
231 // Verify that we got back the result we expected. 296 // Verify that we got back the result we expected.
232 EXPECT_EQ(5, matches[0].url_info.id()); 297 EXPECT_EQ(5, matches[0].url_info.id());
233 EXPECT_EQ("http://drudgereport.com/", matches[0].url_info.url().spec()); 298 EXPECT_EQ("http://drudgereport.com/", matches[0].url_info.url().spec());
234 EXPECT_EQ(ASCIIToUTF16("DRUDGE REPORT 2010"), matches[0].url_info.title()); 299 EXPECT_EQ(ASCIIToUTF16("DRUDGE REPORT 2010"), matches[0].url_info.title());
235 EXPECT_TRUE(matches[0].can_inline); 300 EXPECT_TRUE(matches[0].can_inline);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("fubar")); 350 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("fubar"));
286 ASSERT_EQ(1U, matches.size()); 351 ASSERT_EQ(1U, matches.size());
287 EXPECT_EQ(34, matches[0].url_info.id()); 352 EXPECT_EQ(34, matches[0].url_info.id());
288 EXPECT_EQ("http://fubarfubarandfubar.com/", matches[0].url_info.url().spec()); 353 EXPECT_EQ("http://fubarfubarandfubar.com/", matches[0].url_info.url().spec());
289 EXPECT_EQ(ASCIIToUTF16("Situation Normal -- FUBARED"), 354 EXPECT_EQ(ASCIIToUTF16("Situation Normal -- FUBARED"),
290 matches[0].url_info.title()); 355 matches[0].url_info.title());
291 EXPECT_TRUE(matches[0].can_inline); 356 EXPECT_TRUE(matches[0].can_inline);
292 } 357 }
293 358
294 TEST_F(InMemoryURLIndexTest, URLPrefixMatching) { 359 TEST_F(InMemoryURLIndexTest, URLPrefixMatching) {
295 url_index_.reset(new InMemoryURLIndex(FilePath()));
296 url_index_->Init(this, "en,ja,hi,zh");
297
298 // "drudgere" - found, can inline 360 // "drudgere" - found, can inline
299 ScoredHistoryMatches matches = 361 ScoredHistoryMatches matches =
300 url_index_->HistoryItemsForTerms(ASCIIToUTF16("drudgere")); 362 url_index_->HistoryItemsForTerms(ASCIIToUTF16("drudgere"));
301 ASSERT_EQ(1U, matches.size()); 363 ASSERT_EQ(1U, matches.size());
302 EXPECT_TRUE(matches[0].can_inline); 364 EXPECT_TRUE(matches[0].can_inline);
303 365
304 // "http://drudgere" - found, can inline 366 // "http://drudgere" - found, can inline
305 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("http://drudgere")); 367 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("http://drudgere"));
306 ASSERT_EQ(1U, matches.size()); 368 ASSERT_EQ(1U, matches.size());
307 EXPECT_TRUE(matches[0].can_inline); 369 EXPECT_TRUE(matches[0].can_inline);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 EXPECT_TRUE(matches[0].can_inline); 410 EXPECT_TRUE(matches[0].can_inline);
349 411
350 // "tp://www.cnn.com" - found, cannot inline 412 // "tp://www.cnn.com" - found, cannot inline
351 matches = 413 matches =
352 url_index_->HistoryItemsForTerms(ASCIIToUTF16("tp://www.cnn.com")); 414 url_index_->HistoryItemsForTerms(ASCIIToUTF16("tp://www.cnn.com"));
353 ASSERT_EQ(1U, matches.size()); 415 ASSERT_EQ(1U, matches.size());
354 EXPECT_TRUE(!matches[0].can_inline); 416 EXPECT_TRUE(!matches[0].can_inline);
355 } 417 }
356 418
357 TEST_F(InMemoryURLIndexTest, ProperStringMatching) { 419 TEST_F(InMemoryURLIndexTest, ProperStringMatching) {
358 url_index_.reset(new InMemoryURLIndex(FilePath()));
359 url_index_->Init(this, "en,ja,hi,zh");
360
361 // Search for the following with the expected results: 420 // Search for the following with the expected results:
362 // "atdmt view" - found 421 // "atdmt view" - found
363 // "atdmt.view" - not found 422 // "atdmt.view" - not found
364 // "view.atdmt" - found 423 // "view.atdmt" - found
365 ScoredHistoryMatches matches = 424 ScoredHistoryMatches matches =
366 url_index_->HistoryItemsForTerms(ASCIIToUTF16("atdmt view")); 425 url_index_->HistoryItemsForTerms(ASCIIToUTF16("atdmt view"));
367 ASSERT_EQ(1U, matches.size()); 426 ASSERT_EQ(1U, matches.size());
368 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("atdmt.view")); 427 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("atdmt.view"));
369 ASSERT_EQ(0U, matches.size()); 428 ASSERT_EQ(0U, matches.size());
370 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("view.atdmt")); 429 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("view.atdmt"));
371 ASSERT_EQ(1U, matches.size()); 430 ASSERT_EQ(1U, matches.size());
372 } 431 }
373 432
374 TEST_F(InMemoryURLIndexTest, HugeResultSet) { 433 TEST_F(InMemoryURLIndexTest, HugeResultSet) {
375 url_index_.reset(new InMemoryURLIndex(FilePath()));
376 url_index_->Init(this, "en,ja,hi,zh");
377
378 // Create a huge set of qualifying history items. 434 // Create a huge set of qualifying history items.
379 for (URLID row_id = 5000; row_id < 6000; ++row_id) { 435 for (URLID row_id = 5000; row_id < 6000; ++row_id) {
380 URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), row_id); 436 URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), row_id);
381 new_row.set_last_visit(base::Time::Now()); 437 new_row.set_last_visit(base::Time::Now());
382 url_index_->UpdateURL(row_id, new_row); 438 EXPECT_TRUE(UpdateURL(new_row));
383 } 439 }
384 440
385 ScoredHistoryMatches matches = 441 ScoredHistoryMatches matches =
386 url_index_->HistoryItemsForTerms(ASCIIToUTF16("b")); 442 url_index_->HistoryItemsForTerms(ASCIIToUTF16("b"));
443 URLIndexPrivateData& private_data(*GetPrivateData());
387 ASSERT_EQ(AutocompleteProvider::kMaxMatches, matches.size()); 444 ASSERT_EQ(AutocompleteProvider::kMaxMatches, matches.size());
388 // There are 7 matches already in the database. 445 // There are 7 matches already in the database.
389 URLIndexPrivateData& private_data(*(url_index_->private_data_.get()));
390 ASSERT_EQ(1008U, private_data.pre_filter_item_count_); 446 ASSERT_EQ(1008U, private_data.pre_filter_item_count_);
391 ASSERT_EQ(500U, private_data.post_filter_item_count_); 447 ASSERT_EQ(500U, private_data.post_filter_item_count_);
392 ASSERT_EQ(AutocompleteProvider::kMaxMatches, 448 ASSERT_EQ(AutocompleteProvider::kMaxMatches,
393 private_data.post_scoring_item_count_); 449 private_data.post_scoring_item_count_);
394 } 450 }
395 451
396 TEST_F(InMemoryURLIndexTest, TitleSearch) { 452 TEST_F(InMemoryURLIndexTest, TitleSearch) {
397 url_index_.reset(new InMemoryURLIndex(FilePath()));
398 url_index_->Init(this, "en,ja,hi,zh");
399 // Signal if someone has changed the test DB. 453 // Signal if someone has changed the test DB.
400 EXPECT_EQ(28U, url_index_->private_data_->history_info_map_.size()); 454 EXPECT_EQ(28U, GetPrivateData()->history_info_map_.size());
401 455
402 // Ensure title is being searched. 456 // Ensure title is being searched.
403 ScoredHistoryMatches matches = 457 ScoredHistoryMatches matches =
404 url_index_->HistoryItemsForTerms(ASCIIToUTF16("MORTGAGE RATE DROPS")); 458 url_index_->HistoryItemsForTerms(ASCIIToUTF16("MORTGAGE RATE DROPS"));
405 ASSERT_EQ(1U, matches.size()); 459 ASSERT_EQ(1U, matches.size());
406 460
407 // Verify that we got back the result we expected. 461 // Verify that we got back the result we expected.
408 EXPECT_EQ(1, matches[0].url_info.id()); 462 EXPECT_EQ(1, matches[0].url_info.id());
409 EXPECT_EQ("http://www.reuters.com/article/idUSN0839880620100708", 463 EXPECT_EQ("http://www.reuters.com/article/idUSN0839880620100708",
410 matches[0].url_info.url().spec()); 464 matches[0].url_info.url().spec());
411 EXPECT_EQ(ASCIIToUTF16( 465 EXPECT_EQ(ASCIIToUTF16(
412 "UPDATE 1-US 30-yr mortgage rate drops to new record low | Reuters"), 466 "UPDATE 1-US 30-yr mortgage rate drops to new record low | Reuters"),
413 matches[0].url_info.title()); 467 matches[0].url_info.title());
414 } 468 }
415 469
416 TEST_F(InMemoryURLIndexTest, TitleChange) { 470 TEST_F(InMemoryURLIndexTest, TitleChange) {
417 url_index_.reset(new InMemoryURLIndex(FilePath()));
418 url_index_->Init(this, "en,ja,hi,zh");
419
420 // Verify current title terms retrieves desired item. 471 // Verify current title terms retrieves desired item.
421 string16 original_terms = 472 string16 original_terms =
422 ASCIIToUTF16("lebronomics could high taxes influence"); 473 ASCIIToUTF16("lebronomics could high taxes influence");
423 ScoredHistoryMatches matches = 474 ScoredHistoryMatches matches =
424 url_index_->HistoryItemsForTerms(original_terms); 475 url_index_->HistoryItemsForTerms(original_terms);
425 ASSERT_EQ(1U, matches.size()); 476 ASSERT_EQ(1U, matches.size());
426 477
427 // Verify that we got back the result we expected. 478 // Verify that we got back the result we expected.
428 const URLID expected_id = 3; 479 const URLID expected_id = 3;
429 EXPECT_EQ(expected_id, matches[0].url_info.id()); 480 EXPECT_EQ(expected_id, matches[0].url_info.id());
430 EXPECT_EQ("http://www.businessandmedia.org/articles/2010/20100708120415.aspx", 481 EXPECT_EQ("http://www.businessandmedia.org/articles/2010/20100708120415.aspx",
431 matches[0].url_info.url().spec()); 482 matches[0].url_info.url().spec());
432 EXPECT_EQ(ASCIIToUTF16( 483 EXPECT_EQ(ASCIIToUTF16(
433 "LeBronomics: Could High Taxes Influence James' Team Decision?"), 484 "LeBronomics: Could High Taxes Influence James' Team Decision?"),
434 matches[0].url_info.title()); 485 matches[0].url_info.title());
435 URLRow old_row(matches[0].url_info); 486 URLRow old_row(matches[0].url_info);
436 487
437 // Verify new title terms retrieves nothing. 488 // Verify new title terms retrieves nothing.
438 string16 new_terms = ASCIIToUTF16("does eat oats little lambs ivy"); 489 string16 new_terms = ASCIIToUTF16("does eat oats little lambs ivy");
439 matches = url_index_->HistoryItemsForTerms(new_terms); 490 matches = url_index_->HistoryItemsForTerms(new_terms);
440 ASSERT_EQ(0U, matches.size()); 491 ASSERT_EQ(0U, matches.size());
441 492
442 // Update the row. 493 // Update the row.
443 old_row.set_title(ASCIIToUTF16("Does eat oats and little lambs eat ivy")); 494 old_row.set_title(ASCIIToUTF16("Does eat oats and little lambs eat ivy"));
444 url_index_->UpdateURL(expected_id, old_row); 495 EXPECT_TRUE(UpdateURL(old_row));
445 496
446 // Verify we get the row using the new terms but not the original terms. 497 // Verify we get the row using the new terms but not the original terms.
447 matches = url_index_->HistoryItemsForTerms(new_terms); 498 matches = url_index_->HistoryItemsForTerms(new_terms);
448 ASSERT_EQ(1U, matches.size()); 499 ASSERT_EQ(1U, matches.size());
449 EXPECT_EQ(expected_id, matches[0].url_info.id()); 500 EXPECT_EQ(expected_id, matches[0].url_info.id());
450 matches = url_index_->HistoryItemsForTerms(original_terms); 501 matches = url_index_->HistoryItemsForTerms(original_terms);
451 ASSERT_EQ(0U, matches.size()); 502 ASSERT_EQ(0U, matches.size());
452 } 503 }
453 504
454 TEST_F(InMemoryURLIndexTest, NonUniqueTermCharacterSets) { 505 TEST_F(InMemoryURLIndexTest, NonUniqueTermCharacterSets) {
455 url_index_.reset(new InMemoryURLIndex(FilePath()));
456 url_index_->Init(this, "en,ja,hi,zh");
457
458 // The presence of duplicate characters should succeed. Exercise by cycling 506 // The presence of duplicate characters should succeed. Exercise by cycling
459 // through a string with several duplicate characters. 507 // through a string with several duplicate characters.
460 ScoredHistoryMatches matches = 508 ScoredHistoryMatches matches =
461 url_index_->HistoryItemsForTerms(ASCIIToUTF16("ABRA")); 509 url_index_->HistoryItemsForTerms(ASCIIToUTF16("ABRA"));
462 ASSERT_EQ(1U, matches.size()); 510 ASSERT_EQ(1U, matches.size());
463 EXPECT_EQ(28, matches[0].url_info.id()); 511 EXPECT_EQ(28, matches[0].url_info.id());
464 EXPECT_EQ("http://www.ddj.com/windows/184416623", 512 EXPECT_EQ("http://www.ddj.com/windows/184416623",
465 matches[0].url_info.url().spec()); 513 matches[0].url_info.url().spec());
466 514
467 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("ABRACAD")); 515 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("ABRACAD"));
(...skipping 13 matching lines...) Expand all
481 EXPECT_EQ(28, matches[0].url_info.id()); 529 EXPECT_EQ(28, matches[0].url_info.id());
482 } 530 }
483 531
484 TEST_F(InMemoryURLIndexTest, TypedCharacterCaching) { 532 TEST_F(InMemoryURLIndexTest, TypedCharacterCaching) {
485 // Verify that match results for previously typed characters are retained 533 // Verify that match results for previously typed characters are retained
486 // (in the term_char_word_set_cache_) and reused, if possible, in future 534 // (in the term_char_word_set_cache_) and reused, if possible, in future
487 // autocompletes. 535 // autocompletes.
488 typedef URLIndexPrivateData::SearchTermCacheMap::iterator CacheIter; 536 typedef URLIndexPrivateData::SearchTermCacheMap::iterator CacheIter;
489 typedef URLIndexPrivateData::SearchTermCacheItem CacheItem; 537 typedef URLIndexPrivateData::SearchTermCacheItem CacheItem;
490 538
491 url_index_.reset(new InMemoryURLIndex(FilePath()));
492 url_index_->Init(this, "en,ja,hi,zh");
493
494 URLIndexPrivateData::SearchTermCacheMap& cache( 539 URLIndexPrivateData::SearchTermCacheMap& cache(
495 url_index_->private_data_->search_term_cache_); 540 GetPrivateData()->search_term_cache_);
496 541
497 // The cache should be empty at this point. 542 // The cache should be empty at this point.
498 EXPECT_EQ(0U, cache.size()); 543 EXPECT_EQ(0U, cache.size());
499 544
500 // Now simulate typing search terms into the omnibox and check the state of 545 // Now simulate typing search terms into the omnibox and check the state of
501 // the cache as each item is 'typed'. 546 // the cache as each item is 'typed'.
502 547
503 // Simulate typing "r" giving "r" in the simulated omnibox. The results for 548 // Simulate typing "r" giving "r" in the simulated omnibox. The results for
504 // 'r' will be not cached because it is only 1 character long. 549 // 'r' will be not cached because it is only 1 character long.
505 url_index_->HistoryItemsForTerms(ASCIIToUTF16("r")); 550 url_index_->HistoryItemsForTerms(ASCIIToUTF16("r"));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 EXPECT_GT(scored_h.raw_score, scored_a.raw_score); 620 EXPECT_GT(scored_h.raw_score, scored_a.raw_score);
576 // Test scores based on a terms appearing multiple times. 621 // Test scores based on a terms appearing multiple times.
577 URLRow row_i(MakeURLRow("http://csi.csi.csi/csi_csi", 622 URLRow row_i(MakeURLRow("http://csi.csi.csi/csi_csi",
578 "CSI Guide to CSI Las Vegas, CSI New York, CSI Provo", 3, 30, 10)); 623 "CSI Guide to CSI Las Vegas, CSI New York, CSI Provo", 3, 30, 10));
579 ScoredHistoryMatch scored_i(URLIndexPrivateData::ScoredMatchForURL( 624 ScoredHistoryMatch scored_i(URLIndexPrivateData::ScoredMatchForURL(
580 row_i, ASCIIToUTF16("csi"), Make1Term("csi"))); 625 row_i, ASCIIToUTF16("csi"), Make1Term("csi")));
581 EXPECT_LT(scored_i.raw_score, 1400); 626 EXPECT_LT(scored_i.raw_score, 1400);
582 } 627 }
583 628
584 TEST_F(InMemoryURLIndexTest, AddNewRows) { 629 TEST_F(InMemoryURLIndexTest, AddNewRows) {
585 url_index_.reset(new InMemoryURLIndex(FilePath()));
586 url_index_->Init(this, "en,ja,hi,zh");
587
588 // Verify that the row we're going to add does not already exist. 630 // Verify that the row we're going to add does not already exist.
589 URLID new_row_id = 87654321; 631 URLID new_row_id = 87654321;
590 // Newly created URLRows get a last_visit time of 'right now' so it should 632 // Newly created URLRows get a last_visit time of 'right now' so it should
591 // qualify as a quick result candidate. 633 // qualify as a quick result candidate.
592 EXPECT_TRUE(url_index_->HistoryItemsForTerms( 634 EXPECT_TRUE(url_index_->HistoryItemsForTerms(
593 ASCIIToUTF16("brokeandalone")).empty()); 635 ASCIIToUTF16("brokeandalone")).empty());
594 636
595 // Add a new row. 637 // Add a new row.
596 URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), new_row_id); 638 URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), new_row_id++);
597 new_row.set_last_visit(base::Time::Now()); 639 new_row.set_last_visit(base::Time::Now());
598 url_index_->UpdateURL(new_row_id, new_row); 640 EXPECT_TRUE(UpdateURL(new_row));
599 641
600 // Verify that we can retrieve it. 642 // Verify that we can retrieve it.
601 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms( 643 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(
602 ASCIIToUTF16("brokeandalone")).size()); 644 ASCIIToUTF16("brokeandalone")).size());
603 645
604 // Add it again just to be sure that is harmless. 646 // Add it again just to be sure that is harmless and that it does not update
605 url_index_->UpdateURL(new_row_id, new_row); 647 // the index.
648 EXPECT_FALSE(UpdateURL(new_row));
606 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms( 649 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(
607 ASCIIToUTF16("brokeandalone")).size()); 650 ASCIIToUTF16("brokeandalone")).size());
651
652 // Make up an URL that does not qualify and try to add it.
653 URLRow unqualified_row(GURL("http://www.brokeandaloneinmanitoba.com/"),
654 new_row_id++);
655 EXPECT_FALSE(UpdateURL(new_row));
608 } 656 }
609 657
610 TEST_F(InMemoryURLIndexTest, DeleteRows) { 658 TEST_F(InMemoryURLIndexTest, DeleteRows) {
611 url_index_.reset(new InMemoryURLIndex(FilePath()));
612 url_index_->Init(this, "en,ja,hi,zh");
613
614 ScoredHistoryMatches matches = 659 ScoredHistoryMatches matches =
615 url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport")); 660 url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport"));
616 ASSERT_EQ(1U, matches.size()); 661 ASSERT_EQ(1U, matches.size());
617 662
618 // Determine the row id for that result, delete that id, then search again. 663 // Determine the row id for that result, delete that id, then search again.
619 url_index_->DeleteURL(matches[0].url_info.id()); 664 EXPECT_TRUE(DeleteURL(matches[0].url_info.url()));
620 EXPECT_TRUE(url_index_->HistoryItemsForTerms( 665 EXPECT_TRUE(url_index_->HistoryItemsForTerms(
621 ASCIIToUTF16("DrudgeReport")).empty()); 666 ASCIIToUTF16("DrudgeReport")).empty());
667
668 // Make up an URL that does not exist in the database and delete it.
669 GURL url("http://www.hokeypokey.com/putyourrightfootin.html");
670 EXPECT_FALSE(DeleteURL(url));
622 } 671 }
623 672
624 TEST_F(InMemoryURLIndexTest, WhitelistedURLs) { 673 TEST_F(InMemoryURLIndexTest, WhitelistedURLs) {
625 struct TestData { 674 struct TestData {
626 const std::string url_spec; 675 const std::string url_spec;
627 const bool expected_is_whitelisted; 676 const bool expected_is_whitelisted;
628 } data[] = { 677 } data[] = {
629 // URLs with whitelisted schemes. 678 // URLs with whitelisted schemes.
630 { "about:histograms", true }, 679 { "about:histograms", true },
631 { "chrome://settings", true }, 680 { "chrome://settings", true },
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 { "telnet://mayor_margie:one2rule4All@www.mycity.com:6789/", false }, 736 { "telnet://mayor_margie:one2rule4All@www.mycity.com:6789/", false },
688 { "tftp://example.com/mystartupfile", false }, 737 { "tftp://example.com/mystartupfile", false },
689 { "tip://123.123.123.123/?urn:xopen:xid", false }, 738 { "tip://123.123.123.123/?urn:xopen:xid", false },
690 { "tv:nbc.com", false }, 739 { "tv:nbc.com", false },
691 { "urn:foo:A123,456", false }, 740 { "urn:foo:A123,456", false },
692 { "vemmi://zeus.mctel.fr/demo", false }, 741 { "vemmi://zeus.mctel.fr/demo", false },
693 { "wais://www.mydomain.net:8765/mydatabase", false }, 742 { "wais://www.mydomain.net:8765/mydatabase", false },
694 { "xmpp:node@example.com", false }, 743 { "xmpp:node@example.com", false },
695 { "xmpp://guest@example.com", false }, 744 { "xmpp://guest@example.com", false },
696 }; 745 };
697 url_index_.reset(new InMemoryURLIndex(FilePath())); 746
698 URLIndexPrivateData& private_data(*(url_index_->private_data_.get())); 747 URLIndexPrivateData& private_data(*GetPrivateData());
699 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { 748 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
700 GURL url(data[i].url_spec); 749 GURL url(data[i].url_spec);
701 EXPECT_EQ(data[i].expected_is_whitelisted, 750 EXPECT_EQ(data[i].expected_is_whitelisted,
702 private_data.URLSchemeIsWhitelisted(url)); 751 private_data.URLSchemeIsWhitelisted(url));
703 } 752 }
704 } 753 }
705 754
706 TEST_F(InMemoryURLIndexTest, CacheFilePath) {
707 url_index_.reset(new InMemoryURLIndex(FilePath(FILE_PATH_LITERAL(
708 "/flammmy/frammy/"))));
709 FilePath full_file_path;
710 url_index_->GetCacheFilePath(&full_file_path);
711 std::vector<FilePath::StringType> expected_parts;
712 FilePath(FILE_PATH_LITERAL("/flammmy/frammy/History Provider Cache")).
713 GetComponents(&expected_parts);
714 std::vector<FilePath::StringType> actual_parts;
715 full_file_path.GetComponents(&actual_parts);
716 ASSERT_EQ(expected_parts.size(), actual_parts.size());
717 size_t count = expected_parts.size();
718 for (size_t i = 0; i < count; ++i)
719 EXPECT_EQ(expected_parts[i], actual_parts[i]);
720 // Must clear the history_dir_ to satisfy the dtor's DCHECK.
721 url_index_->history_dir_.clear();
722 }
723
724 TEST_F(InMemoryURLIndexTest, CacheSaveRestore) { 755 TEST_F(InMemoryURLIndexTest, CacheSaveRestore) {
725 // Save the cache to a protobuf, restore it, and compare the results. 756 // Save the cache to a protobuf, restore it, and compare the results.
726 url_index_.reset(new InMemoryURLIndex(FilePath()));
727 InMemoryURLIndex& url_index(*(url_index_.get()));
728 url_index.Init(this, "en,ja,hi,zh");
729 in_memory_url_index::InMemoryURLIndexCacheItem index_cache; 757 in_memory_url_index::InMemoryURLIndexCacheItem index_cache;
730 URLIndexPrivateData& private_data(*(url_index_->private_data_.get())); 758 URLIndexPrivateData& private_data(*GetPrivateData());
731 private_data.SavePrivateData(&index_cache); 759 private_data.SavePrivateData(&index_cache);
732 760
733 // Capture our private data so we can later compare for equality. 761 // Capture our private data so we can later compare for equality.
734 String16Vector word_list(private_data.word_list_); 762 String16Vector word_list(private_data.word_list_);
735 WordMap word_map(private_data.word_map_); 763 WordMap word_map(private_data.word_map_);
736 CharWordIDMap char_word_map(private_data.char_word_map_); 764 CharWordIDMap char_word_map(private_data.char_word_map_);
737 WordIDHistoryMap word_id_history_map(private_data.word_id_history_map_); 765 WordIDHistoryMap word_id_history_map(private_data.word_id_history_map_);
738 HistoryIDWordMap history_id_word_map(private_data.history_id_word_map_); 766 HistoryIDWordMap history_id_word_map(private_data.history_id_word_map_);
739 HistoryInfoMap history_info_map(private_data.history_info_map_); 767 HistoryInfoMap history_info_map(private_data.history_info_map_);
740 768
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 ASSERT_FALSE(private_data.history_info_map_.end() == actual); 818 ASSERT_FALSE(private_data.history_info_map_.end() == actual);
791 const URLRow& expected_row(expected->second); 819 const URLRow& expected_row(expected->second);
792 const URLRow& actual_row(actual->second); 820 const URLRow& actual_row(actual->second);
793 EXPECT_EQ(expected_row.visit_count(), actual_row.visit_count()); 821 EXPECT_EQ(expected_row.visit_count(), actual_row.visit_count());
794 EXPECT_EQ(expected_row.typed_count(), actual_row.typed_count()); 822 EXPECT_EQ(expected_row.typed_count(), actual_row.typed_count());
795 EXPECT_EQ(expected_row.last_visit(), actual_row.last_visit()); 823 EXPECT_EQ(expected_row.last_visit(), actual_row.last_visit());
796 EXPECT_EQ(expected_row.url(), actual_row.url()); 824 EXPECT_EQ(expected_row.url(), actual_row.url());
797 } 825 }
798 } 826 }
799 827
828 class InMemoryURLIndexCacheTest : public testing::Test {
829 public:
830 InMemoryURLIndexCacheTest() {}
831
832 protected:
833 virtual void SetUp() OVERRIDE;
834
835 ScopedTempDir temp_dir_;
836 scoped_ptr<InMemoryURLIndex> url_index_;
837 };
838
839 void InMemoryURLIndexCacheTest::SetUp() {
840 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
841 FilePath path(temp_dir_.path());
842 url_index_.reset(
843 new InMemoryURLIndex(NULL, path, "en,ja,hi,zh"));
844 }
845
846 TEST_F(InMemoryURLIndexCacheTest, CacheFilePath) {
847 FilePath expectedPath =
848 temp_dir_.path().Append(FILE_PATH_LITERAL("History Provider Cache"));
849 std::vector<FilePath::StringType> expected_parts;
850 expectedPath.GetComponents(&expected_parts);
851 FilePath full_file_path;
852 ASSERT_TRUE(url_index_->GetCacheFilePath(&full_file_path));
853 std::vector<FilePath::StringType> actual_parts;
854 full_file_path.GetComponents(&actual_parts);
855 ASSERT_EQ(expected_parts.size(), actual_parts.size());
856 size_t count = expected_parts.size();
857 for (size_t i = 0; i < count; ++i)
858 EXPECT_EQ(expected_parts[i], actual_parts[i]);
859 // Must clear the history_dir_ to satisfy the dtor's DCHECK.
860 url_index_->history_dir_.clear();
861 }
862
800 } // namespace history 863 } // namespace history
OLDNEW
« no previous file with comments | « chrome/browser/history/in_memory_url_index_types.h ('k') | chrome/browser/history/url_index_private_data.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698