Index: components/omnibox/browser/in_memory_url_index_unittest.cc |
diff --git a/components/omnibox/browser/in_memory_url_index_unittest.cc b/components/omnibox/browser/in_memory_url_index_unittest.cc |
index 54119eedb1e94a428f0c11df6d0ff0e3a618f009..57751d876e357a104c8d836b3aeeccc2ace1845f 100644 |
--- a/components/omnibox/browser/in_memory_url_index_unittest.cc |
+++ b/components/omnibox/browser/in_memory_url_index_unittest.cc |
@@ -710,6 +710,108 @@ TEST_F(InMemoryURLIndexTest, ProperStringMatching) { |
EXPECT_EQ(1U, matches.size()); |
} |
+TEST_F(InMemoryURLIndexTest, TrimHistoryIds) { |
+ // Constants --------------------------------------------------------------- |
+ |
+ constexpr size_t kItemsToScoreLimit = 500; |
+ constexpr size_t kAlmostLimit = kItemsToScoreLimit - 5; |
+ |
+ constexpr int kLowTypedCount = 2; |
+ constexpr int kHighTypedCount = 100; |
+ |
+ constexpr int kLowVisitCount = 20; |
+ constexpr int kHighVisitCount = 200; |
+ |
+ constexpr base::TimeDelta kOld = base::TimeDelta::FromDays(15); |
+ constexpr base::TimeDelta kNew = base::TimeDelta::FromDays(2); |
+ |
+ constexpr int kMinRowId = 5000; |
+ |
+ // Helpers ----------------------------------------------------------------- |
+ |
+ struct ItemGroup { |
+ history::URLID min_id; |
+ history::URLID max_id; |
+ int typed_count; |
+ int visit_count; |
+ base::TimeDelta days_ago; |
+ }; |
+ |
+ auto GetHistoryIdsUpTo = [&](HistoryID max) { |
dyaroshev
2017/02/24 11:20:43
Visual studio does not implicitly capture constexp
|
+ HistoryIDSet res; |
+ // All ids are inserted in the end so the implicit hint would work. |
+ for (HistoryID id = kMinRowId; id < max; ++id) |
+ res.insert(id); |
+ return res; |
+ }; |
+ |
+ auto CountGroupElementsInIds = [](const ItemGroup& group, |
+ const HistoryIDSet& ids) { |
+ return std::count_if(ids.begin(), ids.end(), [&](history::URLID id) { |
+ return group.min_id <= id && id < group.max_id; |
+ }); |
+ }; |
+ |
+ // Test body -------------------------------------------------------------- |
+ |
+ // Groups of items ordered by increasing priority. |
+ ItemGroup item_groups[] = { |
+ {0, 0, kLowTypedCount, kLowVisitCount, kOld}, |
+ {0, 0, kLowTypedCount, kLowVisitCount, kNew}, |
+ {0, 0, kLowTypedCount, kHighVisitCount, kOld}, |
+ {0, 0, kLowTypedCount, kHighVisitCount, kNew}, |
+ {0, 0, kHighTypedCount, kLowVisitCount, kOld}, |
+ {0, 0, kHighTypedCount, kLowVisitCount, kNew}, |
+ {0, 0, kHighTypedCount, kHighVisitCount, kOld}, |
+ {0, 0, kHighTypedCount, kHighVisitCount, kNew}, |
+ }; |
+ |
+ // Initialize groups. |
+ history::URLID row_id = kMinRowId; |
+ for (auto& group : item_groups) { |
+ group.min_id = row_id; |
+ for (size_t i = 0; i < kAlmostLimit; ++i) { |
+ history::URLRow new_row( |
+ GURL("http://www.fake_url" + std::to_string(row_id) + ".com"), |
+ row_id); |
+ new_row.set_typed_count(group.typed_count); |
+ new_row.set_visit_count(group.visit_count); |
+ new_row.set_last_visit(base::Time::Now() - group.days_ago); |
+ UpdateURL(std::move(new_row)); |
+ ++row_id; |
+ } |
+ group.max_id = row_id; |
+ } |
+ |
+ // First group. Because number of entries is small enough no trimming occurs. |
+ { |
+ auto ids = GetHistoryIdsUpTo(item_groups[0].max_id); |
+ EXPECT_FALSE(GetPrivateData()->TrimHistoryIdsPool(&ids)); |
+ EXPECT_EQ(kAlmostLimit, ids.size()); |
+ } |
+ |
+ // Each next group should fill almost everything, while the previous group |
+ // should occupy what's left. |
+ auto error_position = std::adjacent_find( |
+ std::begin(item_groups), std::end(item_groups), |
+ [&](const ItemGroup& previous, const ItemGroup& current) { |
+ auto ids = GetHistoryIdsUpTo(current.max_id); |
+ EXPECT_TRUE(GetPrivateData()->TrimHistoryIdsPool(&ids)); |
+ |
+ size_t current_count = CountGroupElementsInIds(current, ids); |
+ EXPECT_EQ(kAlmostLimit, current_count); |
+ if (current_count != kAlmostLimit) |
+ return true; |
+ |
+ size_t previous_count = CountGroupElementsInIds(previous, ids); |
+ EXPECT_EQ(kItemsToScoreLimit - kAlmostLimit, previous_count); |
+ return previous_count != kItemsToScoreLimit - kAlmostLimit; |
+ }); |
+ |
+ EXPECT_TRUE(error_position == std::end(item_groups)) |
+ << "broken after: " << error_position - std::begin(item_groups); |
+} |
+ |
TEST_F(InMemoryURLIndexTest, HugeResultSet) { |
// Create a huge set of qualifying history items. |
for (history::URLID row_id = 5000; row_id < 6000; ++row_id) { |
@@ -721,12 +823,7 @@ TEST_F(InMemoryURLIndexTest, HugeResultSet) { |
ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms( |
ASCIIToUTF16("b"), base::string16::npos, kMaxMatches); |
- URLIndexPrivateData& private_data(*GetPrivateData()); |
EXPECT_EQ(kMaxMatches, matches.size()); |
- // There are 7 matches already in the database. |
- EXPECT_EQ(1008U, private_data.pre_filter_item_count_); |
- EXPECT_EQ(500U, private_data.post_filter_item_count_); |
- EXPECT_EQ(kMaxMatches, private_data.post_scoring_item_count_); |
} |
TEST_F(InMemoryURLIndexTest, TitleSearch) { |