| Index: chrome/browser/bookmarks/bookmark_index_unittest.cc
|
| diff --git a/chrome/browser/bookmarks/bookmark_index_unittest.cc b/chrome/browser/bookmarks/bookmark_index_unittest.cc
|
| index 057e60894cbf20338588339ab5ae7c97698d90be..938ae88efe1e6142f0ed4220c4bd2c400f63a915 100644
|
| --- a/chrome/browser/bookmarks/bookmark_index_unittest.cc
|
| +++ b/chrome/browser/bookmarks/bookmark_index_unittest.cc
|
| @@ -8,6 +8,7 @@
|
| #include <vector>
|
|
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/metrics/field_trial.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_split.h"
|
| #include "base/strings/string_util.h"
|
| @@ -18,8 +19,11 @@
|
| #include "chrome/browser/history/history_service.h"
|
| #include "chrome/browser/history/history_service_factory.h"
|
| #include "chrome/browser/history/url_database.h"
|
| +#include "chrome/browser/omnibox/omnibox_field_trial.h"
|
| +#include "chrome/common/metrics/variations/variations_util.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| -#include "components/bookmarks/core/browser/bookmark_title_match.h"
|
| +#include "components/bookmarks/core/browser/bookmark_match.h"
|
| +#include "components/variations/entropy_provider.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -27,20 +31,33 @@ using base::ASCIIToUTF16;
|
|
|
| class BookmarkIndexTest : public testing::Test {
|
| public:
|
| - BookmarkIndexTest() : model_(new BookmarkModel(NULL)) {}
|
| + BookmarkIndexTest() : model_(new BookmarkModel(NULL)) {
|
| + // Destroy the existing FieldTrialList before creating a new one to avoid
|
| + // a DCHECK.
|
| + field_trial_list_.reset();
|
| + field_trial_list_.reset(new base::FieldTrialList(
|
| + new metrics::SHA1EntropyProvider("foo")));
|
| + chrome_variations::testing::ClearAllVariationParams();
|
| + }
|
|
|
| - void AddBookmarksWithTitles(const char** titles, size_t count) {
|
| - std::vector<std::string> title_vector;
|
| - for (size_t i = 0; i < count; ++i)
|
| - title_vector.push_back(titles[i]);
|
| - AddBookmarksWithTitles(title_vector);
|
| + typedef std::pair<std::string, std::string> TitleAndURL;
|
| +
|
| + void AddBookmarks(const char** titles, const char** urls, size_t count) {
|
| + // The pair is (title, url).
|
| + std::vector<TitleAndURL> bookmarks;
|
| + for (size_t i = 0; i < count; ++i) {
|
| + TitleAndURL bookmark(titles[i], urls[i]);
|
| + bookmarks.push_back(bookmark);
|
| + }
|
| + AddBookmarks(bookmarks);
|
| }
|
|
|
| - void AddBookmarksWithTitles(const std::vector<std::string>& titles) {
|
| - GURL url("about:blank");
|
| - for (size_t i = 0; i < titles.size(); ++i)
|
| + void AddBookmarks(const std::vector<TitleAndURL> bookmarks) {
|
| + for (size_t i = 0; i < bookmarks.size(); ++i) {
|
| model_->AddURL(model_->other_node(), static_cast<int>(i),
|
| - ASCIIToUTF16(titles[i]), url);
|
| + ASCIIToUTF16(bookmarks[i].first),
|
| + GURL(bookmarks[i].second));
|
| + }
|
| }
|
|
|
| void ExpectMatches(const std::string& query,
|
| @@ -54,8 +71,8 @@ class BookmarkIndexTest : public testing::Test {
|
|
|
| void ExpectMatches(const std::string& query,
|
| const std::vector<std::string>& expected_titles) {
|
| - std::vector<BookmarkTitleMatch> matches;
|
| - model_->GetBookmarksWithTitlesMatching(ASCIIToUTF16(query), 1000, &matches);
|
| + std::vector<BookmarkMatch> matches;
|
| + model_->GetBookmarksMatching(ASCIIToUTF16(query), 1000, &matches);
|
| ASSERT_EQ(expected_titles.size(), matches.size());
|
| for (size_t i = 0; i < expected_titles.size(); ++i) {
|
| bool found = false;
|
| @@ -71,14 +88,14 @@ class BookmarkIndexTest : public testing::Test {
|
| }
|
|
|
| void ExtractMatchPositions(const std::string& string,
|
| - BookmarkTitleMatch::MatchPositions* matches) {
|
| + BookmarkMatch::MatchPositions* matches) {
|
| std::vector<std::string> match_strings;
|
| base::SplitString(string, ':', &match_strings);
|
| for (size_t i = 0; i < match_strings.size(); ++i) {
|
| std::vector<std::string> chunks;
|
| base::SplitString(match_strings[i], ',', &chunks);
|
| ASSERT_EQ(2U, chunks.size());
|
| - matches->push_back(BookmarkTitleMatch::MatchPosition());
|
| + matches->push_back(BookmarkMatch::MatchPosition());
|
| int chunks0, chunks1;
|
| base::StringToInt(chunks[0], &chunks0);
|
| base::StringToInt(chunks[1], &chunks1);
|
| @@ -88,16 +105,12 @@ class BookmarkIndexTest : public testing::Test {
|
| }
|
|
|
| void ExpectMatchPositions(
|
| - const std::string& query,
|
| - const BookmarkTitleMatch::MatchPositions& expected_positions) {
|
| - std::vector<BookmarkTitleMatch> matches;
|
| - model_->GetBookmarksWithTitlesMatching(ASCIIToUTF16(query), 1000, &matches);
|
| - ASSERT_EQ(1U, matches.size());
|
| - const BookmarkTitleMatch& match = matches[0];
|
| - ASSERT_EQ(expected_positions.size(), match.match_positions.size());
|
| + const BookmarkMatch::MatchPositions& actual_positions,
|
| + const BookmarkMatch::MatchPositions& expected_positions) {
|
| + ASSERT_EQ(expected_positions.size(), actual_positions.size());
|
| for (size_t i = 0; i < expected_positions.size(); ++i) {
|
| - EXPECT_EQ(expected_positions[i].first, match.match_positions[i].first);
|
| - EXPECT_EQ(expected_positions[i].second, match.match_positions[i].second);
|
| + EXPECT_EQ(expected_positions[i].first, actual_positions[i].first);
|
| + EXPECT_EQ(expected_positions[i].second, actual_positions[i].second);
|
| }
|
| }
|
|
|
| @@ -105,14 +118,16 @@ class BookmarkIndexTest : public testing::Test {
|
| scoped_ptr<BookmarkModel> model_;
|
|
|
| private:
|
| + scoped_ptr<base::FieldTrialList> field_trial_list_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(BookmarkIndexTest);
|
| };
|
|
|
| // Various permutations with differing input, queries and output that exercises
|
| // all query paths.
|
| -TEST_F(BookmarkIndexTest, Tests) {
|
| +TEST_F(BookmarkIndexTest, GetBookmarksMatching) {
|
| struct TestData {
|
| - const std::string input;
|
| + const std::string titles;
|
| const std::string query;
|
| const std::string expected;
|
| } data[] = {
|
| @@ -144,8 +159,13 @@ TEST_F(BookmarkIndexTest, Tests) {
|
| };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
|
| std::vector<std::string> titles;
|
| - base::SplitString(data[i].input, ';', &titles);
|
| - AddBookmarksWithTitles(titles);
|
| + base::SplitString(data[i].titles, ';', &titles);
|
| + std::vector<TitleAndURL> bookmarks;
|
| + for (size_t j = 0; j < titles.size(); ++j) {
|
| + TitleAndURL bookmark(titles[j], "about:blank");
|
| + bookmarks.push_back(bookmark);
|
| + }
|
| + AddBookmarks(bookmarks);
|
|
|
| std::vector<std::string> expected;
|
| if (!data[i].expected.empty())
|
| @@ -157,7 +177,75 @@ TEST_F(BookmarkIndexTest, Tests) {
|
| }
|
| }
|
|
|
| -TEST_F(BookmarkIndexTest, TestNormalization) {
|
| +// Analogous to GetBookmarksMatching, this test tests various permutations
|
| +// of title, URL, and input to see if the title/URL matches the input as
|
| +// expected.
|
| +TEST_F(BookmarkIndexTest, GetBookmarksMatchingWithURLs) {
|
| + struct TestData {
|
| + const std::string query;
|
| + const std::string title;
|
| + const std::string url;
|
| + const bool should_be_retrieved;
|
| + } data[] = {
|
| + // Test single-word inputs. Include both exact matches and prefix matches.
|
| + { "foo", "Foo", "http://www.bar.com/", true },
|
| + { "foo", "Foodie", "http://www.bar.com/", true },
|
| + { "foo", "Bar", "http://www.foo.com/", true },
|
| + { "foo", "Bar", "http://www.foodie.com/", true },
|
| + { "foo", "Foo", "http://www.foo.com/", true },
|
| + { "foo", "Bar", "http://www.bar.com/", false },
|
| + { "foo", "Bar", "http://www.bar.com/blah/foo/blah-again/ ", true },
|
| + { "foo", "Bar", "http://www.bar.com/blah/foodie/blah-again/ ", true },
|
| + { "foo", "Bar", "http://www.bar.com/blah-foo/blah-again/ ", true },
|
| + { "foo", "Bar", "http://www.bar.com/blah-foodie/blah-again/ ", true },
|
| + { "foo", "Bar", "http://www.bar.com/blahafoo/blah-again/ ", false },
|
| +
|
| + // Test multi-word inputs.
|
| + { "foo bar", "Foo Bar", "http://baz.com/", true },
|
| + { "foo bar", "Foodie Bar", "http://baz.com/", true },
|
| + { "bar foo", "Foo Bar", "http://baz.com/", true },
|
| + { "bar foo", "Foodie Barly", "http://baz.com/", true },
|
| + { "foo bar", "Foo Baz", "http://baz.com/", false },
|
| + { "foo bar", "Foo Baz", "http://bar.com/", true },
|
| + { "foo bar", "Foo Baz", "http://barly.com/", true },
|
| + { "foo bar", "Foodie Baz", "http://barly.com/", true },
|
| + { "bar foo", "Foo Baz", "http://bar.com/", true },
|
| + { "bar foo", "Foo Baz", "http://barly.com/", true },
|
| + { "foo bar", "Baz Bar", "http://blah.com/foo", true },
|
| + { "foo bar", "Baz Barly", "http://blah.com/foodie", true },
|
| + { "foo bar", "Baz Bur", "http://blah.com/foo/bar", true },
|
| + { "foo bar", "Baz Bur", "http://blah.com/food/barly", true },
|
| + { "foo bar", "Baz Bur", "http://bar.com/blah/foo", true },
|
| + { "foo bar", "Baz Bur", "http://barly.com/blah/food", true },
|
| + { "foo bar", "Baz Bur", "http://bar.com/blah/flub", false },
|
| + { "foo bar", "Baz Bur", "http://foo.com/blah/flub", false }
|
| + };
|
| +
|
| + // Set the field trial parameter to enable indexing URLs.
|
| + {
|
| + std::map<std::string, std::string> params;
|
| + params[OmniboxFieldTrial::kBookmarksIndexURLsRule] = "true";
|
| + ASSERT_TRUE(chrome_variations::AssociateVariationParams(
|
| + OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A", params));
|
| + }
|
| + base::FieldTrialList::CreateFieldTrial(
|
| + OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A");
|
| +
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
|
| + model_.reset(new BookmarkModel(NULL));
|
| + std::vector<TitleAndURL> bookmarks;
|
| + bookmarks.push_back(TitleAndURL(data[i].title, data[i].url));
|
| + AddBookmarks(bookmarks);
|
| +
|
| + std::vector<std::string> expected;
|
| + if (data[i].should_be_retrieved)
|
| + expected.push_back(data[i].title);
|
| +
|
| + ExpectMatches(data[i].query, expected);
|
| + }
|
| +}
|
| +
|
| +TEST_F(BookmarkIndexTest, Normalization) {
|
| struct TestData {
|
| const char* title;
|
| const char* query;
|
| @@ -179,25 +267,25 @@ TEST_F(BookmarkIndexTest, TestNormalization) {
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
|
| model_->AddURL(model_->other_node(), 0, base::UTF8ToUTF16(data[i].title),
|
| url);
|
| - std::vector<BookmarkTitleMatch> matches;
|
| - model_->GetBookmarksWithTitlesMatching(
|
| + std::vector<BookmarkMatch> matches;
|
| + model_->GetBookmarksMatching(
|
| base::UTF8ToUTF16(data[i].query), 10, &matches);
|
| EXPECT_EQ(1u, matches.size());
|
| model_.reset(new BookmarkModel(NULL));
|
| }
|
| }
|
|
|
| -// Makes sure match positions are updated appropriately.
|
| -TEST_F(BookmarkIndexTest, MatchPositions) {
|
| +// Makes sure match positions are updated appropriately for title matches.
|
| +TEST_F(BookmarkIndexTest, MatchPositionsTitles) {
|
| struct TestData {
|
| const std::string title;
|
| const std::string query;
|
| - const std::string expected;
|
| + const std::string expected_title_match_positions;
|
| } data[] = {
|
| // Trivial test case of only one term, exact match.
|
| { "a", "A", "0,1" },
|
| { "foo bar", "bar", "4,7" },
|
| - { "fooey bark", "bar foo", "0,3:6,9"},
|
| + { "fooey bark", "bar foo", "0,3:6,9" },
|
| // Non-trivial tests.
|
| { "foobar foo", "foobar foo", "0,6:7,10" },
|
| { "foobar foo", "foo foobar", "0,6:7,10" },
|
| @@ -205,22 +293,80 @@ TEST_F(BookmarkIndexTest, MatchPositions) {
|
| { "foobar foobar", "foo foobar", "0,6:7,13" },
|
| };
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
|
| - std::vector<std::string> titles;
|
| - titles.push_back(data[i].title);
|
| - AddBookmarksWithTitles(titles);
|
| + std::vector<TitleAndURL> bookmarks;
|
| + TitleAndURL bookmark(data[i].title, "about:blank");
|
| + bookmarks.push_back(bookmark);
|
| + AddBookmarks(bookmarks);
|
| +
|
| + std::vector<BookmarkMatch> matches;
|
| + model_->GetBookmarksMatching(ASCIIToUTF16(data[i].query), 1000, &matches);
|
| + ASSERT_EQ(1U, matches.size());
|
| +
|
| + BookmarkMatch::MatchPositions expected_title_matches;
|
| + ExtractMatchPositions(data[i].expected_title_match_positions,
|
| + &expected_title_matches);
|
| + ExpectMatchPositions(matches[0].title_match_positions,
|
| + expected_title_matches);
|
| +
|
| + model_.reset(new BookmarkModel(NULL));
|
| + }
|
| +}
|
| +
|
| +// Makes sure match positions are updated appropriately for URL matches.
|
| +TEST_F(BookmarkIndexTest, MatchPositionsURLs) {
|
| + struct TestData {
|
| + const std::string query;
|
| + const std::string url;
|
| + const std::string expected_url_match_positions;
|
| + } data[] = {
|
| + { "foo", "http://www.foo.com/", "11,14" },
|
| + { "foo", "http://www.foodie.com/", "11,14" },
|
| + { "foo", "http://www.foofoo.com/", "11,14" },
|
| + { "www", "http://www.foo.com/", "7,10" },
|
| + { "foo", "http://www.foodie.com/blah/foo/fi", "11,14:27,30" },
|
| + { "foo", "http://www.blah.com/blah/foo/fi", "25,28" },
|
| + { "foo www", "http://www.foodie.com/blah/foo/fi", "7,10:11,14:27,30" },
|
| + { "www foo", "http://www.foodie.com/blah/foo/fi", "7,10:11,14:27,30" },
|
| + { "www bla", "http://www.foodie.com/blah/foo/fi", "7,10:22,25" },
|
| + { "http", "http://www.foo.com/", "0,4" },
|
| + { "http www", "http://www.foo.com/", "0,4:7,10" },
|
| + { "http foo", "http://www.foo.com/", "0,4:11,14" },
|
| + { "http foo", "http://www.bar.com/baz/foodie/hi", "0,4:23,26" }
|
| + };
|
|
|
| - BookmarkTitleMatch::MatchPositions expected_matches;
|
| - ExtractMatchPositions(data[i].expected, &expected_matches);
|
| - ExpectMatchPositions(data[i].query, expected_matches);
|
| + // Set the field trial parameter to enable indexing URLs.
|
| + {
|
| + std::map<std::string, std::string> params;
|
| + params[OmniboxFieldTrial::kBookmarksIndexURLsRule] = "true";
|
| + ASSERT_TRUE(chrome_variations::AssociateVariationParams(
|
| + OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A", params));
|
| + }
|
| + base::FieldTrialList::CreateFieldTrial(
|
| + OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A");
|
|
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) {
|
| model_.reset(new BookmarkModel(NULL));
|
| + std::vector<TitleAndURL> bookmarks;
|
| + TitleAndURL bookmark("123456", data[i].url);
|
| + bookmarks.push_back(bookmark);
|
| + AddBookmarks(bookmarks);
|
| +
|
| + std::vector<BookmarkMatch> matches;
|
| + model_->GetBookmarksMatching(ASCIIToUTF16(data[i].query), 1000, &matches);
|
| + ASSERT_EQ(1U, matches.size()) << data[i].url << data[i].query;
|
| +
|
| + BookmarkMatch::MatchPositions expected_url_matches;
|
| + ExtractMatchPositions(data[i].expected_url_match_positions,
|
| + &expected_url_matches);
|
| + ExpectMatchPositions(matches[0].url_match_positions, expected_url_matches);
|
| }
|
| }
|
|
|
| // Makes sure index is updated when a node is removed.
|
| TEST_F(BookmarkIndexTest, Remove) {
|
| - const char* input[] = { "a", "b" };
|
| - AddBookmarksWithTitles(input, ARRAYSIZE_UNSAFE(input));
|
| + const char* titles[] = { "a", "b" };
|
| + const char* urls[] = { "about:blank", "about:blank" };
|
| + AddBookmarks(titles, urls, ARRAYSIZE_UNSAFE(titles));
|
|
|
| // Remove the node and make sure we don't get back any results.
|
| model_->Remove(model_->other_node(), 0);
|
| @@ -229,8 +375,9 @@ TEST_F(BookmarkIndexTest, Remove) {
|
|
|
| // Makes sure index is updated when a node's title is changed.
|
| TEST_F(BookmarkIndexTest, ChangeTitle) {
|
| - const char* input[] = { "a", "b" };
|
| - AddBookmarksWithTitles(input, ARRAYSIZE_UNSAFE(input));
|
| + const char* titles[] = { "a", "b" };
|
| + const char* urls[] = { "about:blank", "about:blank" };
|
| + AddBookmarks(titles, urls, ARRAYSIZE_UNSAFE(titles));
|
|
|
| // Remove the node and make sure we don't get back any results.
|
| const char* expected[] = { "blah" };
|
| @@ -240,11 +387,12 @@ TEST_F(BookmarkIndexTest, ChangeTitle) {
|
|
|
| // Makes sure no more than max queries is returned.
|
| TEST_F(BookmarkIndexTest, HonorMax) {
|
| - const char* input[] = { "abcd", "abcde" };
|
| - AddBookmarksWithTitles(input, ARRAYSIZE_UNSAFE(input));
|
| + const char* titles[] = { "abcd", "abcde" };
|
| + const char* urls[] = { "about:blank", "about:blank" };
|
| + AddBookmarks(titles, urls, ARRAYSIZE_UNSAFE(titles));
|
|
|
| - std::vector<BookmarkTitleMatch> matches;
|
| - model_->GetBookmarksWithTitlesMatching(ASCIIToUTF16("ABc"), 1, &matches);
|
| + std::vector<BookmarkMatch> matches;
|
| + model_->GetBookmarksMatching(ASCIIToUTF16("ABc"), 1, &matches);
|
| EXPECT_EQ(1U, matches.size());
|
| }
|
|
|
| @@ -255,11 +403,11 @@ TEST_F(BookmarkIndexTest, EmptyMatchOnMultiwideLowercaseString) {
|
| base::WideToUTF16(L"\u0130 i"),
|
| GURL("http://www.google.com"));
|
|
|
| - std::vector<BookmarkTitleMatch> matches;
|
| - model_->GetBookmarksWithTitlesMatching(ASCIIToUTF16("i"), 100, &matches);
|
| + std::vector<BookmarkMatch> matches;
|
| + model_->GetBookmarksMatching(ASCIIToUTF16("i"), 100, &matches);
|
| ASSERT_EQ(1U, matches.size());
|
| EXPECT_TRUE(matches[0].node == n1);
|
| - EXPECT_TRUE(matches[0].match_positions.empty());
|
| + EXPECT_TRUE(matches[0].title_match_positions.empty());
|
| }
|
|
|
| TEST_F(BookmarkIndexTest, GetResultsSortedByTypedCount) {
|
| @@ -320,8 +468,8 @@ TEST_F(BookmarkIndexTest, GetResultsSortedByTypedCount) {
|
| EXPECT_EQ(data[3].title, base::UTF16ToUTF8(result4.title()));
|
|
|
| // Populate match nodes.
|
| - std::vector<BookmarkTitleMatch> matches;
|
| - model->GetBookmarksWithTitlesMatching(ASCIIToUTF16("google"), 4, &matches);
|
| + std::vector<BookmarkMatch> matches;
|
| + model->GetBookmarksMatching(ASCIIToUTF16("google"), 4, &matches);
|
|
|
| // The resulting order should be:
|
| // 1. Google (google.com) 100
|
| @@ -336,7 +484,7 @@ TEST_F(BookmarkIndexTest, GetResultsSortedByTypedCount) {
|
|
|
| matches.clear();
|
| // Select top two matches.
|
| - model->GetBookmarksWithTitlesMatching(ASCIIToUTF16("google"), 2, &matches);
|
| + model->GetBookmarksMatching(ASCIIToUTF16("google"), 2, &matches);
|
|
|
| EXPECT_EQ(2, static_cast<int>(matches.size()));
|
| EXPECT_EQ(data[0].url, matches[0].node->url());
|
|
|