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

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

Issue 8359019: Create Private Data for InMemoryURLIndex (in Preparation for SQLite Cache) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <stdio.h>
6
7 #include <fstream> 5 #include <fstream>
8 #include <string>
9 #include <vector>
10 6
11 #include "base/file_path.h" 7 #include "base/file_path.h"
12 #include "base/file_util.h" 8 #include "base/file_util.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "base/string16.h"
15 #include "base/string_util.h" 11 #include "base/string_util.h"
16 #include "base/time.h"
17 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
18 #include "chrome/browser/history/in_memory_database.h" 13 #include "chrome/browser/history/in_memory_database.h"
19 #include "chrome/browser/history/in_memory_url_index.h" 14 #include "chrome/browser/history/in_memory_url_index.h"
15 #include "chrome/browser/history/in_memory_url_index_types.h"
20 #include "chrome/common/chrome_paths.h" 16 #include "chrome/common/chrome_paths.h"
21 #include "sql/connection.h"
22 #include "sql/statement.h"
23 #include "sql/transaction.h" 17 #include "sql/transaction.h"
24 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
25 19
26 // The test version of the history url database table ('url') is contained in 20 // The test version of the history url database table ('url') is contained in
27 // a database file created from a text file('url_history_provider_test.db.txt'). 21 // a database file created from a text file('url_history_provider_test.db.txt').
28 // The only difference between this table and a live 'urls' table from a 22 // The only difference between this table and a live 'urls' table from a
29 // profile is that the last_visit_time column in the test table contains a 23 // profile is that the last_visit_time column in the test table contains a
30 // number specifying the number of days relative to 'today' to which the 24 // number specifying the number of days relative to 'today' to which the
31 // absolute time should be set during the test setup stage. 25 // absolute time should be set during the test setup stage.
32 // 26 //
(...skipping 19 matching lines...) Expand all
52 // Convenience function to create a URLRow with basic data for |url|, |title|, 46 // Convenience function to create a URLRow with basic data for |url|, |title|,
53 // |visit_count|, and |typed_count|. |last_visit_ago| gives the number of 47 // |visit_count|, and |typed_count|. |last_visit_ago| gives the number of
54 // days from now to set the URL's last_visit. 48 // days from now to set the URL's last_visit.
55 URLRow MakeURLRow(const char* url, 49 URLRow MakeURLRow(const char* url,
56 const char* title, 50 const char* title,
57 int visit_count, 51 int visit_count,
58 int last_visit_ago, 52 int last_visit_ago,
59 int typed_count); 53 int typed_count);
60 54
61 // Convenience functions for easily creating vectors of search terms. 55 // Convenience functions for easily creating vectors of search terms.
62 InMemoryURLIndex::String16Vector Make1Term(const char* term) const; 56 String16Vector Make1Term(const char* term) const;
63 InMemoryURLIndex::String16Vector Make2Terms(const char* term_1, 57 String16Vector Make2Terms(const char* term_1, const char* term_2) const;
64 const char* term_2) const;
65 58
66 // Validates that the given |term| is contained in |cache| and that it is 59 // Validates that the given |term| is contained in |cache| and that it is
67 // marked as in-use. 60 // marked as in-use.
68 void CheckTerm(const InMemoryURLIndex::SearchTermCacheMap& cache, 61 void CheckTerm(const InMemoryURLIndex::SearchTermCacheMap& cache,
69 string16 term) const; 62 string16 term) const;
70 63
71 scoped_ptr<InMemoryURLIndex> url_index_; 64 scoped_ptr<InMemoryURLIndex> url_index_;
72 }; 65 };
73 66
74 void InMemoryURLIndexTest::SetUp() { 67 void InMemoryURLIndexTest::SetUp() {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 int typed_count) { 131 int typed_count) {
139 URLRow row(GURL(url), 0); 132 URLRow row(GURL(url), 0);
140 row.set_title(UTF8ToUTF16(title)); 133 row.set_title(UTF8ToUTF16(title));
141 row.set_visit_count(visit_count); 134 row.set_visit_count(visit_count);
142 row.set_typed_count(typed_count); 135 row.set_typed_count(typed_count);
143 row.set_last_visit(base::Time::NowFromSystemTime() - 136 row.set_last_visit(base::Time::NowFromSystemTime() -
144 base::TimeDelta::FromDays(last_visit_ago)); 137 base::TimeDelta::FromDays(last_visit_ago));
145 return row; 138 return row;
146 } 139 }
147 140
148 InMemoryURLIndex::String16Vector InMemoryURLIndexTest::Make1Term( 141 String16Vector InMemoryURLIndexTest::Make1Term(const char* term) const {
149 const char* term) const { 142 String16Vector original_terms;
150 InMemoryURLIndex::String16Vector terms; 143 original_terms.push_back(UTF8ToUTF16(term));
151 terms.push_back(UTF8ToUTF16(term)); 144 return original_terms;
152 return terms;
153 } 145 }
154 146
155 InMemoryURLIndex::String16Vector InMemoryURLIndexTest::Make2Terms( 147 String16Vector InMemoryURLIndexTest::Make2Terms(const char* term_1,
156 const char* term_1, 148 const char* term_2) const {
157 const char* term_2) const { 149 String16Vector original_terms;
158 InMemoryURLIndex::String16Vector terms; 150 original_terms.push_back(UTF8ToUTF16(term_1));
159 terms.push_back(UTF8ToUTF16(term_1)); 151 original_terms.push_back(UTF8ToUTF16(term_2));
160 terms.push_back(UTF8ToUTF16(term_2)); 152 return original_terms;
161 return terms;
162 } 153 }
163 154
164 void InMemoryURLIndexTest::CheckTerm( 155 void InMemoryURLIndexTest::CheckTerm(
165 const InMemoryURLIndex::SearchTermCacheMap& cache, 156 const InMemoryURLIndex::SearchTermCacheMap& cache,
166 string16 term) const { 157 string16 term) const {
167 InMemoryURLIndex::SearchTermCacheMap::const_iterator cache_iter( 158 InMemoryURLIndex::SearchTermCacheMap::const_iterator cache_iter(
168 cache.find(term)); 159 cache.find(term));
169 ASSERT_NE(cache.end(), cache_iter) 160 ASSERT_NE(cache.end(), cache_iter)
170 << "Cache does not contain '" << term << "' but should."; 161 << "Cache does not contain '" << term << "' but should.";
171 InMemoryURLIndex::SearchTermCacheItem cache_item = cache_iter->second; 162 InMemoryURLIndex::SearchTermCacheItem cache_item = cache_iter->second;
172 EXPECT_TRUE(cache_item.used_) 163 EXPECT_TRUE(cache_item.used_)
173 << "Cache item '" << term << "' should be marked as being in use."; 164 << "Cache item '" << term << "' should be marked as being in use.";
174 } 165 }
175 166
167 // Helper function which compares two maps for equivalence. The maps' values
168 // are associative containers and their contents are compared as well.
169 template<typename T>
170 void ExpectMapOfContainersIdentical(const T& expected, const T& actual) {
171 ASSERT_EQ(expected.size(), actual.size());
172 for (typename T::const_iterator expected_iter = expected.begin();
173 expected_iter != expected.end(); ++expected_iter) {
174 typename T::const_iterator actual_iter = actual.find(expected_iter->first);
175 ASSERT_NE(actual.end(), actual_iter);
176 typename T::mapped_type const& expected_values(expected_iter->second);
177 typename T::mapped_type const& actual_values(actual_iter->second);
178 ASSERT_EQ(expected_values.size(), actual_values.size());
179 for (typename T::mapped_type::const_iterator set_iter =
180 expected_values.begin(); set_iter != expected_values.end(); ++set_iter)
181 EXPECT_EQ(actual_values.count(*set_iter),
182 expected_values.count(*set_iter));
183 }
184 }
185
186 //------------------------------------------------------------------------------
187
176 class LimitedInMemoryURLIndexTest : public InMemoryURLIndexTest { 188 class LimitedInMemoryURLIndexTest : public InMemoryURLIndexTest {
177 protected: 189 protected:
178 FilePath::StringType TestDBName() const; 190 FilePath::StringType TestDBName() const;
179 }; 191 };
180 192
181 FilePath::StringType LimitedInMemoryURLIndexTest::TestDBName() const { 193 FilePath::StringType LimitedInMemoryURLIndexTest::TestDBName() const {
182 return FILE_PATH_LITERAL("url_history_provider_test_limited.db.txt"); 194 return FILE_PATH_LITERAL("url_history_provider_test_limited.db.txt");
183 } 195 }
184 196
185 class ExpandedInMemoryURLIndexTest : public InMemoryURLIndexTest { 197 class ExpandedInMemoryURLIndexTest : public InMemoryURLIndexTest {
(...skipping 24 matching lines...) Expand all
210 TEST_F(LimitedInMemoryURLIndexTest, Initialization) { 222 TEST_F(LimitedInMemoryURLIndexTest, Initialization) {
211 // Verify that the database contains the expected number of items, which 223 // Verify that the database contains the expected number of items, which
212 // is the pre-filtered count, i.e. all of the items. 224 // is the pre-filtered count, i.e. all of the items.
213 sql::Statement statement(GetDB().GetUniqueStatement("SELECT * FROM urls;")); 225 sql::Statement statement(GetDB().GetUniqueStatement("SELECT * FROM urls;"));
214 EXPECT_TRUE(statement); 226 EXPECT_TRUE(statement);
215 uint64 row_count = 0; 227 uint64 row_count = 0;
216 while (statement.Step()) ++row_count; 228 while (statement.Step()) ++row_count;
217 EXPECT_EQ(1U, row_count); 229 EXPECT_EQ(1U, row_count);
218 url_index_.reset(new InMemoryURLIndex(FilePath())); 230 url_index_.reset(new InMemoryURLIndex(FilePath()));
219 url_index_->Init(this, "en,ja,hi,zh"); 231 url_index_->Init(this, "en,ja,hi,zh");
220 EXPECT_EQ(1, url_index_->history_item_count_); 232 URLIndexPrivateData& private_data(*(url_index_->private_data_));
221 233
222 // history_info_map_ should have the same number of items as were filtered. 234 // history_info_map_ should have the same number of items as were filtered.
223 EXPECT_EQ(1U, url_index_->history_info_map_.size()); 235 EXPECT_EQ(1U, private_data.history_info_map_.size());
224 EXPECT_EQ(35U, url_index_->char_word_map_.size()); 236 EXPECT_EQ(35U, private_data.char_word_map_.size());
225 EXPECT_EQ(17U, url_index_->word_map_.size()); 237 EXPECT_EQ(17U, private_data.word_map_.size());
226 } 238 }
227 239
228 TEST_F(InMemoryURLIndexTest, Retrieval) { 240 TEST_F(InMemoryURLIndexTest, Retrieval) {
229 url_index_.reset(new InMemoryURLIndex(FilePath())); 241 url_index_.reset(new InMemoryURLIndex(FilePath()));
230 url_index_->Init(this, "en,ja,hi,zh"); 242 url_index_->Init(this, "en,ja,hi,zh");
231 // The term will be lowercased by the search. 243 // The term will be lowercased by the search.
232 244
233 // See if a very specific term gives a single result. 245 // See if a very specific term gives a single result.
234 ScoredHistoryMatches matches = 246 ScoredHistoryMatches matches =
235 url_index_->HistoryItemsForTerms(Make1Term("DrudgeReport")); 247 url_index_->HistoryItemsForTerms(Make1Term("DrudgeReport"));
(...skipping 16 matching lines...) Expand all
252 ASSERT_EQ(1U, matches.size()); 264 ASSERT_EQ(1U, matches.size());
253 // The results should have a very high score. 265 // The results should have a very high score.
254 EXPECT_GT(matches[0].raw_score, 900); 266 EXPECT_GT(matches[0].raw_score, 900);
255 EXPECT_EQ(32, matches[0].url_info.id()); 267 EXPECT_EQ(32, matches[0].url_info.id());
256 EXPECT_EQ("https://nearlyperfectresult.com/", 268 EXPECT_EQ("https://nearlyperfectresult.com/",
257 matches[0].url_info.url().spec()); // Note: URL gets lowercased. 269 matches[0].url_info.url().spec()); // Note: URL gets lowercased.
258 EXPECT_EQ(ASCIIToUTF16("Practically Perfect Search Result"), 270 EXPECT_EQ(ASCIIToUTF16("Practically Perfect Search Result"),
259 matches[0].url_info.title()); 271 matches[0].url_info.title());
260 272
261 // Search which should result in very poor result. 273 // Search which should result in very poor result.
262 InMemoryURLIndex::String16Vector terms; 274 String16Vector original_terms;
263 terms.push_back(ASCIIToUTF16("z")); 275 original_terms.push_back(ASCIIToUTF16("z"));
264 terms.push_back(ASCIIToUTF16("y")); 276 original_terms.push_back(ASCIIToUTF16("y"));
265 terms.push_back(ASCIIToUTF16("x")); 277 original_terms.push_back(ASCIIToUTF16("x"));
266 matches = url_index_->HistoryItemsForTerms(terms); 278 matches = url_index_->HistoryItemsForTerms(original_terms);
267 ASSERT_EQ(1U, matches.size()); 279 ASSERT_EQ(1U, matches.size());
268 // The results should have a poor score. 280 // The results should have a poor score.
269 EXPECT_LT(matches[0].raw_score, 500); 281 EXPECT_LT(matches[0].raw_score, 500);
270 EXPECT_EQ(33, matches[0].url_info.id()); 282 EXPECT_EQ(33, matches[0].url_info.id());
271 EXPECT_EQ("http://quiteuselesssearchresultxyz.com/", 283 EXPECT_EQ("http://quiteuselesssearchresultxyz.com/",
272 matches[0].url_info.url().spec()); // Note: URL gets lowercased. 284 matches[0].url_info.url().spec()); // Note: URL gets lowercased.
273 EXPECT_EQ(ASCIIToUTF16("Practically Useless Search Result"), 285 EXPECT_EQ(ASCIIToUTF16("Practically Useless Search Result"),
274 matches[0].url_info.title()); 286 matches[0].url_info.title());
275 287
276 // Search which will match at the end of an URL with encoded characters. 288 // Search which will match at the end of an URL with encoded characters.
(...skipping 12 matching lines...) Expand all
289 301
290 // A search for 'working' should not short-circuit. 302 // A search for 'working' should not short-circuit.
291 matches = url_index_->HistoryItemsForTerms(Make1Term("working")); 303 matches = url_index_->HistoryItemsForTerms(Make1Term("working"));
292 EXPECT_EQ(1U, matches.size()); 304 EXPECT_EQ(1U, matches.size());
293 } 305 }
294 306
295 TEST_F(InMemoryURLIndexTest, TitleSearch) { 307 TEST_F(InMemoryURLIndexTest, TitleSearch) {
296 url_index_.reset(new InMemoryURLIndex(FilePath())); 308 url_index_.reset(new InMemoryURLIndex(FilePath()));
297 url_index_->Init(this, "en,ja,hi,zh"); 309 url_index_->Init(this, "en,ja,hi,zh");
298 // Signal if someone has changed the test DB. 310 // Signal if someone has changed the test DB.
299 EXPECT_EQ(27U, url_index_->history_info_map_.size()); 311 EXPECT_EQ(27U, url_index_->private_data_->history_info_map_.size());
300 InMemoryURLIndex::String16Vector terms; 312 String16Vector original_terms;
301 313
302 // Ensure title is being searched. 314 // Ensure title is being searched.
303 terms.push_back(ASCIIToUTF16("MORTGAGE")); 315 original_terms.push_back(ASCIIToUTF16("MORTGAGE"));
304 terms.push_back(ASCIIToUTF16("RATE")); 316 original_terms.push_back(ASCIIToUTF16("RATE"));
305 terms.push_back(ASCIIToUTF16("DROPS")); 317 original_terms.push_back(ASCIIToUTF16("DROPS"));
306 ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms(terms); 318 ScoredHistoryMatches matches =
319 url_index_->HistoryItemsForTerms(original_terms);
307 ASSERT_EQ(1U, matches.size()); 320 ASSERT_EQ(1U, matches.size());
308 321
309 // Verify that we got back the result we expected. 322 // Verify that we got back the result we expected.
310 EXPECT_EQ(1, matches[0].url_info.id()); 323 EXPECT_EQ(1, matches[0].url_info.id());
311 EXPECT_EQ("http://www.reuters.com/article/idUSN0839880620100708", 324 EXPECT_EQ("http://www.reuters.com/article/idUSN0839880620100708",
312 matches[0].url_info.url().spec()); 325 matches[0].url_info.url().spec());
313 EXPECT_EQ(ASCIIToUTF16( 326 EXPECT_EQ(ASCIIToUTF16(
314 "UPDATE 1-US 30-yr mortgage rate drops to new record low | Reuters"), 327 "UPDATE 1-US 30-yr mortgage rate drops to new record low | Reuters"),
315 matches[0].url_info.title()); 328 matches[0].url_info.title());
316 } 329 }
317 330
331 TEST_F(InMemoryURLIndexTest, TitleChange) {
332 url_index_.reset(new InMemoryURLIndex(FilePath()));
333 url_index_->Init(this, "en,ja,hi,zh");
334
335 // Verify current title terms retrieves desired item.
336 String16Vector original_terms;
337 original_terms.push_back(ASCIIToUTF16("lebronomics"));
338 original_terms.push_back(ASCIIToUTF16("could"));
339 original_terms.push_back(ASCIIToUTF16("high"));
340 original_terms.push_back(ASCIIToUTF16("taxes"));
341 original_terms.push_back(ASCIIToUTF16("influence"));
342 ScoredHistoryMatches matches =
343 url_index_->HistoryItemsForTerms(original_terms);
344 ASSERT_EQ(1U, matches.size());
345
346 // Verify that we got back the result we expected.
347 const URLID expected_id = 3;
348 EXPECT_EQ(expected_id, matches[0].url_info.id());
349 EXPECT_EQ("http://www.businessandmedia.org/articles/2010/20100708120415.aspx",
350 matches[0].url_info.url().spec());
351 EXPECT_EQ(ASCIIToUTF16(
352 "LeBronomics: Could High Taxes Influence James' Team Decision?"),
353 matches[0].url_info.title());
354 URLRow old_row(matches[0].url_info);
355
356 // Verify new title terms retrieves nothing.
357 String16Vector new_terms;
358 new_terms.push_back(ASCIIToUTF16("does"));
359 new_terms.push_back(ASCIIToUTF16("eat"));
360 new_terms.push_back(ASCIIToUTF16("oats"));
361 new_terms.push_back(ASCIIToUTF16("little"));
362 new_terms.push_back(ASCIIToUTF16("lambs"));
363 new_terms.push_back(ASCIIToUTF16("ivy"));
364 matches = url_index_->HistoryItemsForTerms(new_terms);
365 ASSERT_EQ(0U, matches.size());
366
367 // Update the row.
368 old_row.set_title(ASCIIToUTF16("Does eat oats and little lambs eat ivy"));
369 url_index_->UpdateURL(expected_id, old_row);
370
371 // Verify we get the row using the new terms but not the original terms.
372 matches = url_index_->HistoryItemsForTerms(new_terms);
373 ASSERT_EQ(1U, matches.size());
374 EXPECT_EQ(expected_id, matches[0].url_info.id());
375 matches = url_index_->HistoryItemsForTerms(original_terms);
376 ASSERT_EQ(0U, matches.size());
377 }
378
318 TEST_F(InMemoryURLIndexTest, NonUniqueTermCharacterSets) { 379 TEST_F(InMemoryURLIndexTest, NonUniqueTermCharacterSets) {
319 url_index_.reset(new InMemoryURLIndex(FilePath())); 380 url_index_.reset(new InMemoryURLIndex(FilePath()));
320 url_index_->Init(this, "en,ja,hi,zh"); 381 url_index_->Init(this, "en,ja,hi,zh");
321 382
322 // The presence of duplicate characters should succeed. Exercise by cycling 383 // The presence of duplicate characters should succeed. Exercise by cycling
323 // through a string with several duplicate characters. 384 // through a string with several duplicate characters.
324 ScoredHistoryMatches matches = 385 ScoredHistoryMatches matches =
325 url_index_->HistoryItemsForTerms(Make1Term("ABRA")); 386 url_index_->HistoryItemsForTerms(Make1Term("ABRA"));
326 ASSERT_EQ(1U, matches.size()); 387 ASSERT_EQ(1U, matches.size());
327 EXPECT_EQ(28, matches[0].url_info.id()); 388 EXPECT_EQ(28, matches[0].url_info.id());
(...skipping 10 matching lines...) Expand all
338 399
339 matches = url_index_->HistoryItemsForTerms(Make1Term("ABRACADABR")); 400 matches = url_index_->HistoryItemsForTerms(Make1Term("ABRACADABR"));
340 ASSERT_EQ(1U, matches.size()); 401 ASSERT_EQ(1U, matches.size());
341 EXPECT_EQ(28, matches[0].url_info.id()); 402 EXPECT_EQ(28, matches[0].url_info.id());
342 403
343 matches = url_index_->HistoryItemsForTerms(Make1Term("ABRACA")); 404 matches = url_index_->HistoryItemsForTerms(Make1Term("ABRACA"));
344 ASSERT_EQ(1U, matches.size()); 405 ASSERT_EQ(1U, matches.size());
345 EXPECT_EQ(28, matches[0].url_info.id()); 406 EXPECT_EQ(28, matches[0].url_info.id());
346 } 407 }
347 408
348 TEST_F(InMemoryURLIndexTest, StaticFunctions) {
349 // Test WordVectorFromString16
350 string16 string_a(ASCIIToUTF16("http://www.google.com/ frammy the brammy"));
351 InMemoryURLIndex::String16Vector string_vec =
352 InMemoryURLIndex::WordVectorFromString16(string_a, false);
353 ASSERT_EQ(7U, string_vec.size());
354 // See if we got the words we expected.
355 EXPECT_EQ(UTF8ToUTF16("http"), string_vec[0]);
356 EXPECT_EQ(UTF8ToUTF16("www"), string_vec[1]);
357 EXPECT_EQ(UTF8ToUTF16("google"), string_vec[2]);
358 EXPECT_EQ(UTF8ToUTF16("com"), string_vec[3]);
359 EXPECT_EQ(UTF8ToUTF16("frammy"), string_vec[4]);
360 EXPECT_EQ(UTF8ToUTF16("the"), string_vec[5]);
361 EXPECT_EQ(UTF8ToUTF16("brammy"), string_vec[6]);
362
363 string_vec = InMemoryURLIndex::WordVectorFromString16(string_a, true);
364 ASSERT_EQ(5U, string_vec.size());
365 EXPECT_EQ(UTF8ToUTF16("http://"), string_vec[0]);
366 EXPECT_EQ(UTF8ToUTF16("www.google.com/"), string_vec[1]);
367 EXPECT_EQ(UTF8ToUTF16("frammy"), string_vec[2]);
368 EXPECT_EQ(UTF8ToUTF16("the"), string_vec[3]);
369 EXPECT_EQ(UTF8ToUTF16("brammy"), string_vec[4]);
370
371 // Test WordSetFromString16
372 string16 string_b(ASCIIToUTF16(
373 "http://web.google.com/search Google Web Search"));
374 InMemoryURLIndex::String16Set string_set =
375 InMemoryURLIndex::WordSetFromString16(string_b);
376 EXPECT_EQ(5U, string_set.size());
377 // See if we got the words we expected.
378 EXPECT_TRUE(string_set.find(UTF8ToUTF16("com")) != string_set.end());
379 EXPECT_TRUE(string_set.find(UTF8ToUTF16("google")) != string_set.end());
380 EXPECT_TRUE(string_set.find(UTF8ToUTF16("http")) != string_set.end());
381 EXPECT_TRUE(string_set.find(UTF8ToUTF16("search")) != string_set.end());
382 EXPECT_TRUE(string_set.find(UTF8ToUTF16("web")) != string_set.end());
383
384 // Test SortAndDeoverlap
385 TermMatches matches_a;
386 matches_a.push_back(TermMatch(1, 13, 10));
387 matches_a.push_back(TermMatch(2, 23, 10));
388 matches_a.push_back(TermMatch(3, 3, 10));
389 matches_a.push_back(TermMatch(4, 40, 5));
390 TermMatches matches_b = InMemoryURLIndex::SortAndDeoverlap(matches_a);
391 // Nothing should have been eliminated.
392 EXPECT_EQ(matches_a.size(), matches_b.size());
393 // The order should now be 3, 1, 2, 4.
394 EXPECT_EQ(3, matches_b[0].term_num);
395 EXPECT_EQ(1, matches_b[1].term_num);
396 EXPECT_EQ(2, matches_b[2].term_num);
397 EXPECT_EQ(4, matches_b[3].term_num);
398 matches_a.push_back(TermMatch(5, 18, 10));
399 matches_a.push_back(TermMatch(6, 38, 5));
400 matches_b = InMemoryURLIndex::SortAndDeoverlap(matches_a);
401 // Two matches should have been eliminated.
402 EXPECT_EQ(matches_a.size() - 2, matches_b.size());
403 // The order should now be 3, 1, 2, 6.
404 EXPECT_EQ(3, matches_b[0].term_num);
405 EXPECT_EQ(1, matches_b[1].term_num);
406 EXPECT_EQ(2, matches_b[2].term_num);
407 EXPECT_EQ(6, matches_b[3].term_num);
408
409 // Test MatchTermInString
410 TermMatches matches_c = InMemoryURLIndex::MatchTermInString(
411 UTF8ToUTF16("x"), UTF8ToUTF16("axbxcxdxex fxgx/hxixjx.kx"), 123);
412 ASSERT_EQ(11U, matches_c.size());
413 const size_t expected_offsets[] = { 1, 3, 5, 7, 9, 12, 14, 17, 19, 21, 24 };
414 for (int i = 0; i < 11; ++i)
415 EXPECT_EQ(expected_offsets[i], matches_c[i].offset);
416 }
417
418 TEST_F(InMemoryURLIndexTest, OffsetsAndTermMatches) {
419 // Test OffsetsFromTermMatches
420 history::TermMatches matches_a;
421 matches_a.push_back(history::TermMatch(1, 1, 2));
422 matches_a.push_back(history::TermMatch(2, 4, 3));
423 matches_a.push_back(history::TermMatch(3, 9, 1));
424 matches_a.push_back(history::TermMatch(3, 10, 1));
425 matches_a.push_back(history::TermMatch(4, 14, 5));
426 std::vector<size_t> offsets =
427 InMemoryURLIndex::OffsetsFromTermMatches(matches_a);
428 const size_t expected_offsets_a[] = {1, 4, 9, 10, 14};
429 ASSERT_EQ(offsets.size(), arraysize(expected_offsets_a));
430 for (size_t i = 0; i < offsets.size(); ++i)
431 EXPECT_EQ(expected_offsets_a[i], offsets[i]);
432
433 // Test ReplaceOffsetsInTermMatches
434 offsets[2] = string16::npos;
435 history::TermMatches matches_b =
436 InMemoryURLIndex::ReplaceOffsetsInTermMatches(matches_a, offsets);
437 const size_t expected_offsets_b[] = {1, 4, 10, 14};
438 ASSERT_EQ(arraysize(expected_offsets_b), matches_b.size());
439 for (size_t i = 0; i < matches_b.size(); ++i)
440 EXPECT_EQ(expected_offsets_b[i], matches_b[i].offset);
441 }
442
443 TEST_F(InMemoryURLIndexTest, TypedCharacterCaching) { 409 TEST_F(InMemoryURLIndexTest, TypedCharacterCaching) {
444 // Verify that match results for previously typed characters are retained 410 // Verify that match results for previously typed characters are retained
445 // (in the term_char_word_set_cache_) and reused, if possible, in future 411 // (in the term_char_word_set_cache_) and reused, if possible, in future
446 // autocompletes. 412 // autocompletes.
447 typedef InMemoryURLIndex::SearchTermCacheMap::iterator CacheIter; 413 typedef InMemoryURLIndex::SearchTermCacheMap::iterator CacheIter;
448 typedef InMemoryURLIndex::SearchTermCacheItem CacheItem; 414 typedef InMemoryURLIndex::SearchTermCacheItem CacheItem;
449 415
450 url_index_.reset(new InMemoryURLIndex(FilePath())); 416 url_index_.reset(new InMemoryURLIndex(FilePath()));
451 url_index_->Init(this, "en,ja,hi,zh"); 417 url_index_->Init(this, "en,ja,hi,zh");
452 418
453 InMemoryURLIndex::SearchTermCacheMap& cache(url_index_->search_term_cache_); 419 InMemoryURLIndex::SearchTermCacheMap& cache(url_index_->search_term_cache_);
454 420
455 // The cache should be empty at this point. 421 // The cache should be empty at this point.
456 EXPECT_EQ(0U, cache.size()); 422 EXPECT_EQ(0U, cache.size());
457 423
458 // Now simulate typing search terms into the omnibox and check the state of 424 // Now simulate typing search terms into the omnibox and check the state of
459 // the cache as each item is 'typed'. 425 // the cache as each item is 'typed'.
460 426
461 // Simulate typing "r" giving "r" in the simulated omnibox. The results for 427 // Simulate typing "r" giving "r" in the simulated omnibox. The results for
462 // 'r' will be not cached because it is only 1 character long. 428 // 'r' will be not cached because it is only 1 character long.
463 InMemoryURLIndex::String16Vector terms; 429 String16Vector original_terms;
464 string16 term_r = ASCIIToUTF16("r"); 430 string16 term_r = ASCIIToUTF16("r");
465 terms.push_back(term_r); 431 original_terms.push_back(term_r);
466 url_index_->HistoryItemsForTerms(terms); 432 url_index_->HistoryItemsForTerms(original_terms);
467 EXPECT_EQ(0U, cache.size()); 433 EXPECT_EQ(0U, cache.size());
468 434
469 // Simulate typing "re" giving "r re" in the simulated omnibox. 435 // Simulate typing "re" giving "r re" in the simulated omnibox.
470 string16 term_re = ASCIIToUTF16("re"); 436 string16 term_re = ASCIIToUTF16("re");
471 terms.push_back(term_re); 437 original_terms.push_back(term_re);
472 // 're' should be cached at this point but not 'r' as it is a single 438 // 're' should be cached at this point but not 'r' as it is a single
473 // character. 439 // character.
474 ASSERT_EQ(2U, terms.size()); 440 ASSERT_EQ(2U, original_terms.size());
475 url_index_->HistoryItemsForTerms(terms); 441 url_index_->HistoryItemsForTerms(original_terms);
476 ASSERT_EQ(1U, cache.size()); 442 ASSERT_EQ(1U, cache.size());
477 CheckTerm(cache, term_re); 443 CheckTerm(cache, term_re);
478 444
479 // Simulate typing "reco" giving "r re reco" in the simulated omnibox. 445 // Simulate typing "reco" giving "r re reco" in the simulated omnibox.
480 string16 term_reco = ASCIIToUTF16("reco"); 446 string16 term_reco = ASCIIToUTF16("reco");
481 terms.push_back(term_reco); 447 original_terms.push_back(term_reco);
482 // 're' and 'reco' should be cached at this point but not 'r' as it is a 448 // 're' and 'reco' should be cached at this point but not 'r' as it is a
483 // single character. 449 // single character.
484 url_index_->HistoryItemsForTerms(terms); 450 url_index_->HistoryItemsForTerms(original_terms);
485 ASSERT_EQ(2U, cache.size()); 451 ASSERT_EQ(2U, cache.size());
486 CheckTerm(cache, term_re); 452 CheckTerm(cache, term_re);
487 CheckTerm(cache, term_reco); 453 CheckTerm(cache, term_reco);
488 454
489 terms.clear(); // Simulate pressing <ESC>. 455 original_terms.clear(); // Simulate pressing <ESC>.
490 456
491 // Simulate typing "mort". 457 // Simulate typing "mort".
492 string16 term_mort = ASCIIToUTF16("mort"); 458 string16 term_mort = ASCIIToUTF16("mort");
493 terms.push_back(term_mort); 459 original_terms.push_back(term_mort);
494 // Since we now have only one search term, the cached results for 're' and 460 // Since we now have only one search term, the cached results for 're' and
495 // 'reco' should be purged, giving us only 1 item in the cache (for 'mort'). 461 // 'reco' should be purged, giving us only 1 item in the cache (for 'mort').
496 url_index_->HistoryItemsForTerms(terms); 462 url_index_->HistoryItemsForTerms(original_terms);
497 ASSERT_EQ(1U, cache.size()); 463 ASSERT_EQ(1U, cache.size());
498 CheckTerm(cache, term_mort); 464 CheckTerm(cache, term_mort);
499 465
500 // Simulate typing "reco" giving "mort reco" in the simulated omnibox. 466 // Simulate typing "reco" giving "mort reco" in the simulated omnibox.
501 terms.push_back(term_reco); 467 original_terms.push_back(term_reco);
502 url_index_->HistoryItemsForTerms(terms); 468 url_index_->HistoryItemsForTerms(original_terms);
503 ASSERT_EQ(2U, cache.size()); 469 ASSERT_EQ(2U, cache.size());
504 CheckTerm(cache, term_mort); 470 CheckTerm(cache, term_mort);
505 CheckTerm(cache, term_reco); 471 CheckTerm(cache, term_reco);
506 472
507 // Simulate a <DELETE> by removing the 'reco' and adding back the 'rec'. 473 // Simulate a <DELETE> by removing the 'reco' and adding back the 'rec'.
508 terms.resize(terms.size() - 1); 474 original_terms.resize(original_terms.size() - 1);
509 string16 term_rec = ASCIIToUTF16("rec"); 475 string16 term_rec = ASCIIToUTF16("rec");
510 terms.push_back(term_rec); 476 original_terms.push_back(term_rec);
511 url_index_->HistoryItemsForTerms(terms); 477 url_index_->HistoryItemsForTerms(original_terms);
512 ASSERT_EQ(2U, cache.size()); 478 ASSERT_EQ(2U, cache.size());
513 CheckTerm(cache, term_mort); 479 CheckTerm(cache, term_mort);
514 CheckTerm(cache, term_rec); 480 CheckTerm(cache, term_rec);
515 } 481 }
516 482
517 TEST_F(InMemoryURLIndexTest, Scoring) { 483 TEST_F(InMemoryURLIndexTest, Scoring) {
518 URLRow row_a(MakeURLRow("http://abcdef", "fedcba", 3, 30, 1)); 484 URLRow row_a(MakeURLRow("http://abcdef", "fedcba", 3, 30, 1));
519 // Test scores based on position. 485 // Test scores based on position.
520 ScoredHistoryMatch scored_a( 486 ScoredHistoryMatch scored_a(
521 InMemoryURLIndex::ScoredMatchForURL(row_a, Make1Term("abc"))); 487 InMemoryURLIndex::ScoredMatchForURL(row_a, Make1Term("abc")));
(...skipping 23 matching lines...) Expand all
545 // Test scores based on typed_count. 511 // Test scores based on typed_count.
546 URLRow row_d(MakeURLRow("http://abcdef", "fedcba", 3, 30, 10)); 512 URLRow row_d(MakeURLRow("http://abcdef", "fedcba", 3, 30, 10));
547 ScoredHistoryMatch scored_h( 513 ScoredHistoryMatch scored_h(
548 InMemoryURLIndex::ScoredMatchForURL(row_d, Make1Term("abc"))); 514 InMemoryURLIndex::ScoredMatchForURL(row_d, Make1Term("abc")));
549 EXPECT_GT(scored_h.raw_score, scored_a.raw_score); 515 EXPECT_GT(scored_h.raw_score, scored_a.raw_score);
550 } 516 }
551 517
552 TEST_F(InMemoryURLIndexTest, AddNewRows) { 518 TEST_F(InMemoryURLIndexTest, AddNewRows) {
553 url_index_.reset(new InMemoryURLIndex(FilePath())); 519 url_index_.reset(new InMemoryURLIndex(FilePath()));
554 url_index_->Init(this, "en,ja,hi,zh"); 520 url_index_->Init(this, "en,ja,hi,zh");
555 InMemoryURLIndex::String16Vector terms; 521 String16Vector original_terms;
556 522
557 // Verify that the row we're going to add does not already exist. 523 // Verify that the row we're going to add does not already exist.
558 URLID new_row_id = 87654321; 524 URLID new_row_id = 87654321;
559 // Newly created URLRows get a last_visit time of 'right now' so it should 525 // Newly created URLRows get a last_visit time of 'right now' so it should
560 // qualify as a quick result candidate. 526 // qualify as a quick result candidate.
561 terms.push_back(ASCIIToUTF16("brokeandalone")); 527 original_terms.push_back(ASCIIToUTF16("brokeandalone"));
562 EXPECT_TRUE(url_index_->HistoryItemsForTerms(terms).empty()); 528 EXPECT_TRUE(url_index_->HistoryItemsForTerms(original_terms).empty());
563 529
564 // Add a new row. 530 // Add a new row.
565 URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), new_row_id); 531 URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), new_row_id);
566 new_row.set_last_visit(base::Time::Now()); 532 new_row.set_last_visit(base::Time::Now());
567 url_index_->UpdateURL(new_row_id, new_row); 533 url_index_->UpdateURL(new_row_id, new_row);
568 534
569 // Verify that we can retrieve it. 535 // Verify that we can retrieve it.
570 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(terms).size()); 536 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(original_terms).size());
571 537
572 // Add it again just to be sure that is harmless. 538 // Add it again just to be sure that is harmless.
573 url_index_->UpdateURL(new_row_id, new_row); 539 url_index_->UpdateURL(new_row_id, new_row);
574 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(terms).size()); 540 EXPECT_EQ(1U, url_index_->HistoryItemsForTerms(original_terms).size());
575 } 541 }
576 542
577 TEST_F(InMemoryURLIndexTest, DeleteRows) { 543 TEST_F(InMemoryURLIndexTest, DeleteRows) {
578 url_index_.reset(new InMemoryURLIndex(FilePath())); 544 url_index_.reset(new InMemoryURLIndex(FilePath()));
579 url_index_->Init(this, "en,ja,hi,zh"); 545 url_index_->Init(this, "en,ja,hi,zh");
580 InMemoryURLIndex::String16Vector terms; 546 String16Vector original_terms;
581 547
582 // Make sure we actually get an existing result. 548 // Make sure we actually get an existing result.
583 terms.push_back(ASCIIToUTF16("DrudgeReport")); 549 original_terms.push_back(ASCIIToUTF16("DrudgeReport"));
584 ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms(terms); 550 ScoredHistoryMatches matches =
551 url_index_->HistoryItemsForTerms(original_terms);
585 ASSERT_EQ(1U, matches.size()); 552 ASSERT_EQ(1U, matches.size());
586 553
587 // Determine the row id for that result, delete that id, then search again. 554 // Determine the row id for that result, delete that id, then search again.
588 url_index_->DeleteURL(matches[0].url_info.id()); 555 url_index_->DeleteURL(matches[0].url_info.id());
589 EXPECT_TRUE(url_index_->HistoryItemsForTerms(terms).empty()); 556 EXPECT_TRUE(url_index_->HistoryItemsForTerms(original_terms).empty());
590 } 557 }
591 558
592 TEST_F(InMemoryURLIndexTest, WhitelistedURLs) { 559 TEST_F(InMemoryURLIndexTest, WhitelistedURLs) {
593 struct TestData { 560 struct TestData {
594 const std::string url_spec; 561 const std::string url_spec;
595 const bool expected_is_whitelisted; 562 const bool expected_is_whitelisted;
596 } data[] = { 563 } data[] = {
597 // URLs with whitelisted schemes. 564 // URLs with whitelisted schemes.
598 { "about:histograms", true }, 565 { "about:histograms", true },
599 { "chrome://settings", true }, 566 { "chrome://settings", true },
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 657
691 TEST_F(InMemoryURLIndexTest, CacheSaveRestore) { 658 TEST_F(InMemoryURLIndexTest, CacheSaveRestore) {
692 // Save the cache to a protobuf, restore it, and compare the results. 659 // Save the cache to a protobuf, restore it, and compare the results.
693 url_index_.reset(new InMemoryURLIndex(FilePath())); 660 url_index_.reset(new InMemoryURLIndex(FilePath()));
694 InMemoryURLIndex& url_index(*(url_index_.get())); 661 InMemoryURLIndex& url_index(*(url_index_.get()));
695 url_index.Init(this, "en,ja,hi,zh"); 662 url_index.Init(this, "en,ja,hi,zh");
696 in_memory_url_index::InMemoryURLIndexCacheItem index_cache; 663 in_memory_url_index::InMemoryURLIndexCacheItem index_cache;
697 url_index.SavePrivateData(&index_cache); 664 url_index.SavePrivateData(&index_cache);
698 665
699 // Capture our private data so we can later compare for equality. 666 // Capture our private data so we can later compare for equality.
700 int history_item_count(url_index.history_item_count_); 667 URLIndexPrivateData& private_data(*(url_index_->private_data_));
701 InMemoryURLIndex::String16Vector word_list(url_index.word_list_); 668 String16Vector word_list(private_data.word_list_);
702 InMemoryURLIndex::WordMap word_map(url_index.word_map_); 669 WordMap word_map(private_data.word_map_);
703 InMemoryURLIndex::CharWordIDMap char_word_map(url_index.char_word_map_); 670 CharWordIDMap char_word_map(private_data.char_word_map_);
704 InMemoryURLIndex::WordIDHistoryMap word_id_history_map( 671 WordIDHistoryMap word_id_history_map(private_data.word_id_history_map_);
705 url_index.word_id_history_map_); 672 HistoryIDWordMap history_id_word_map(private_data.history_id_word_map_);
706 InMemoryURLIndex::HistoryInfoMap history_info_map( 673 HistoryInfoMap history_info_map(private_data.history_info_map_);
707 url_index.history_info_map_);
708 674
709 // Prove that there is really something there. 675 // Prove that there is really something there.
710 EXPECT_GT(url_index.history_item_count_, 0); 676 EXPECT_FALSE(private_data.word_list_.empty());
711 EXPECT_FALSE(url_index.word_list_.empty()); 677 // available_words_ will already be empty since we have freshly built the
712 EXPECT_FALSE(url_index.word_map_.empty()); 678 // data set for this test.
713 EXPECT_FALSE(url_index.char_word_map_.empty()); 679 EXPECT_TRUE(private_data.available_words_.empty());
714 EXPECT_FALSE(url_index.word_id_history_map_.empty()); 680 EXPECT_FALSE(private_data.word_map_.empty());
715 EXPECT_FALSE(url_index.history_info_map_.empty()); 681 EXPECT_FALSE(private_data.char_word_map_.empty());
682 EXPECT_FALSE(private_data.word_id_history_map_.empty());
683 EXPECT_FALSE(private_data.history_id_word_map_.empty());
684 EXPECT_FALSE(private_data.history_info_map_.empty());
716 685
717 // Clear and then prove it's clear. 686 // Clear and then prove it's clear.
718 url_index.ClearPrivateData(); 687 url_index.ClearPrivateData();
719 EXPECT_EQ(0, url_index.history_item_count_); 688 EXPECT_TRUE(private_data.word_list_.empty());
720 EXPECT_TRUE(url_index.word_list_.empty()); 689 EXPECT_TRUE(private_data.available_words_.empty());
721 EXPECT_TRUE(url_index.word_map_.empty()); 690 EXPECT_TRUE(private_data.word_map_.empty());
722 EXPECT_TRUE(url_index.char_word_map_.empty()); 691 EXPECT_TRUE(private_data.char_word_map_.empty());
723 EXPECT_TRUE(url_index.word_id_history_map_.empty()); 692 EXPECT_TRUE(private_data.word_id_history_map_.empty());
724 EXPECT_TRUE(url_index.history_info_map_.empty()); 693 EXPECT_TRUE(private_data.history_id_word_map_.empty());
694 EXPECT_TRUE(private_data.history_info_map_.empty());
725 695
726 // Restore the cache. 696 // Restore the cache.
727 EXPECT_TRUE(url_index.RestorePrivateData(index_cache)); 697 EXPECT_TRUE(url_index.RestorePrivateData(index_cache));
728 698
729 // Compare the restored and captured for equality. 699 // Compare the restored and captured for equality.
730 EXPECT_EQ(history_item_count, url_index.history_item_count_); 700 EXPECT_EQ(word_list.size(), private_data.word_list_.size());
731 EXPECT_EQ(word_list.size(), url_index.word_list_.size()); 701 EXPECT_EQ(word_map.size(), private_data.word_map_.size());
732 EXPECT_EQ(word_map.size(), url_index.word_map_.size()); 702 EXPECT_EQ(char_word_map.size(), private_data.char_word_map_.size());
733 EXPECT_EQ(char_word_map.size(), url_index.char_word_map_.size()); 703 EXPECT_EQ(word_id_history_map.size(),
734 EXPECT_EQ(word_id_history_map.size(), url_index.word_id_history_map_.size()); 704 private_data.word_id_history_map_.size());
735 EXPECT_EQ(history_info_map.size(), url_index.history_info_map_.size()); 705 EXPECT_EQ(history_id_word_map.size(),
706 private_data.history_id_word_map_.size());
707 EXPECT_EQ(history_info_map.size(), private_data.history_info_map_.size());
736 // WordList must be index-by-index equal. 708 // WordList must be index-by-index equal.
737 size_t count = word_list.size(); 709 size_t count = word_list.size();
738 for (size_t i = 0; i < count; ++i) 710 for (size_t i = 0; i < count; ++i)
739 EXPECT_EQ(word_list[i], url_index.word_list_[i]); 711 EXPECT_EQ(word_list[i], private_data.word_list_[i]);
740 for (InMemoryURLIndex::CharWordIDMap::const_iterator expected = 712
741 char_word_map.begin(); expected != char_word_map.end(); ++expected) { 713 ExpectMapOfContainersIdentical(char_word_map,
742 InMemoryURLIndex::CharWordIDMap::const_iterator actual = 714 private_data.char_word_map_);
743 url_index.char_word_map_.find(expected->first); 715 ExpectMapOfContainersIdentical(word_id_history_map,
744 ASSERT_TRUE(url_index.char_word_map_.end() != actual); 716 private_data.word_id_history_map_);
745 const InMemoryURLIndex::WordIDSet& expected_set(expected->second); 717 ExpectMapOfContainersIdentical(history_id_word_map,
746 const InMemoryURLIndex::WordIDSet& actual_set(actual->second); 718 private_data.history_id_word_map_);
747 ASSERT_EQ(expected_set.size(), actual_set.size()); 719
748 for (InMemoryURLIndex::WordIDSet::const_iterator set_iter = 720 for (HistoryInfoMap::const_iterator expected = history_info_map.begin();
749 expected_set.begin(); set_iter != expected_set.end(); ++set_iter) 721 expected != history_info_map.end(); ++expected) {
750 EXPECT_GT(actual_set.count(*set_iter), 0U); 722 HistoryInfoMap::const_iterator actual =
751 } 723 private_data.history_info_map_.find(expected->first);
752 for (InMemoryURLIndex::WordIDHistoryMap::const_iterator expected = 724 ASSERT_FALSE(private_data.history_info_map_.end() == actual);
753 word_id_history_map.begin(); expected != word_id_history_map.end();
754 ++expected) {
755 InMemoryURLIndex::WordIDHistoryMap::const_iterator actual =
756 url_index.word_id_history_map_.find(expected->first);
757 ASSERT_TRUE(url_index.word_id_history_map_.end() != actual);
758 const InMemoryURLIndex::HistoryIDSet& expected_set(expected->second);
759 const InMemoryURLIndex::HistoryIDSet& actual_set(actual->second);
760 ASSERT_EQ(expected_set.size(), actual_set.size());
761 for (InMemoryURLIndex::HistoryIDSet::const_iterator set_iter =
762 expected_set.begin(); set_iter != expected_set.end(); ++set_iter)
763 EXPECT_GT(actual_set.count(*set_iter), 0U);
764 }
765 for (InMemoryURLIndex::HistoryInfoMap::const_iterator expected =
766 history_info_map.begin(); expected != history_info_map.end();
767 ++expected) {
768 InMemoryURLIndex::HistoryInfoMap::const_iterator actual =
769 url_index.history_info_map_.find(expected->first);
770 ASSERT_FALSE(url_index.history_info_map_.end() == actual);
771 const URLRow& expected_row(expected->second); 725 const URLRow& expected_row(expected->second);
772 const URLRow& actual_row(actual->second); 726 const URLRow& actual_row(actual->second);
773 EXPECT_EQ(expected_row.visit_count(), actual_row.visit_count()); 727 EXPECT_EQ(expected_row.visit_count(), actual_row.visit_count());
774 EXPECT_EQ(expected_row.typed_count(), actual_row.typed_count()); 728 EXPECT_EQ(expected_row.typed_count(), actual_row.typed_count());
775 EXPECT_EQ(expected_row.last_visit(), actual_row.last_visit()); 729 EXPECT_EQ(expected_row.last_visit(), actual_row.last_visit());
776 EXPECT_EQ(expected_row.url(), actual_row.url()); 730 EXPECT_EQ(expected_row.url(), actual_row.url());
777 } 731 }
778 } 732 }
779 733
780 } // namespace history 734 } // namespace history
OLDNEW
« no previous file with comments | « chrome/browser/history/in_memory_url_index_types_unittest.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698