OLD | NEW |
---|---|
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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <fstream> | 9 #include <fstream> |
10 | 10 |
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
703 ASCIIToUTF16("atdmt view"), base::string16::npos, kMaxMatches); | 703 ASCIIToUTF16("atdmt view"), base::string16::npos, kMaxMatches); |
704 EXPECT_EQ(1U, matches.size()); | 704 EXPECT_EQ(1U, matches.size()); |
705 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("atdmt.view"), | 705 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("atdmt.view"), |
706 base::string16::npos, kMaxMatches); | 706 base::string16::npos, kMaxMatches); |
707 EXPECT_EQ(0U, matches.size()); | 707 EXPECT_EQ(0U, matches.size()); |
708 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("view.atdmt"), | 708 matches = url_index_->HistoryItemsForTerms(ASCIIToUTF16("view.atdmt"), |
709 base::string16::npos, kMaxMatches); | 709 base::string16::npos, kMaxMatches); |
710 EXPECT_EQ(1U, matches.size()); | 710 EXPECT_EQ(1U, matches.size()); |
711 } | 711 } |
712 | 712 |
713 TEST_F(InMemoryURLIndexTest, TrimHistortIds) { | |
714 // Constants --------------------------------------------------------------- | |
715 | |
716 constexpr size_t kItemsToScoreLimit = 500; | |
717 constexpr size_t kAlmostLimit = kItemsToScoreLimit - 5; | |
718 | |
719 constexpr int kLowTypedCount = 2; | |
720 constexpr int kHighTypedCount = 100; | |
721 | |
722 constexpr int kLowVisitCount = 20; | |
723 constexpr int kHighVisitCount = 200; | |
724 | |
725 constexpr base::TimeDelta kOld = base::TimeDelta::FromDays(15); | |
726 constexpr base::TimeDelta kNew = base::TimeDelta::FromDays(2); | |
727 | |
728 constexpr int kMinRowId = 5000; | |
729 | |
730 // Helpers ----------------------------------------------------------------- | |
731 | |
732 struct ItemGroup { | |
733 history::URLID min_id; | |
734 history::URLID max_id; | |
735 int typed_count; | |
736 int visit_count; | |
737 base::TimeDelta days_ago; | |
738 }; | |
739 | |
740 auto GetHistoryIdsUpTo = [](HistoryID max) { | |
741 HistoryIDSet res; | |
742 // All ids are inserted in the end so the implicit hint would work. | |
743 for (HistoryID id = kMinRowId; id < max; ++id) | |
744 res.insert(id); | |
745 return res; | |
746 }; | |
747 | |
748 auto CountGroupElementsInIds = [](const ItemGroup& group, | |
749 const HistoryIDSet& items) { | |
750 return std::count_if(items.begin(), items.end(), [&](history::URLID id) { | |
751 return group.min_id <= id && id < group.max_id; | |
752 }); | |
753 }; | |
754 | |
755 // Test body -------------------------------------------------------------- | |
756 | |
757 // Groups of items ordered by increasing priority. | |
758 ItemGroup item_groups[] = { | |
759 {0, 0, kLowTypedCount, kLowVisitCount, kOld}, | |
760 {0, 0, kLowTypedCount, kLowVisitCount, kNew}, | |
761 {0, 0, kLowTypedCount, kHighVisitCount, kOld}, | |
762 {0, 0, kLowTypedCount, kHighVisitCount, kNew}, | |
763 {0, 0, kHighTypedCount, kLowVisitCount, kOld}, | |
764 {0, 0, kHighTypedCount, kLowVisitCount, kNew}, | |
765 {0, 0, kHighTypedCount, kHighVisitCount, kOld}, | |
766 {0, 0, kHighTypedCount, kHighVisitCount, kNew}, | |
767 }; | |
768 | |
769 // Initialize groups. | |
770 { | |
Peter Kasting
2017/02/24 01:37:41
Nit: This outer brace not needed (the win of sayin
dyaroshev
2017/02/24 02:14:25
Done.
| |
771 history::URLID row_id = kMinRowId; | |
772 for (auto& group : item_groups) { | |
773 group.min_id = row_id; | |
774 for (size_t i = 0; i < kAlmostLimit; ++i) { | |
775 history::URLRow new_row( | |
776 GURL("http://www.fake_url" + std::to_string(row_id) + ".com"), | |
777 row_id); | |
778 new_row.set_typed_count(group.typed_count); | |
779 new_row.set_visit_count(group.visit_count); | |
780 new_row.set_last_visit(base::Time::Now() - group.days_ago); | |
781 UpdateURL(std::move(new_row)); | |
782 ++row_id; | |
783 } | |
784 group.max_id = row_id; | |
785 } | |
786 } | |
787 | |
788 // First group. Because number of entries is small enough no trimming occurs. | |
789 { | |
790 auto ids = GetHistoryIdsUpTo(item_groups[0].max_id); | |
791 EXPECT_FALSE(GetPrivateData()->TrimHistoryIdsPool(&ids)); | |
792 EXPECT_EQ(kAlmostLimit, ids.size()); | |
793 } | |
794 | |
795 // Each next group should fill almost everything, while the previous group | |
796 // should occupy what's left. | |
797 auto error_position = std::adjacent_find( | |
798 std::begin(item_groups), std::end(item_groups), | |
799 [&](const ItemGroup& previous, const ItemGroup& current) { | |
800 auto ids = GetHistoryIdsUpTo(current.max_id); | |
801 EXPECT_TRUE(GetPrivateData()->TrimHistoryIdsPool(&ids)); | |
802 | |
803 size_t current_count = CountGroupElementsInIds(current, ids); | |
804 EXPECT_EQ(current_count, kAlmostLimit); | |
Peter Kasting
2017/02/24 01:37:41
Nit: (expected, actual)
dyaroshev
2017/02/24 02:14:25
Done.
| |
805 if (current_count != kAlmostLimit) | |
806 return true; | |
807 | |
808 size_t previous_count = CountGroupElementsInIds(previous, ids); | |
809 EXPECT_EQ(previous_count, kItemsToScoreLimit - kAlmostLimit); | |
810 return previous_count != kItemsToScoreLimit - kAlmostLimit; | |
811 }); | |
812 | |
813 EXPECT_TRUE(error_position == std::end(item_groups)) | |
814 << "broken after: " << error_position - std::begin(item_groups); | |
815 } | |
816 | |
713 TEST_F(InMemoryURLIndexTest, HugeResultSet) { | 817 TEST_F(InMemoryURLIndexTest, HugeResultSet) { |
714 // Create a huge set of qualifying history items. | 818 // Create a huge set of qualifying history items. |
715 for (history::URLID row_id = 5000; row_id < 6000; ++row_id) { | 819 for (history::URLID row_id = 5000; row_id < 6000; ++row_id) { |
716 history::URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), | 820 history::URLRow new_row(GURL("http://www.brokeandaloneinmanitoba.com/"), |
717 row_id); | 821 row_id); |
718 new_row.set_last_visit(base::Time::Now()); | 822 new_row.set_last_visit(base::Time::Now()); |
719 EXPECT_TRUE(UpdateURL(new_row)); | 823 EXPECT_TRUE(UpdateURL(new_row)); |
720 } | 824 } |
721 | 825 |
722 ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms( | 826 ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms( |
723 ASCIIToUTF16("b"), base::string16::npos, kMaxMatches); | 827 ASCIIToUTF16("b"), base::string16::npos, kMaxMatches); |
724 URLIndexPrivateData& private_data(*GetPrivateData()); | |
725 EXPECT_EQ(kMaxMatches, matches.size()); | 828 EXPECT_EQ(kMaxMatches, matches.size()); |
726 // There are 7 matches already in the database. | |
727 EXPECT_EQ(1008U, private_data.pre_filter_item_count_); | |
728 EXPECT_EQ(500U, private_data.post_filter_item_count_); | |
729 EXPECT_EQ(kMaxMatches, private_data.post_scoring_item_count_); | |
730 } | 829 } |
731 | 830 |
732 TEST_F(InMemoryURLIndexTest, TitleSearch) { | 831 TEST_F(InMemoryURLIndexTest, TitleSearch) { |
733 // Signal if someone has changed the test DB. | 832 // Signal if someone has changed the test DB. |
734 EXPECT_EQ(30U, GetPrivateData()->history_info_map_.size()); | 833 EXPECT_EQ(30U, GetPrivateData()->history_info_map_.size()); |
735 | 834 |
736 // Ensure title is being searched. | 835 // Ensure title is being searched. |
737 ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms( | 836 ScoredHistoryMatches matches = url_index_->HistoryItemsForTerms( |
738 ASCIIToUTF16("MORTGAGE RATE DROPS"), base::string16::npos, kMaxMatches); | 837 ASCIIToUTF16("MORTGAGE RATE DROPS"), base::string16::npos, kMaxMatches); |
739 ASSERT_EQ(1U, matches.size()); | 838 ASSERT_EQ(1U, matches.size()); |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1345 ASSERT_TRUE(GetCacheFilePath(&full_file_path)); | 1444 ASSERT_TRUE(GetCacheFilePath(&full_file_path)); |
1346 std::vector<base::FilePath::StringType> actual_parts; | 1445 std::vector<base::FilePath::StringType> actual_parts; |
1347 full_file_path.GetComponents(&actual_parts); | 1446 full_file_path.GetComponents(&actual_parts); |
1348 ASSERT_EQ(expected_parts.size(), actual_parts.size()); | 1447 ASSERT_EQ(expected_parts.size(), actual_parts.size()); |
1349 size_t count = expected_parts.size(); | 1448 size_t count = expected_parts.size(); |
1350 for (size_t i = 0; i < count; ++i) | 1449 for (size_t i = 0; i < count; ++i) |
1351 EXPECT_EQ(expected_parts[i], actual_parts[i]); | 1450 EXPECT_EQ(expected_parts[i], actual_parts[i]); |
1352 // Must clear the history_dir_ to satisfy the dtor's DCHECK. | 1451 // Must clear the history_dir_ to satisfy the dtor's DCHECK. |
1353 set_history_dir(base::FilePath()); | 1452 set_history_dir(base::FilePath()); |
1354 } | 1453 } |
OLD | NEW |