OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/omnibox/base_search_provider.h" |
| 6 |
| 7 #include "base/strings/string16.h" |
| 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "components/omnibox/autocomplete_match.h" |
| 10 #include "components/omnibox/autocomplete_match_type.h" |
| 11 #include "components/omnibox/autocomplete_provider_client.h" |
| 12 #include "components/omnibox/autocomplete_scheme_classifier.h" |
| 13 #include "components/omnibox/search_suggestion_parser.h" |
| 14 #include "components/search_engines/search_terms_data.h" |
| 15 #include "components/search_engines/template_url_service.h" |
| 16 #include "components/search_engines/template_url_service_client.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 |
| 20 using testing::NiceMock; |
| 21 using testing::Return; |
| 22 using testing::_; |
| 23 |
| 24 class MockAutocompleteProviderClient : public AutocompleteProviderClient { |
| 25 public: |
| 26 MockAutocompleteProviderClient() {} |
| 27 MOCK_METHOD0(RequestContext, net::URLRequestContextGetter*()); |
| 28 MOCK_METHOD0(IsOffTheRecord, bool()); |
| 29 MOCK_METHOD0(AcceptLanguages, std::string()); |
| 30 MOCK_METHOD0(SearchSuggestEnabled, bool()); |
| 31 MOCK_METHOD0(ShowBookmarkBar, bool()); |
| 32 MOCK_METHOD0(SchemeClassifier, const AutocompleteSchemeClassifier&()); |
| 33 MOCK_METHOD6( |
| 34 Classify, |
| 35 void(const base::string16& text, |
| 36 bool prefer_keyword, |
| 37 bool allow_exact_keyword_match, |
| 38 metrics::OmniboxEventProto::PageClassification page_classification, |
| 39 AutocompleteMatch* match, |
| 40 GURL* alternate_nav_url)); |
| 41 MOCK_METHOD0(InMemoryDatabase, history::URLDatabase*()); |
| 42 MOCK_METHOD2(DeleteMatchingURLsForKeywordFromHistory, |
| 43 void(history::KeywordID keyword_id, const base::string16& term)); |
| 44 MOCK_METHOD0(TabSyncEnabledAndUnencrypted, bool()); |
| 45 MOCK_METHOD1(PrefetchImage, void(const GURL& url)); |
| 46 |
| 47 private: |
| 48 DISALLOW_COPY_AND_ASSIGN(MockAutocompleteProviderClient); |
| 49 }; |
| 50 |
| 51 class TestBaseSearchProvider : public BaseSearchProvider { |
| 52 public: |
| 53 typedef BaseSearchProvider::MatchMap MatchMap; |
| 54 |
| 55 // Note: Takes ownership of client. scoped_ptr<> would be the right way to |
| 56 // express that, but NiceMock<> can't forward a scoped_ptr. |
| 57 TestBaseSearchProvider(TemplateURLService* template_url_service, |
| 58 AutocompleteProviderClient* client, |
| 59 AutocompleteProvider::Type type) |
| 60 : BaseSearchProvider(template_url_service, |
| 61 scoped_ptr<AutocompleteProviderClient>(client), |
| 62 type) {} |
| 63 MOCK_METHOD1(DeleteMatch, void(const AutocompleteMatch& match)); |
| 64 MOCK_CONST_METHOD1(AddProviderInfo, void(ProvidersInfo* provider_info)); |
| 65 MOCK_CONST_METHOD1(GetTemplateURL, const TemplateURL*(bool is_keyword)); |
| 66 MOCK_CONST_METHOD1(GetInput, const AutocompleteInput(bool is_keyword)); |
| 67 MOCK_CONST_METHOD1(ShouldAppendExtraParams, |
| 68 bool(const SearchSuggestionParser::SuggestResult& result)); |
| 69 MOCK_METHOD1(RecordDeletionResult, void(bool success)); |
| 70 |
| 71 MOCK_METHOD2(Start, |
| 72 void(const AutocompleteInput& input, bool minimal_changes)); |
| 73 void AddMatchToMap(const SearchSuggestionParser::SuggestResult& result, |
| 74 const std::string& metadata, |
| 75 int accepted_suggestion, |
| 76 bool mark_as_deletable, |
| 77 bool in_keyword_mode, |
| 78 MatchMap* map) { |
| 79 BaseSearchProvider::AddMatchToMap(result, |
| 80 metadata, |
| 81 accepted_suggestion, |
| 82 mark_as_deletable, |
| 83 in_keyword_mode, |
| 84 map); |
| 85 } |
| 86 |
| 87 protected: |
| 88 virtual ~TestBaseSearchProvider() {} |
| 89 |
| 90 private: |
| 91 DISALLOW_COPY_AND_ASSIGN(TestBaseSearchProvider); |
| 92 }; |
| 93 |
| 94 class BaseSearchProviderTest : public testing::Test { |
| 95 public: |
| 96 virtual ~BaseSearchProviderTest() {} |
| 97 |
| 98 protected: |
| 99 virtual void SetUp() { |
| 100 service_.reset( |
| 101 new TemplateURLService(NULL, |
| 102 scoped_ptr<SearchTermsData>(new SearchTermsData), |
| 103 NULL, |
| 104 scoped_ptr<TemplateURLServiceClient>(), |
| 105 NULL, |
| 106 NULL, |
| 107 base::Closure())); |
| 108 provider_ = new NiceMock<TestBaseSearchProvider>( |
| 109 service_.get(), |
| 110 new NiceMock<MockAutocompleteProviderClient>, |
| 111 AutocompleteProvider::TYPE_SEARCH); |
| 112 } |
| 113 |
| 114 scoped_refptr<NiceMock<TestBaseSearchProvider> > provider_; |
| 115 scoped_ptr<TemplateURLService> service_; |
| 116 }; |
| 117 |
| 118 TEST_F(BaseSearchProviderTest, PreserveAnswersWhenDeduplicating) { |
| 119 TemplateURLData data; |
| 120 data.SetURL("http://foo.com/url?bar={searchTerms}"); |
| 121 TemplateURL* template_url = new TemplateURL(data); |
| 122 |
| 123 TestBaseSearchProvider::MatchMap map; |
| 124 base::string16 query = base::ASCIIToUTF16("weather los angeles"); |
| 125 base::string16 answer_contents = base::ASCIIToUTF16("some answer content"); |
| 126 base::string16 answer_type = base::ASCIIToUTF16("2334"); |
| 127 |
| 128 EXPECT_CALL(*provider_, GetInput(_)) |
| 129 .WillRepeatedly(Return(AutocompleteInput())); |
| 130 EXPECT_CALL(*provider_, GetTemplateURL(_)) |
| 131 .WillRepeatedly(Return(template_url)); |
| 132 |
| 133 SearchSuggestionParser::SuggestResult more_relevant( |
| 134 query, AutocompleteMatchType::SEARCH_HISTORY, query, base::string16(), |
| 135 base::string16(), base::string16(), base::string16(), std::string(), |
| 136 std::string(), false, 1300, true, false, query); |
| 137 provider_->AddMatchToMap( |
| 138 more_relevant, std::string(), TemplateURLRef::NO_SUGGESTION_CHOSEN, |
| 139 false, false, &map); |
| 140 |
| 141 SearchSuggestionParser::SuggestResult less_relevant( |
| 142 query, AutocompleteMatchType::SEARCH_SUGGEST, query, base::string16(), |
| 143 base::string16(), answer_contents, answer_type, std::string(), |
| 144 std::string(), false, 850, true, false, query); |
| 145 provider_->AddMatchToMap( |
| 146 less_relevant, std::string(), TemplateURLRef::NO_SUGGESTION_CHOSEN, |
| 147 false, false, &map); |
| 148 |
| 149 ASSERT_EQ(1U, map.size()); |
| 150 AutocompleteMatch match = map.begin()->second; |
| 151 ASSERT_EQ(1U, match.duplicate_matches.size()); |
| 152 AutocompleteMatch duplicate = match.duplicate_matches[0]; |
| 153 |
| 154 EXPECT_EQ(answer_contents, match.answer_contents); |
| 155 EXPECT_EQ(answer_type, match.answer_type); |
| 156 EXPECT_EQ(AutocompleteMatchType::SEARCH_HISTORY, match.type); |
| 157 EXPECT_EQ(1300, match.relevance); |
| 158 |
| 159 EXPECT_EQ(answer_contents, duplicate.answer_contents); |
| 160 EXPECT_EQ(answer_type, duplicate.answer_type); |
| 161 EXPECT_EQ(AutocompleteMatchType::SEARCH_SUGGEST, duplicate.type); |
| 162 EXPECT_EQ(850, duplicate.relevance); |
| 163 |
| 164 // Ensure answers are not copied over existing answers. |
| 165 map.clear(); |
| 166 base::string16 answer_contents2 = base::ASCIIToUTF16("different answer"); |
| 167 more_relevant = SearchSuggestionParser::SuggestResult( |
| 168 query, AutocompleteMatchType::SEARCH_HISTORY, query, base::string16(), |
| 169 base::string16(), answer_contents2, answer_type, std::string(), |
| 170 std::string(), false, 1300, true, false, query); |
| 171 provider_->AddMatchToMap( |
| 172 more_relevant, std::string(), TemplateURLRef::NO_SUGGESTION_CHOSEN, |
| 173 false, false, &map); |
| 174 provider_->AddMatchToMap( |
| 175 less_relevant, std::string(), TemplateURLRef::NO_SUGGESTION_CHOSEN, |
| 176 false, false, &map); |
| 177 ASSERT_EQ(1U, map.size()); |
| 178 match = map.begin()->second; |
| 179 ASSERT_EQ(1U, match.duplicate_matches.size()); |
| 180 duplicate = match.duplicate_matches[0]; |
| 181 |
| 182 EXPECT_EQ(answer_contents2, match.answer_contents); |
| 183 EXPECT_EQ(answer_type, match.answer_type); |
| 184 EXPECT_EQ(AutocompleteMatchType::SEARCH_HISTORY, match.type); |
| 185 EXPECT_EQ(1300, match.relevance); |
| 186 |
| 187 EXPECT_EQ(answer_contents, duplicate.answer_contents); |
| 188 EXPECT_EQ(answer_type, duplicate.answer_type); |
| 189 EXPECT_EQ(AutocompleteMatchType::SEARCH_SUGGEST, duplicate.type); |
| 190 EXPECT_EQ(850, duplicate.relevance); |
| 191 |
| 192 } |
OLD | NEW |