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

Side by Side Diff: chrome/browser/autocomplete/search_provider_unittest.cc

Issue 481693004: Omnibox: Prevent Asynchronous Suggestions from Changing Default Match (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 3 months 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
« no previous file with comments | « no previous file | chrome/browser/ui/search/instant_extended_interactive_uitest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "components/omnibox/search_provider.h" 5 #include "components/omnibox/search_provider.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 const bool allowed_to_be_default_match; 135 const bool allowed_to_be_default_match;
136 const base::string16 fill_into_edit; 136 const base::string16 fill_into_edit;
137 }; 137 };
138 138
139 struct TestData { 139 struct TestData {
140 const base::string16 input; 140 const base::string16 input;
141 const size_t num_results; 141 const size_t num_results;
142 const ResultInfo output[3]; 142 const ResultInfo output[3];
143 }; 143 };
144 144
145 struct ExpectedMatch {
146 std::string contents;
147 bool allowed_to_be_default_match;
148 };
149
145 SearchProviderTest() 150 SearchProviderTest()
146 : default_t_url_(NULL), 151 : default_t_url_(NULL),
147 term1_(ASCIIToUTF16("term1")), 152 term1_(ASCIIToUTF16("term1")),
148 keyword_t_url_(NULL), 153 keyword_t_url_(NULL),
149 keyword_term_(ASCIIToUTF16("keyword")), 154 keyword_term_(ASCIIToUTF16("keyword")),
150 run_loop_(NULL) { 155 run_loop_(NULL) {
151 ResetFieldTrialList(); 156 ResetFieldTrialList();
152 } 157 }
153 158
154 // See description above class for what this registers. 159 // See description above class for what this registers.
155 virtual void SetUp() OVERRIDE; 160 virtual void SetUp() OVERRIDE;
156 virtual void TearDown() OVERRIDE; 161 virtual void TearDown() OVERRIDE;
157 162
158 void RunTest(TestData* cases, int num_cases, bool prefer_keyword); 163 void RunTest(TestData* cases, int num_cases, bool prefer_keyword);
159 164
160 protected: 165 protected:
161 // Needed for AutocompleteFieldTrial::ActivateStaticTrials(); 166 // Needed for AutocompleteFieldTrial::ActivateStaticTrials();
162 scoped_ptr<base::FieldTrialList> field_trial_list_; 167 scoped_ptr<base::FieldTrialList> field_trial_list_;
163 168
164 // Default value used for testing. 169 // Default values used for testing.
165 static const std::string kNotApplicable; 170 static const std::string kNotApplicable;
171 static const ExpectedMatch kEmptyExpectedMatch;
166 172
167 // Adds a search for |term|, using the engine |t_url| to the history, and 173 // Adds a search for |term|, using the engine |t_url| to the history, and
168 // returns the URL for that search. 174 // returns the URL for that search.
169 GURL AddSearchToHistory(TemplateURL* t_url, base::string16 term, int visit_cou nt); 175 GURL AddSearchToHistory(TemplateURL* t_url, base::string16 term, int visit_cou nt);
170 176
171 // Looks for a match in |provider_| with |contents| equal to |contents|. 177 // Looks for a match in |provider_| with |contents| equal to |contents|.
172 // Sets |match| to it if found. Returns whether |match| was set. 178 // Sets |match| to it if found. Returns whether |match| was set.
173 bool FindMatchWithContents(const base::string16& contents, 179 bool FindMatchWithContents(const base::string16& contents,
174 AutocompleteMatch* match); 180 AutocompleteMatch* match);
175 181
(...skipping 12 matching lines...) Expand all
188 // Invokes Start on provider_, then runs all pending tasks. 194 // Invokes Start on provider_, then runs all pending tasks.
189 void QueryForInput(const base::string16& text, 195 void QueryForInput(const base::string16& text,
190 bool prevent_inline_autocomplete, 196 bool prevent_inline_autocomplete,
191 bool prefer_keyword); 197 bool prefer_keyword);
192 198
193 // Calls QueryForInput(), finishes any suggest query, then if |wyt_match| is 199 // Calls QueryForInput(), finishes any suggest query, then if |wyt_match| is
194 // non-NULL, sets it to the "what you typed" entry for |text|. 200 // non-NULL, sets it to the "what you typed" entry for |text|.
195 void QueryForInputAndSetWYTMatch(const base::string16& text, 201 void QueryForInputAndSetWYTMatch(const base::string16& text,
196 AutocompleteMatch* wyt_match); 202 AutocompleteMatch* wyt_match);
197 203
204 // Calls QueryForInput(), sets the JSON responses for the default and keyword
205 // fetchers, and waits until the responses have been returned and the matches
206 // returned. Use empty responses for each fetcher that shouldn't be set up /
207 // configured.
208 void QueryForInputAndWaitForFetcherResponses(
209 const base::string16& text,
210 const bool prefer_keyword,
211 const std::string& default_fetcher_response,
212 const std::string& keyword_fetcher_response);
213
198 // Notifies the URLFetcher for the suggest query corresponding to the default 214 // Notifies the URLFetcher for the suggest query corresponding to the default
199 // search provider that it's done. 215 // search provider that it's done.
200 // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE. 216 // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE.
201 void FinishDefaultSuggestQuery(); 217 void FinishDefaultSuggestQuery();
202 218
203 // Runs SearchProvider on |input|, for which the suggest server replies 219 // Runs SearchProvider on |input|, for which the suggest server replies
204 // with |json|, and expects that the resulting matches' contents equals 220 // with |json|, and expects that the resulting matches' contents equals
205 // that in |matches|. An empty entry in |matches| means no match should 221 // that in |matches|. An empty entry in |matches| means no match should
206 // be returned in that position. Reports any errors with a message that 222 // be returned in that position. Reports any errors with a message that
207 // includes |error_description|. 223 // includes |error_description|.
208 void ForcedQueryTestHelper(const std::string& input, 224 void ForcedQueryTestHelper(const std::string& input,
209 const std::string& json, 225 const std::string& json,
210 const std::string matches[3], 226 const std::string matches[3],
211 const std::string& error_description); 227 const std::string& error_description);
212 228
229 // Verifies that |matches| and |expected_matches| agree on the first
230 // |num_expected_matches|, displaying an error message that includes
231 // |description| for any disagreement.
232 void CheckMatches(const std::string& description,
233 const size_t num_expected_matches,
234 const ExpectedMatch expected_matches[],
235 const ACMatches& matches);
236
213 void ResetFieldTrialList(); 237 void ResetFieldTrialList();
214 238
215 // Create a field trial, with ZeroSuggest activation based on |enabled|. 239 // Create a field trial, with ZeroSuggest activation based on |enabled|.
216 base::FieldTrial* CreateZeroSuggestFieldTrial(bool enabled); 240 base::FieldTrial* CreateZeroSuggestFieldTrial(bool enabled);
217 241
218 void ClearAllResults(); 242 void ClearAllResults();
219 243
220 // See description above class for details of these fields. 244 // See description above class for details of these fields.
221 TemplateURL* default_t_url_; 245 TemplateURL* default_t_url_;
222 const base::string16 term1_; 246 const base::string16 term1_;
(...skipping 14 matching lines...) Expand all
237 scoped_refptr<SearchProviderForTest> provider_; 261 scoped_refptr<SearchProviderForTest> provider_;
238 262
239 // If non-NULL, OnProviderUpdate quits the current |run_loop_|. 263 // If non-NULL, OnProviderUpdate quits the current |run_loop_|.
240 base::RunLoop* run_loop_; 264 base::RunLoop* run_loop_;
241 265
242 DISALLOW_COPY_AND_ASSIGN(SearchProviderTest); 266 DISALLOW_COPY_AND_ASSIGN(SearchProviderTest);
243 }; 267 };
244 268
245 // static 269 // static
246 const std::string SearchProviderTest::kNotApplicable = "Not Applicable"; 270 const std::string SearchProviderTest::kNotApplicable = "Not Applicable";
271 const SearchProviderTest::ExpectedMatch
272 SearchProviderTest::kEmptyExpectedMatch = { kNotApplicable, false };
247 273
248 void SearchProviderTest::SetUp() { 274 void SearchProviderTest::SetUp() {
249 // Make sure that fetchers are automatically ungregistered upon destruction. 275 // Make sure that fetchers are automatically ungregistered upon destruction.
250 test_factory_.set_remove_fetcher_on_delete(true); 276 test_factory_.set_remove_fetcher_on_delete(true);
251 277
252 // We need both the history service and template url model loaded. 278 // We need both the history service and template url model loaded.
253 ASSERT_TRUE(profile_.CreateHistoryService(true, false)); 279 ASSERT_TRUE(profile_.CreateHistoryService(true, false));
254 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 280 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
255 &profile_, &TemplateURLServiceFactory::BuildInstanceFor); 281 &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
256 282
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 bool prefer_keyword) { 337 bool prefer_keyword) {
312 ACMatches matches; 338 ACMatches matches;
313 for (int i = 0; i < num_cases; ++i) { 339 for (int i = 0; i < num_cases; ++i) {
314 AutocompleteInput input(cases[i].input, base::string16::npos, 340 AutocompleteInput input(cases[i].input, base::string16::npos,
315 base::string16(), GURL(), 341 base::string16(), GURL(),
316 metrics::OmniboxEventProto::INVALID_SPEC, false, 342 metrics::OmniboxEventProto::INVALID_SPEC, false,
317 prefer_keyword, true, true, 343 prefer_keyword, true, true,
318 ChromeAutocompleteSchemeClassifier(&profile_)); 344 ChromeAutocompleteSchemeClassifier(&profile_));
319 provider_->Start(input, false); 345 provider_->Start(input, false);
320 matches = provider_->matches(); 346 matches = provider_->matches();
321 base::string16 diagnostic_details = 347 SCOPED_TRACE(
322 ASCIIToUTF16("Input was: ") + 348 ASCIIToUTF16("Input was: ") +
323 cases[i].input + 349 cases[i].input +
324 ASCIIToUTF16("; prefer_keyword was: ") + 350 ASCIIToUTF16("; prefer_keyword was: ") +
325 (prefer_keyword ? ASCIIToUTF16("true") : ASCIIToUTF16("false")); 351 (prefer_keyword ? ASCIIToUTF16("true") : ASCIIToUTF16("false")));
326 EXPECT_EQ(cases[i].num_results, matches.size()) << diagnostic_details; 352 EXPECT_EQ(cases[i].num_results, matches.size());
327 if (matches.size() == cases[i].num_results) { 353 if (matches.size() == cases[i].num_results) {
328 for (size_t j = 0; j < cases[i].num_results; ++j) { 354 for (size_t j = 0; j < cases[i].num_results; ++j) {
329 EXPECT_EQ(cases[i].output[j].gurl, matches[j].destination_url) << 355 EXPECT_EQ(cases[i].output[j].gurl, matches[j].destination_url);
330 diagnostic_details; 356 EXPECT_EQ(cases[i].output[j].result_type, matches[j].type);
331 EXPECT_EQ(cases[i].output[j].result_type, matches[j].type) <<
332 diagnostic_details;
333 EXPECT_EQ(cases[i].output[j].fill_into_edit, 357 EXPECT_EQ(cases[i].output[j].fill_into_edit,
334 matches[j].fill_into_edit) << diagnostic_details; 358 matches[j].fill_into_edit);
335 EXPECT_EQ(cases[i].output[j].allowed_to_be_default_match, 359 EXPECT_EQ(cases[i].output[j].allowed_to_be_default_match,
336 matches[j].allowed_to_be_default_match) << diagnostic_details; 360 matches[j].allowed_to_be_default_match);
337 } 361 }
338 } 362 }
339 } 363 }
340 } 364 }
341 365
342 void SearchProviderTest::OnProviderUpdate(bool updated_matches) { 366 void SearchProviderTest::OnProviderUpdate(bool updated_matches) {
343 if (run_loop_ && provider_->done()) { 367 if (run_loop_ && provider_->done()) {
344 run_loop_->Quit(); 368 run_loop_->Quit();
345 run_loop_ = NULL; 369 run_loop_ = NULL;
346 } 370 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 ASSERT_GE(provider_->matches().size(), 1u); 405 ASSERT_GE(provider_->matches().size(), 1u);
382 EXPECT_TRUE(FindMatchWithDestination( 406 EXPECT_TRUE(FindMatchWithDestination(
383 GURL(default_t_url_->url_ref().ReplaceSearchTerms( 407 GURL(default_t_url_->url_ref().ReplaceSearchTerms(
384 TemplateURLRef::SearchTermsArgs(base::CollapseWhitespace( 408 TemplateURLRef::SearchTermsArgs(base::CollapseWhitespace(
385 text, false)), 409 text, false)),
386 TemplateURLServiceFactory::GetForProfile( 410 TemplateURLServiceFactory::GetForProfile(
387 &profile_)->search_terms_data())), 411 &profile_)->search_terms_data())),
388 wyt_match)); 412 wyt_match));
389 } 413 }
390 414
415 void SearchProviderTest::QueryForInputAndWaitForFetcherResponses(
416 const base::string16& text,
417 const bool prefer_keyword,
418 const std::string& default_fetcher_response,
419 const std::string& keyword_fetcher_response) {
420 QueryForInput(text, false, prefer_keyword);
421 if (!default_fetcher_response.empty()) {
422 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
423 SearchProvider::kDefaultProviderURLFetcherID);
424 ASSERT_TRUE(fetcher);
425 fetcher->set_response_code(200);
426 fetcher->SetResponseString(default_fetcher_response);
427 fetcher->delegate()->OnURLFetchComplete(fetcher);
428 }
429 if (!keyword_fetcher_response.empty()) {
430 net::TestURLFetcher* keyword_fetcher = test_factory_.GetFetcherByID(
431 SearchProvider::kKeywordProviderURLFetcherID);
432 ASSERT_TRUE(keyword_fetcher);
433 keyword_fetcher->set_response_code(200);
434 keyword_fetcher->SetResponseString(keyword_fetcher_response);
435 keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
436 }
437 RunTillProviderDone();
438 }
439
391 GURL SearchProviderTest::AddSearchToHistory(TemplateURL* t_url, 440 GURL SearchProviderTest::AddSearchToHistory(TemplateURL* t_url,
392 base::string16 term, 441 base::string16 term,
393 int visit_count) { 442 int visit_count) {
394 HistoryService* history = 443 HistoryService* history =
395 HistoryServiceFactory::GetForProfile(&profile_, 444 HistoryServiceFactory::GetForProfile(&profile_,
396 Profile::EXPLICIT_ACCESS); 445 Profile::EXPLICIT_ACCESS);
397 GURL search(t_url->url_ref().ReplaceSearchTerms( 446 GURL search(t_url->url_ref().ReplaceSearchTerms(
398 TemplateURLRef::SearchTermsArgs(term), 447 TemplateURLRef::SearchTermsArgs(term),
399 TemplateURLServiceFactory::GetForProfile( 448 TemplateURLServiceFactory::GetForProfile(
400 &profile_)->search_terms_data())); 449 &profile_)->search_terms_data()));
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 // Tell the SearchProvider the default suggest query is done. 489 // Tell the SearchProvider the default suggest query is done.
441 default_fetcher->set_response_code(200); 490 default_fetcher->set_response_code(200);
442 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher); 491 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
443 } 492 }
444 493
445 void SearchProviderTest::ForcedQueryTestHelper( 494 void SearchProviderTest::ForcedQueryTestHelper(
446 const std::string& input, 495 const std::string& input,
447 const std::string& json, 496 const std::string& json,
448 const std::string expected_matches[3], 497 const std::string expected_matches[3],
449 const std::string& error_description) { 498 const std::string& error_description) {
450 QueryForInput(ASCIIToUTF16(input), false, false); 499 // Send the query twice in order to have a synchronous pass after the first
451 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID( 500 // response is received. This is necessary because SearchProvider doesn't
452 SearchProvider::kDefaultProviderURLFetcherID); 501 // allow an asynchronous response to change the default match.
453 ASSERT_TRUE(fetcher); 502 for (size_t i = 0; i < 2; ++i) {
454 fetcher->set_response_code(200); 503 QueryForInputAndWaitForFetcherResponses(
455 fetcher->SetResponseString(json); 504 ASCIIToUTF16(input), false, json, std::string());
456 fetcher->delegate()->OnURLFetchComplete(fetcher); 505 }
457 RunTillProviderDone();
458 506
459 const ACMatches& matches = provider_->matches(); 507 const ACMatches& matches = provider_->matches();
460 ASSERT_LE(matches.size(), 3u); 508 ASSERT_LE(matches.size(), 3u);
461 size_t i = 0; 509 size_t i = 0;
462 // Ensure that the returned matches equal the expectations. 510 // Ensure that the returned matches equal the expectations.
463 for (; i < matches.size(); ++i) { 511 for (; i < matches.size(); ++i) {
464 EXPECT_EQ(ASCIIToUTF16(expected_matches[i]), matches[i].contents) << 512 EXPECT_EQ(ASCIIToUTF16(expected_matches[i]), matches[i].contents) <<
465 error_description; 513 error_description;
466 } 514 }
467 // Ensure that no expected matches are missing. 515 // Ensure that no expected matches are missing.
468 for (; i < 3u; ++i) { 516 for (; i < 3u; ++i) {
469 EXPECT_EQ(std::string(), expected_matches[i]) << 517 EXPECT_EQ(std::string(), expected_matches[i]) <<
470 "Case #" << i << ": " << error_description; 518 "Case #" << i << ": " << error_description;
471 } 519 }
472 } 520 }
473 521
522 void SearchProviderTest::CheckMatches(const std::string& description,
523 const size_t num_expected_matches,
524 const ExpectedMatch expected_matches[],
525 const ACMatches& matches) {
526 ASSERT_FALSE(matches.empty());
527 ASSERT_LE(matches.size(), num_expected_matches);
528 size_t i = 0;
529 SCOPED_TRACE(description);
530 // Ensure that the returned matches equal the expectations.
531 for (; i < matches.size(); ++i) {
532 SCOPED_TRACE(" Case # " + base::IntToString(i));
533 EXPECT_EQ(ASCIIToUTF16(expected_matches[i].contents), matches[i].contents);
534 EXPECT_EQ(expected_matches[i].allowed_to_be_default_match,
535 matches[i].allowed_to_be_default_match);
536 }
537 // Ensure that no expected matches are missing.
538 for (; i < num_expected_matches; ++i) {
539 SCOPED_TRACE(" Case # " + base::IntToString(i));
540 EXPECT_EQ(kNotApplicable, expected_matches[i].contents);
541 }
542 }
543
474 void SearchProviderTest::ResetFieldTrialList() { 544 void SearchProviderTest::ResetFieldTrialList() {
475 // Destroy the existing FieldTrialList before creating a new one to avoid 545 // Destroy the existing FieldTrialList before creating a new one to avoid
476 // a DCHECK. 546 // a DCHECK.
477 field_trial_list_.reset(); 547 field_trial_list_.reset();
478 field_trial_list_.reset(new base::FieldTrialList( 548 field_trial_list_.reset(new base::FieldTrialList(
479 new metrics::SHA1EntropyProvider("foo"))); 549 new metrics::SHA1EntropyProvider("foo")));
480 variations::testing::ClearAllVariationParams(); 550 variations::testing::ClearAllVariationParams();
481 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial( 551 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
482 "AutocompleteDynamicTrial_0", "DefaultGroup"); 552 "AutocompleteDynamicTrial_0", "DefaultGroup");
483 trial->group(); 553 trial->group();
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 ASCIIToUTF16("k a")) } }, 1175 ASCIIToUTF16("k a")) } },
1106 }; 1176 };
1107 1177
1108 RunTest(cases, arraysize(cases), false); 1178 RunTest(cases, arraysize(cases), false);
1109 } 1179 }
1110 1180
1111 // Verifies Navsuggest results don't set a TemplateURL, which Instant relies on. 1181 // Verifies Navsuggest results don't set a TemplateURL, which Instant relies on.
1112 // Also verifies that just the *first* navigational result is listed as a match 1182 // Also verifies that just the *first* navigational result is listed as a match
1113 // if suggested relevance scores were not sent. 1183 // if suggested relevance scores were not sent.
1114 TEST_F(SearchProviderTest, NavSuggestNoSuggestedRelevanceScores) { 1184 TEST_F(SearchProviderTest, NavSuggestNoSuggestedRelevanceScores) {
1115 QueryForInput(ASCIIToUTF16("a.c"), false, false); 1185 QueryForInputAndWaitForFetcherResponses(
1116 1186 ASCIIToUTF16("a.c"), false,
1117 // Make sure the default providers suggest service was queried.
1118 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
1119 SearchProvider::kDefaultProviderURLFetcherID);
1120 ASSERT_TRUE(fetcher);
1121
1122 // Tell the SearchProvider the suggest query is done.
1123 fetcher->set_response_code(200);
1124 fetcher->SetResponseString(
1125 "[\"a.c\",[\"a.com\", \"a.com/b\"],[\"a\", \"b\"],[]," 1187 "[\"a.c\",[\"a.com\", \"a.com/b\"],[\"a\", \"b\"],[],"
1126 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]"); 1188 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
1127 fetcher->delegate()->OnURLFetchComplete(fetcher); 1189 std::string());
1128 fetcher = NULL;
1129
1130 // Run till the history results complete.
1131 RunTillProviderDone();
1132 1190
1133 // Make sure the only match is 'a.com' and it doesn't have a template_url. 1191 // Make sure the only match is 'a.com' and it doesn't have a template_url.
1134 AutocompleteMatch nav_match; 1192 AutocompleteMatch nav_match;
1135 EXPECT_TRUE(FindMatchWithDestination(GURL("http://a.com"), &nav_match)); 1193 EXPECT_TRUE(FindMatchWithDestination(GURL("http://a.com"), &nav_match));
1136 EXPECT_TRUE(nav_match.keyword.empty()); 1194 EXPECT_TRUE(nav_match.keyword.empty());
1137 EXPECT_TRUE(nav_match.allowed_to_be_default_match); 1195 EXPECT_FALSE(nav_match.allowed_to_be_default_match);
1138 EXPECT_FALSE(FindMatchWithDestination(GURL("http://a.com/b"), &nav_match)); 1196 EXPECT_FALSE(FindMatchWithDestination(GURL("http://a.com/b"), &nav_match));
1139 } 1197 }
1140 1198
1141 // Verifies that the most relevant suggest results are added properly. 1199 // Verifies that the most relevant suggest results are added properly.
1142 TEST_F(SearchProviderTest, SuggestRelevance) { 1200 TEST_F(SearchProviderTest, SuggestRelevance) {
1143 QueryForInput(ASCIIToUTF16("a"), false, false); 1201 QueryForInputAndWaitForFetcherResponses(
1144 1202 ASCIIToUTF16("a"), false, "[\"a\",[\"a1\", \"a2\", \"a3\", \"a4\"]]",
1145 // Make sure the default provider's suggest service was queried. 1203 std::string());
1146 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
1147 SearchProvider::kDefaultProviderURLFetcherID);
1148 ASSERT_TRUE(fetcher);
1149
1150 // Tell the SearchProvider the suggest query is done.
1151 fetcher->set_response_code(200);
1152 fetcher->SetResponseString("[\"a\",[\"a1\", \"a2\", \"a3\", \"a4\"]]");
1153 fetcher->delegate()->OnURLFetchComplete(fetcher);
1154 fetcher = NULL;
1155
1156 // Run till the history results complete.
1157 RunTillProviderDone();
1158 1204
1159 // Check the expected verbatim and (first 3) suggestions' relative relevances. 1205 // Check the expected verbatim and (first 3) suggestions' relative relevances.
1160 AutocompleteMatch verbatim, match_a1, match_a2, match_a3, match_a4; 1206 AutocompleteMatch verbatim, match_a1, match_a2, match_a3, match_a4;
1161 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a"), &verbatim)); 1207 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a"), &verbatim));
1162 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a1"), &match_a1)); 1208 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a1"), &match_a1));
1163 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a2"), &match_a2)); 1209 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a2"), &match_a2));
1164 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a3"), &match_a3)); 1210 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a3"), &match_a3));
1165 EXPECT_FALSE(FindMatchWithContents(ASCIIToUTF16("a4"), &match_a4)); 1211 EXPECT_FALSE(FindMatchWithContents(ASCIIToUTF16("a4"), &match_a4));
1166 EXPECT_GT(verbatim.relevance, match_a1.relevance); 1212 EXPECT_GT(verbatim.relevance, match_a1.relevance);
1167 EXPECT_GT(match_a1.relevance, match_a2.relevance); 1213 EXPECT_GT(match_a1.relevance, match_a2.relevance);
1168 EXPECT_GT(match_a2.relevance, match_a3.relevance); 1214 EXPECT_GT(match_a2.relevance, match_a3.relevance);
1169 EXPECT_TRUE(verbatim.allowed_to_be_default_match); 1215 EXPECT_TRUE(verbatim.allowed_to_be_default_match);
1170 EXPECT_TRUE(match_a1.allowed_to_be_default_match); 1216 EXPECT_FALSE(match_a1.allowed_to_be_default_match);
1171 EXPECT_TRUE(match_a2.allowed_to_be_default_match); 1217 EXPECT_FALSE(match_a2.allowed_to_be_default_match);
1172 EXPECT_TRUE(match_a3.allowed_to_be_default_match); 1218 EXPECT_FALSE(match_a3.allowed_to_be_default_match);
1173 } 1219 }
1174 1220
1175 // Verifies that the default provider abandons suggested relevance scores 1221 // Verifies that the default provider abandons suggested relevance scores
1176 // when in keyword mode. This should happen regardless of whether the 1222 // when in keyword mode. This should happen regardless of whether the
1177 // keyword provider returns suggested relevance scores. 1223 // keyword provider returns suggested relevance scores.
1178 TEST_F(SearchProviderTest, DefaultProviderNoSuggestRelevanceInKeywordMode) { 1224 TEST_F(SearchProviderTest, DefaultProviderNoSuggestRelevanceInKeywordMode) {
1179 struct { 1225 struct {
1180 const std::string default_provider_json; 1226 const std::string default_provider_json;
1181 const std::string keyword_provider_json; 1227 const std::string keyword_provider_json;
1182 const std::string matches[5]; 1228 const std::string matches[5];
(...skipping 11 matching lines...) Expand all
1194 { "[\"k a\",[\"k adefault-query\", \"adefault.com\"],[],[]," 1240 { "[\"k a\",[\"k adefault-query\", \"adefault.com\"],[],[],"
1195 "{\"google:verbatimrelevance\":9700," 1241 "{\"google:verbatimrelevance\":9700,"
1196 "\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"]," 1242 "\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
1197 "\"google:suggestrelevance\":[9900, 9800]}]", 1243 "\"google:suggestrelevance\":[9900, 9800]}]",
1198 "[\"a\",[\"akeyword-query\"],[],[],{\"google:suggesttype\":[\"QUERY\"]," 1244 "[\"a\",[\"akeyword-query\"],[],[],{\"google:suggesttype\":[\"QUERY\"],"
1199 "\"google:verbatimrelevance\":9500," 1245 "\"google:verbatimrelevance\":9500,"
1200 "\"google:suggestrelevance\":[9600]}]", 1246 "\"google:suggestrelevance\":[9600]}]",
1201 { "akeyword-query", "a", "k a", "adefault.com", "k adefault-query" } } 1247 { "akeyword-query", "a", "k a", "adefault.com", "k adefault-query" } }
1202 }; 1248 };
1203 1249
1204 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 1250 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
1205 QueryForInput(ASCIIToUTF16("k a"), false, true); 1251 // Send the query twice in order to have a synchronous pass after the first
1206 net::TestURLFetcher* default_fetcher = 1252 // response is received. This is necessary because SearchProvider doesn't
1207 test_factory_.GetFetcherByID( 1253 // allow an asynchronous response to change the default match.
1208 SearchProvider::kDefaultProviderURLFetcherID); 1254 for (size_t j = 0; j < 2; ++j) {
1209 ASSERT_TRUE(default_fetcher); 1255 QueryForInputAndWaitForFetcherResponses(
1210 default_fetcher->set_response_code(200); 1256 ASCIIToUTF16("k a"), true, cases[i].default_provider_json,
1211 default_fetcher->SetResponseString(cases[i].default_provider_json); 1257 cases[i].keyword_provider_json);
1212 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher); 1258 }
1213 net::TestURLFetcher* keyword_fetcher =
1214 test_factory_.GetFetcherByID(
1215 SearchProvider::kKeywordProviderURLFetcherID);
1216 ASSERT_TRUE(keyword_fetcher);
1217 keyword_fetcher->set_response_code(200);
1218 keyword_fetcher->SetResponseString(cases[i].keyword_provider_json);
1219 keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
1220 RunTillProviderDone();
1221 1259
1222 const std::string description = "for input with default_provider_json=" + 1260 SCOPED_TRACE(
1261 "for input with default_provider_json=" +
1223 cases[i].default_provider_json + " and keyword_provider_json=" + 1262 cases[i].default_provider_json + " and keyword_provider_json=" +
1224 cases[i].keyword_provider_json; 1263 cases[i].keyword_provider_json);
1225 const ACMatches& matches = provider_->matches(); 1264 const ACMatches& matches = provider_->matches();
1226 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches)); 1265 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
1227 size_t j = 0; 1266 size_t j = 0;
1228 // Ensure that the returned matches equal the expectations. 1267 // Ensure that the returned matches equal the expectations.
1229 for (; j < matches.size(); ++j) { 1268 for (; j < matches.size(); ++j)
1230 EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j]), matches[j].contents) << 1269 EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j]), matches[j].contents);
1231 description;
1232 }
1233 // Ensure that no expected matches are missing. 1270 // Ensure that no expected matches are missing.
1234 for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j) 1271 for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
1235 EXPECT_EQ(std::string(), cases[i].matches[j]) << description; 1272 EXPECT_EQ(std::string(), cases[i].matches[j]);
1236 } 1273 }
1237 } 1274 }
1238 1275
1239 // Verifies that suggest results with relevance scores are added 1276 // Verifies that suggest results with relevance scores are added
1240 // properly when using the default fetcher. When adding a new test 1277 // properly when using the default fetcher. When adding a new test
1241 // case to this test, please consider adding it to the tests in 1278 // case to this test, please consider adding it to the tests in
1242 // KeywordFetcherSuggestRelevance below. 1279 // KeywordFetcherSuggestRelevance below.
1243 TEST_F(SearchProviderTest, DefaultFetcherSuggestRelevance) { 1280 TEST_F(SearchProviderTest, DefaultFetcherSuggestRelevance) {
1244 struct DefaultFetcherMatch {
1245 std::string contents;
1246 bool allowed_to_be_default_match;
1247 };
1248 const DefaultFetcherMatch kEmptyMatch = { kNotApplicable, false };
1249 struct { 1281 struct {
1250 const std::string json; 1282 const std::string json;
1251 const DefaultFetcherMatch matches[6]; 1283 const ExpectedMatch matches[6];
1252 const std::string inline_autocompletion; 1284 const std::string inline_autocompletion;
1253 } cases[] = { 1285 } cases[] = {
1254 // Ensure that suggestrelevance scores reorder matches. 1286 // Ensure that suggestrelevance scores reorder matches.
1255 { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]", 1287 { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
1256 { { "a", true }, { "c", false }, { "b", false }, kEmptyMatch, kEmptyMatch, 1288 { { "a", true }, { "c", false }, { "b", false }, kEmptyExpectedMatch,
1257 kEmptyMatch }, 1289 kEmptyExpectedMatch, kEmptyExpectedMatch },
1258 std::string() }, 1290 std::string() },
1259 { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[]," 1291 { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
1260 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1292 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1261 "\"google:suggestrelevance\":[1, 2]}]", 1293 "\"google:suggestrelevance\":[1, 2]}]",
1262 { { "a", true }, { "c.com", false }, { "b.com", false }, kEmptyMatch, 1294 { { "a", true }, { "c.com", false }, { "b.com", false },
1263 kEmptyMatch, kEmptyMatch }, 1295 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1264 std::string() }, 1296 std::string() },
1265 1297
1266 // Without suggested relevance scores, we should only allow one 1298 // Without suggested relevance scores, we should only allow one
1267 // navsuggest result to be be displayed. 1299 // navsuggest result to be be displayed.
1268 { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[]," 1300 { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
1269 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]", 1301 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
1270 { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch, 1302 { { "a", true }, { "b.com", false }, kEmptyExpectedMatch,
1271 kEmptyMatch, kEmptyMatch }, 1303 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1272 std::string() }, 1304 std::string() },
1273 1305
1274 // Ensure that verbatimrelevance scores reorder or suppress verbatim. 1306 // Ensure that verbatimrelevance scores reorder or suppress verbatim.
1275 // Negative values will have no effect; the calculated value will be used. 1307 // Negative values will have no effect; the calculated value will be used.
1276 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999," 1308 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
1277 "\"google:suggestrelevance\":[9998]}]", 1309 "\"google:suggestrelevance\":[9998]}]",
1278 { { "a", true}, { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1310 { { "a", true}, { "a1", false }, kEmptyExpectedMatch,
1279 kEmptyMatch }, 1311 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1280 std::string() }, 1312 std::string() },
1281 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998," 1313 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
1282 "\"google:suggestrelevance\":[9999]}]", 1314 "\"google:suggestrelevance\":[9999]}]",
1283 { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1315 { { "a1", true }, { "a", true }, kEmptyExpectedMatch,
1284 kEmptyMatch }, 1316 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1285 "1" }, 1317 "1" },
1286 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0," 1318 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0,"
1287 "\"google:suggestrelevance\":[9999]}]", 1319 "\"google:suggestrelevance\":[9999]}]",
1288 { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1320 { { "a1", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1289 kEmptyMatch }, 1321 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1290 "1" }, 1322 "1" },
1291 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1," 1323 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1,"
1292 "\"google:suggestrelevance\":[9999]}]", 1324 "\"google:suggestrelevance\":[9999]}]",
1293 { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1325 { { "a1", true }, { "a", true }, kEmptyExpectedMatch,
1294 kEmptyMatch }, 1326 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1295 "1" }, 1327 "1" },
1296 { "[\"a\",[\"http://a.com\"],[],[]," 1328 { "[\"a\",[\"http://a.com\"],[],[],"
1297 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1329 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1298 "\"google:verbatimrelevance\":9999," 1330 "\"google:verbatimrelevance\":9999,"
1299 "\"google:suggestrelevance\":[9998]}]", 1331 "\"google:suggestrelevance\":[9998]}]",
1300 { { "a", true }, { "a.com", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1332 { { "a", true }, { "a.com", false }, kEmptyExpectedMatch,
1301 kEmptyMatch }, 1333 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1302 std::string() }, 1334 std::string() },
1303 { "[\"a\",[\"http://a.com\"],[],[]," 1335 { "[\"a\",[\"http://a.com\"],[],[],"
1304 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1336 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1305 "\"google:verbatimrelevance\":9998," 1337 "\"google:verbatimrelevance\":9998,"
1306 "\"google:suggestrelevance\":[9999]}]", 1338 "\"google:suggestrelevance\":[9999]}]",
1307 { { "a.com", true }, { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1339 { { "a.com", true }, { "a", true }, kEmptyExpectedMatch,
1308 kEmptyMatch }, 1340 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1309 ".com" }, 1341 ".com" },
1310 { "[\"a\",[\"http://a.com\"],[],[]," 1342 { "[\"a\",[\"http://a.com\"],[],[],"
1311 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1343 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1312 "\"google:verbatimrelevance\":0," 1344 "\"google:verbatimrelevance\":0,"
1313 "\"google:suggestrelevance\":[9999]}]", 1345 "\"google:suggestrelevance\":[9999]}]",
1314 { { "a.com", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1346 { { "a.com", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1315 kEmptyMatch }, 1347 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1316 ".com" }, 1348 ".com" },
1317 { "[\"a\",[\"http://a.com\"],[],[]," 1349 { "[\"a\",[\"http://a.com\"],[],[],"
1318 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1350 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1319 "\"google:verbatimrelevance\":-1," 1351 "\"google:verbatimrelevance\":-1,"
1320 "\"google:suggestrelevance\":[9999]}]", 1352 "\"google:suggestrelevance\":[9999]}]",
1321 { { "a.com", true }, { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1353 { { "a.com", true }, { "a", true }, kEmptyExpectedMatch,
1322 kEmptyMatch }, 1354 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1323 ".com" }, 1355 ".com" },
1324 1356
1325 // Ensure that both types of relevance scores reorder matches together. 1357 // Ensure that both types of relevance scores reorder matches together.
1326 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997]," 1358 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
1327 "\"google:verbatimrelevance\":9998}]", 1359 "\"google:verbatimrelevance\":9998}]",
1328 { { "a1", true }, { "a", true }, { "a2", true }, kEmptyMatch, kEmptyMatch, 1360 { { "a1", true }, { "a", true }, { "a2", false }, kEmptyExpectedMatch,
1329 kEmptyMatch }, 1361 kEmptyExpectedMatch, kEmptyExpectedMatch },
1330 "1" }, 1362 "1" },
1331 1363
1332 // Allow non-inlineable matches to be the highest-scoring match but, 1364 // Check that an inlineable result appears first regardless of its score.
1333 // if the result set lacks a single inlineable result, abandon suggested 1365 // Also, if the result set lacks a single inlineable result, abandon the
1334 // relevance scores entirely. 1366 // request to suppress verbatim (verbatim_relevance=0), which will then
1367 // cause verbatim to appear (first).
1335 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]", 1368 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
1336 { { "b", false }, { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1369 { { "a", true }, { "b", false }, kEmptyExpectedMatch,
1337 kEmptyMatch }, 1370 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1338 std::string() }, 1371 std::string() },
1339 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]," 1372 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
1340 "\"google:verbatimrelevance\":0}]", 1373 "\"google:verbatimrelevance\":0}]",
1341 { { "a", true }, { "b", false }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1374 { { "a", true }, { "b", false }, kEmptyExpectedMatch,
1342 kEmptyMatch }, 1375 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1343 std::string() }, 1376 std::string() },
1344 { "[\"a\",[\"http://b.com\"],[],[]," 1377 { "[\"a\",[\"http://b.com\"],[],[],"
1345 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1378 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1346 "\"google:suggestrelevance\":[9999]}]", 1379 "\"google:suggestrelevance\":[9999]}]",
1347 { { "b.com", false }, { "a", true }, kEmptyMatch, kEmptyMatch, 1380 { { "a", true }, { "b.com", false }, kEmptyExpectedMatch,
1348 kEmptyMatch, kEmptyMatch }, 1381 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1349 std::string() }, 1382 std::string() },
1350 { "[\"a\",[\"http://b.com\"],[],[]," 1383 { "[\"a\",[\"http://b.com\"],[],[],"
1351 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1384 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1352 "\"google:suggestrelevance\":[9999]," 1385 "\"google:suggestrelevance\":[9999],"
1353 "\"google:verbatimrelevance\":0}]", 1386 "\"google:verbatimrelevance\":0}]",
1354 { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch, 1387 { { "a", true }, { "b.com", false }, kEmptyExpectedMatch,
1355 kEmptyMatch, kEmptyMatch }, 1388 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1356 std::string() }, 1389 std::string() },
1357 1390
1358 // Allow low-scoring matches. 1391 // Allow low-scoring matches.
1359 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]", 1392 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
1360 { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1393 { { "a1", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1361 kEmptyMatch }, 1394 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1362 "1" }, 1395 "1" },
1363 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]", 1396 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":10}]",
1364 { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1397 { { "a1", true }, { "a", true }, kEmptyExpectedMatch,
1365 kEmptyMatch }, 1398 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1366 "1" }, 1399 "1" },
1367 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1]," 1400 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[10],"
1368 "\"google:verbatimrelevance\":0}]", 1401 "\"google:verbatimrelevance\":0}]",
1369 { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1402 { { "a1", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1370 kEmptyMatch }, 1403 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1371 "1" }, 1404 "1" },
1372 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2]," 1405 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[10, 20],"
1373 "\"google:verbatimrelevance\":0}]", 1406 "\"google:verbatimrelevance\":0}]",
1374 { { "a2", true }, { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1407 { { "a2", true }, { "a1", false }, kEmptyExpectedMatch,
1375 kEmptyMatch }, 1408 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1376 "2" }, 1409 "2" },
1377 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3]," 1410 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[10, 30],"
1378 "\"google:verbatimrelevance\":2}]", 1411 "\"google:verbatimrelevance\":20}]",
1379 { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch, 1412 { { "a2", true }, { "a", true }, { "a1", false }, kEmptyExpectedMatch,
1380 kEmptyMatch }, 1413 kEmptyExpectedMatch, kEmptyExpectedMatch },
1381 "2" }, 1414 "2" },
1382 { "[\"a\",[\"http://a.com\"],[],[]," 1415 { "[\"a\",[\"http://a.com\"],[],[],"
1383 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1416 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1384 "\"google:suggestrelevance\":[1]," 1417 "\"google:suggestrelevance\":[10],"
1385 "\"google:verbatimrelevance\":0}]", 1418 "\"google:verbatimrelevance\":0}]",
1386 { { "a.com", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1419 { { "a.com", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1387 kEmptyMatch }, 1420 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1388 ".com" }, 1421 ".com" },
1389 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1422 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1390 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1423 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1391 "\"google:suggestrelevance\":[1, 2]," 1424 "\"google:suggestrelevance\":[10, 20],"
1392 "\"google:verbatimrelevance\":0}]", 1425 "\"google:verbatimrelevance\":0}]",
1393 { { "a2.com", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch, 1426 { { "a2.com", true }, { "a1.com", false }, kEmptyExpectedMatch,
1394 kEmptyMatch, kEmptyMatch }, 1427 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1395 "2.com" }, 1428 "2.com" },
1396 1429
1397 // Ensure that all suggestions are considered, regardless of order. 1430 // Ensure that all suggestions are considered, regardless of order.
1398 { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[]," 1431 { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
1399 "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]", 1432 "{\"google:suggestrelevance\":[10, 20, 30, 40, 50, 60, 70]}]",
1400 { { "a", true }, { "h", false }, { "g", false }, { "f", false }, 1433 { { "a", true }, { "h", false }, { "g", false }, { "f", false },
1401 { "e", false }, { "d", false } }, 1434 { "e", false }, { "d", false } },
1402 std::string() }, 1435 std::string() },
1403 { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\"," 1436 { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
1404 "\"http://e.com\", \"http://f.com\", \"http://g.com\"," 1437 "\"http://e.com\", \"http://f.com\", \"http://g.com\","
1405 "\"http://h.com\"],[],[]," 1438 "\"http://h.com\"],[],[],"
1406 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"," 1439 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
1407 "\"NAVIGATION\", \"NAVIGATION\"," 1440 "\"NAVIGATION\", \"NAVIGATION\","
1408 "\"NAVIGATION\", \"NAVIGATION\"," 1441 "\"NAVIGATION\", \"NAVIGATION\","
1409 "\"NAVIGATION\"]," 1442 "\"NAVIGATION\"],"
1410 "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]", 1443 "\"google:suggestrelevance\":[10, 20, 30, 40, 50, 60, 70]}]",
1411 { { "a", true }, { "h.com", false }, { "g.com", false }, 1444 { { "a", true }, { "h.com", false }, { "g.com", false },
1412 { "f.com", false }, { "e.com", false }, { "d.com", false } }, 1445 { "f.com", false }, { "e.com", false }, { "d.com", false } },
1413 std::string() }, 1446 std::string() },
1414 1447
1415 // Ensure that incorrectly sized suggestion relevance lists are ignored. 1448 // Ensure that incorrectly sized suggestion relevance lists are ignored.
1416 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]", 1449 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[10]}]",
1417 { { "a", true }, { "a1", true }, { "a2", true }, kEmptyMatch, kEmptyMatch, 1450 { { "a", true }, { "a1", false }, { "a2", false }, kEmptyExpectedMatch,
1418 kEmptyMatch }, 1451 kEmptyExpectedMatch, kEmptyExpectedMatch },
1419 std::string() }, 1452 std::string() },
1420 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]", 1453 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 10]}]",
1421 { { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1454 { { "a", true }, { "a1", false }, kEmptyExpectedMatch,
1422 kEmptyMatch }, 1455 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1423 std::string() }, 1456 std::string() },
1424 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1457 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1425 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1458 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1426 "\"google:suggestrelevance\":[1]}]", 1459 "\"google:suggestrelevance\":[10]}]",
1427 { { "a", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch, 1460 { { "a", true }, { "a1.com", false }, kEmptyExpectedMatch,
1428 kEmptyMatch, kEmptyMatch }, 1461 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1429 std::string() }, 1462 std::string() },
1430 { "[\"a\",[\"http://a1.com\"],[],[]," 1463 { "[\"a\",[\"http://a1.com\"],[],[],"
1431 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1464 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1432 "\"google:suggestrelevance\":[9999, 1]}]", 1465 "\"google:suggestrelevance\":[9999, 10]}]",
1433 { { "a", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch, 1466 { { "a", true }, { "a1.com", false }, kEmptyExpectedMatch,
1434 kEmptyMatch, kEmptyMatch }, 1467 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1435 std::string() }, 1468 std::string() },
1436 1469
1437 // Ensure that all 'verbatim' results are merged with their maximum score. 1470 // Ensure that all 'verbatim' results are merged with their maximum score.
1438 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[]," 1471 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
1439 "{\"google:suggestrelevance\":[9998, 9997, 9999]}]", 1472 "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1440 { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch, 1473 { { "a2", true }, { "a", true }, { "a1", false }, kEmptyExpectedMatch,
1441 kEmptyMatch }, 1474 kEmptyExpectedMatch, kEmptyExpectedMatch },
1442 "2" }, 1475 "2" },
1443 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[]," 1476 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
1444 "{\"google:suggestrelevance\":[9998, 9997, 9999]," 1477 "{\"google:suggestrelevance\":[9998, 9997, 9999],"
1445 "\"google:verbatimrelevance\":0}]", 1478 "\"google:verbatimrelevance\":0}]",
1446 { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch, 1479 { { "a2", true }, { "a", true }, { "a1", false }, kEmptyExpectedMatch,
1447 kEmptyMatch }, 1480 kEmptyExpectedMatch, kEmptyExpectedMatch },
1448 "2" }, 1481 "2" },
1449 1482
1450 // Ensure that verbatim is always generated without other suggestions. 1483 // Ensure that verbatim is always generated without other suggestions.
1451 // TODO(msw): Ensure verbatimrelevance is respected (except suppression). 1484 // TODO(msw): Ensure verbatimrelevance is respected (except suppression).
1452 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]", 1485 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
1453 { { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1486 { { "a", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1454 kEmptyMatch }, 1487 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1455 std::string() }, 1488 std::string() },
1456 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]", 1489 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
1457 { { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch, 1490 { { "a", true }, kEmptyExpectedMatch, kEmptyExpectedMatch,
1458 kEmptyMatch }, 1491 kEmptyExpectedMatch, kEmptyExpectedMatch, kEmptyExpectedMatch },
1459 std::string() }, 1492 std::string() },
1460 }; 1493 };
1461 1494
1462 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 1495 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
1463 QueryForInput(ASCIIToUTF16("a"), false, false); 1496 // Send the query twice in order to have a synchronous pass after the first
1464 net::TestURLFetcher* fetcher = 1497 // response is received. This is necessary because SearchProvider doesn't
1465 test_factory_.GetFetcherByID( 1498 // allow an asynchronous response to change the default match.
1466 SearchProvider::kDefaultProviderURLFetcherID); 1499 for (size_t j = 0; j < 2; ++j) {
1467 ASSERT_TRUE(fetcher); 1500 QueryForInputAndWaitForFetcherResponses(
1468 fetcher->set_response_code(200); 1501 ASCIIToUTF16("a"), false, cases[i].json, std::string());
1469 fetcher->SetResponseString(cases[i].json); 1502 }
1470 fetcher->delegate()->OnURLFetchComplete(fetcher);
1471 RunTillProviderDone();
1472 1503
1473 const std::string description = "for input with json=" + cases[i].json; 1504 const std::string description = "for input with json=" + cases[i].json;
1474 const ACMatches& matches = provider_->matches(); 1505 CheckMatches(description, ARRAYSIZE_UNSAFE(cases[i].matches),
1475 ASSERT_FALSE(matches.empty()); 1506 cases[i].matches, provider_->matches());
1476 // Find the first match that's allowed to be the default match and check
1477 // its inline_autocompletion.
1478 ACMatches::const_iterator it = FindDefaultMatch(matches);
1479 ASSERT_NE(matches.end(), it);
1480 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
1481 it->inline_autocompletion) << description;
1482
1483 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
1484 size_t j = 0;
1485 // Ensure that the returned matches equal the expectations.
1486 for (; j < matches.size(); ++j) {
1487 EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents),
1488 matches[j].contents) << description;
1489 EXPECT_EQ(cases[i].matches[j].allowed_to_be_default_match,
1490 matches[j].allowed_to_be_default_match) << description;
1491 }
1492 // Ensure that no expected matches are missing.
1493 for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
1494 EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents) <<
1495 "Case # " << i << " " << description;
1496 } 1507 }
1497 } 1508 }
1498 1509
1499 // Verifies that suggest results with relevance scores are added 1510 // Verifies that suggest results with relevance scores are added
1500 // properly when using the keyword fetcher. This is similar to the 1511 // properly when using the keyword fetcher. This is similar to the
1501 // test DefaultFetcherSuggestRelevance above but this uses inputs that 1512 // test DefaultFetcherSuggestRelevance above but this uses inputs that
1502 // trigger keyword suggestions (i.e., "k a" rather than "a") and has 1513 // trigger keyword suggestions (i.e., "k a" rather than "a") and has
1503 // different expectations (because now the results are a mix of 1514 // different expectations (because now the results are a mix of
1504 // keyword suggestions and default provider suggestions). When a new 1515 // keyword suggestions and default provider suggestions). When a new
1505 // test is added to this TEST_F, please consider if it would be 1516 // test is added to this TEST_F, please consider if it would be
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1551 { "b.com", false, false }, 1562 { "b.com", false, false },
1552 { "k a", false, false }, 1563 { "k a", false, false },
1553 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1564 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1554 std::string() }, 1565 std::string() },
1555 1566
1556 // Ensure that verbatimrelevance scores reorder or suppress verbatim. 1567 // Ensure that verbatimrelevance scores reorder or suppress verbatim.
1557 // Negative values will have no effect; the calculated value will be used. 1568 // Negative values will have no effect; the calculated value will be used.
1558 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999," 1569 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
1559 "\"google:suggestrelevance\":[9998]}]", 1570 "\"google:suggestrelevance\":[9998]}]",
1560 { { "a", true, true }, 1571 { { "a", true, true },
1561 { "a1", true, true }, 1572 { "a1", true, false },
1562 { "k a", false, false }, 1573 { "k a", false, false },
1563 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1574 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1564 std::string() }, 1575 std::string() },
1565 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998," 1576 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
1566 "\"google:suggestrelevance\":[9999]}]", 1577 "\"google:suggestrelevance\":[9999]}]",
1567 { { "a1", true, true }, 1578 { { "a1", true, true },
1568 { "a", true, true }, 1579 { "a", true, true },
1569 { "k a", false, false }, 1580 { "k a", false, false },
1570 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1581 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1571 "1" }, 1582 "1" },
(...skipping 18 matching lines...) Expand all
1590 { "a.com", false, false }, 1601 { "a.com", false, false },
1591 { "k a", false, false }, 1602 { "k a", false, false },
1592 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1603 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1593 std::string() }, 1604 std::string() },
1594 1605
1595 // Ensure that both types of relevance scores reorder matches together. 1606 // Ensure that both types of relevance scores reorder matches together.
1596 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997]," 1607 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
1597 "\"google:verbatimrelevance\":9998}]", 1608 "\"google:verbatimrelevance\":9998}]",
1598 { { "a1", true, true }, 1609 { { "a1", true, true },
1599 { "a", true, true }, 1610 { "a", true, true },
1600 { "a2", true, true }, 1611 { "a2", true, false },
1601 { "k a", false, false }, 1612 { "k a", false, false },
1602 kEmptyMatch, kEmptyMatch }, 1613 kEmptyMatch, kEmptyMatch },
1603 "1" }, 1614 "1" },
1604 1615
1605 // Check that non-inlinable matches may be ranked as the highest result 1616 // Check that an inlineable match appears first regardless of its score.
1606 // if there is at least one inlineable match.
1607 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]", 1617 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
1608 { { "b", true, false }, 1618 { { "a", true, true },
1609 { "a", true, true }, 1619 { "b", true, false },
1610 { "k a", false, false }, 1620 { "k a", false, false },
1611 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1621 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1612 std::string() }, 1622 std::string() },
1613 { "[\"a\",[\"http://b.com\"],[],[]," 1623 { "[\"a\",[\"http://b.com\"],[],[],"
1614 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1624 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1615 "\"google:suggestrelevance\":[9999]}]", 1625 "\"google:suggestrelevance\":[9999]}]",
1616 { { "b.com", false, false }, 1626 { { "a", true, true },
1617 { "a", true, true }, 1627 { "b.com", false, false },
1618 { "k a", false, false }, 1628 { "k a", false, false },
1619 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1629 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1620 std::string() }, 1630 std::string() },
1621 // On the other hand, if there is no inlineable match, restore 1631 // If there is no inlineable match, restore the keyword verbatim score.
1622 // the keyword verbatim score. 1632 // The keyword verbatim match will then appear first.
1623 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]," 1633 { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
1624 "\"google:verbatimrelevance\":0}]", 1634 "\"google:verbatimrelevance\":0}]",
1625 { { "b", true, false }, 1635 { { "a", true, true },
1626 { "a", true, true }, 1636 { "b", true, false },
1627 { "k a", false, false }, 1637 { "k a", false, false },
1628 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1638 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1629 std::string() }, 1639 std::string() },
1630 { "[\"a\",[\"http://b.com\"],[],[]," 1640 { "[\"a\",[\"http://b.com\"],[],[],"
1631 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1641 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1632 "\"google:suggestrelevance\":[9999]," 1642 "\"google:suggestrelevance\":[9999],"
1633 "\"google:verbatimrelevance\":0}]", 1643 "\"google:verbatimrelevance\":0}]",
1634 { { "b.com", false, false }, 1644 { { "a", true, true },
1635 { "a", true, true }, 1645 { "b.com", false, false },
1636 { "k a", false, false }, 1646 { "k a", false, false },
1637 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1647 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1638 std::string() }, 1648 std::string() },
1639 1649
1640 // The top result does not have to score as highly as calculated 1650 // The top result does not have to score as highly as calculated
1641 // verbatim. i.e., there are no minimum score restrictions in 1651 // verbatim. i.e., there are no minimum score restrictions in
1642 // this provider. 1652 // this provider.
1643 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]", 1653 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
1644 { { "a1", true, true }, 1654 { { "a1", true, true },
1645 { "k a", false, false }, 1655 { "k a", false, false },
1646 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1656 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1647 "1" }, 1657 "1" },
1648 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]", 1658 { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":10}]",
1649 { { "a1", true, true }, 1659 { { "a1", true, true },
1650 { "k a", false, false }, 1660 { "k a", false, false },
1651 { "a", true, true }, 1661 { "a", true, true },
1652 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1662 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1653 "1" }, 1663 "1" },
1654 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1]," 1664 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[10],"
1655 "\"google:verbatimrelevance\":0}]", 1665 "\"google:verbatimrelevance\":0}]",
1656 { { "k a", false, false }, 1666 { { "a1", true, true },
1657 { "a1", true, true }, 1667 { "k a", false, false },
1658 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1668 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1659 "1" }, 1669 "1" },
1660 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2]," 1670 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[10, 20],"
1661 "\"google:verbatimrelevance\":0}]", 1671 "\"google:verbatimrelevance\":0}]",
1662 { 1672 { { "a2", true, true },
1663 { "k a", false, false }, 1673 { "k a", false, false },
1664 { "a2", true, true }, 1674 { "a1", true, false },
1665 { "a1", true, true },
1666 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1675 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1667 "2" }, 1676 "2" },
1668 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3]," 1677 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[10, 30],"
1669 "\"google:verbatimrelevance\":2}]", 1678 "\"google:verbatimrelevance\":20}]",
1670 { { "k a", false, false }, 1679 { { "a2", true, true },
1671 { "a2", true, true }, 1680 { "k a", false, false },
1672 { "a", true, true }, 1681 { "a", true, true },
1673 { "a1", true, true }, 1682 { "a1", true, false },
1674 kEmptyMatch, kEmptyMatch }, 1683 kEmptyMatch, kEmptyMatch },
1675 "2" }, 1684 "2" },
1676 1685
1677 // Ensure that all suggestions are considered, regardless of order. 1686 // Ensure that all suggestions are considered, regardless of order.
1678 { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[]," 1687 { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
1679 "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]", 1688 "{\"google:suggestrelevance\":[10, 20, 30, 40, 50, 60, 70]}]",
1680 { { "a", true, true }, 1689 { { "a", true, true },
1681 { "k a", false, false }, 1690 { "k a", false, false },
1682 { "h", true, false }, 1691 { "h", true, false },
1683 { "g", true, false }, 1692 { "g", true, false },
1684 { "f", true, false }, 1693 { "f", true, false },
1685 { "e", true, false } }, 1694 { "e", true, false } },
1686 std::string() }, 1695 std::string() },
1687 { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\"," 1696 { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
1688 "\"http://e.com\", \"http://f.com\", \"http://g.com\"," 1697 "\"http://e.com\", \"http://f.com\", \"http://g.com\","
1689 "\"http://h.com\"],[],[]," 1698 "\"http://h.com\"],[],[],"
1690 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"," 1699 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
1691 "\"NAVIGATION\", \"NAVIGATION\"," 1700 "\"NAVIGATION\", \"NAVIGATION\","
1692 "\"NAVIGATION\", \"NAVIGATION\"," 1701 "\"NAVIGATION\", \"NAVIGATION\","
1693 "\"NAVIGATION\"]," 1702 "\"NAVIGATION\"],"
1694 "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]", 1703 "\"google:suggestrelevance\":[10, 20, 30, 40, 50, 60, 70]}]",
1695 { { "a", true, true }, 1704 { { "a", true, true },
1696 { "k a", false, false }, 1705 { "k a", false, false },
1697 { "h.com", false, false }, 1706 { "h.com", false, false },
1698 { "g.com", false, false }, 1707 { "g.com", false, false },
1699 { "f.com", false, false }, 1708 { "f.com", false, false },
1700 { "e.com", false, false } }, 1709 { "e.com", false, false } },
1701 std::string() }, 1710 std::string() },
1702 1711
1703 // Ensure that incorrectly sized suggestion relevance lists are ignored. 1712 // Ensure that incorrectly sized suggestion relevance lists are ignored.
1704 // Note that keyword suggestions by default (not in suggested relevance 1713 // Note that keyword suggestions by default (not in suggested relevance
1705 // mode) score more highly than the default verbatim. 1714 // mode) score more highly than the default verbatim.
1706 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]", 1715 { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]",
1707 { { "a", true, true }, 1716 { { "a", true, true },
1708 { "a1", true, true }, 1717 { "a1", true, false },
1709 { "a2", true, true }, 1718 { "a2", true, false },
1710 { "k a", false, false }, 1719 { "k a", false, false },
1711 kEmptyMatch, kEmptyMatch }, 1720 kEmptyMatch, kEmptyMatch },
1712 std::string() }, 1721 std::string() },
1713 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]", 1722 { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]",
1714 { { "a", true, true }, 1723 { { "a", true, true },
1715 { "a1", true, true }, 1724 { "a1", true, false },
1716 { "k a", false, false }, 1725 { "k a", false, false },
1717 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1726 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1718 std::string() }, 1727 std::string() },
1719 // In this case, ignoring the suggested relevance scores means we keep 1728 // In this case, ignoring the suggested relevance scores means we keep
1720 // only one navsuggest result. 1729 // only one navsuggest result.
1721 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1730 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1722 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1731 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1723 "\"google:suggestrelevance\":[1]}]", 1732 "\"google:suggestrelevance\":[1]}]",
1724 { { "a", true, true }, 1733 { { "a", true, true },
1725 { "a1.com", false, false }, 1734 { "a1.com", false, false },
1726 { "k a", false, false }, 1735 { "k a", false, false },
1727 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1736 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1728 std::string() }, 1737 std::string() },
1729 { "[\"a\",[\"http://a1.com\"],[],[]," 1738 { "[\"a\",[\"http://a1.com\"],[],[],"
1730 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1739 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1731 "\"google:suggestrelevance\":[9999, 1]}]", 1740 "\"google:suggestrelevance\":[9999, 1]}]",
1732 { { "a", true, true }, 1741 { { "a", true, true },
1733 { "a1.com", false, false }, 1742 { "a1.com", false, false },
1734 { "k a", false, false }, 1743 { "k a", false, false },
1735 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1744 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1736 std::string() }, 1745 std::string() },
1737 1746
1738 // Ensure that all 'verbatim' results are merged with their maximum score. 1747 // Ensure that all 'verbatim' results are merged with their maximum score.
1739 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[]," 1748 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
1740 "{\"google:suggestrelevance\":[9998, 9997, 9999]}]", 1749 "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1741 { { "a2", true, true }, 1750 { { "a2", true, true },
1742 { "a", true, true }, 1751 { "a", true, true },
1743 { "a1", true, true }, 1752 { "a1", true, false },
1744 { "k a", false, false }, 1753 { "k a", false, false },
1745 kEmptyMatch, kEmptyMatch }, 1754 kEmptyMatch, kEmptyMatch },
1746 "2" }, 1755 "2" },
1747 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[]," 1756 { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
1748 "{\"google:suggestrelevance\":[9998, 9997, 9999]," 1757 "{\"google:suggestrelevance\":[9998, 9997, 9999],"
1749 "\"google:verbatimrelevance\":0}]", 1758 "\"google:verbatimrelevance\":0}]",
1750 { { "a2", true, true }, 1759 { { "a2", true, true },
1751 { "a", true, true }, 1760 { "a", true, true },
1752 { "a1", true, true }, 1761 { "a1", true, false },
1753 { "k a", false, false }, 1762 { "k a", false, false },
1754 kEmptyMatch, kEmptyMatch }, 1763 kEmptyMatch, kEmptyMatch },
1755 "2" }, 1764 "2" },
1756 1765
1757 // Ensure that verbatim is always generated without other suggestions. 1766 // Ensure that verbatim is always generated without other suggestions.
1758 // TODO(mpearson): Ensure the value of verbatimrelevance is respected 1767 // TODO(mpearson): Ensure the value of verbatimrelevance is respected
1759 // (except when suggested relevances are ignored). 1768 // (except when suggested relevances are ignored).
1760 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]", 1769 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
1761 { { "k a", false, false }, 1770 { { "a", true, true },
1762 { "a", true, true }, 1771 { "k a", false, false },
1763 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1772 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1764 std::string() }, 1773 std::string() },
1765 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]", 1774 { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
1766 { { "a", true, true }, 1775 { { "a", true, true },
1767 { "k a", false, false }, 1776 { "k a", false, false },
1768 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1777 kEmptyMatch, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1769 std::string() }, 1778 std::string() },
1770 1779
1771 // In reorder mode, navsuggestions will not need to be demoted (because 1780 // In reorder mode, navsuggestions will not need to be demoted (because
1772 // they are marked as not allowed to be default match and will be 1781 // they are marked as not allowed to be default match and will be
1773 // reordered as necessary). 1782 // reordered as necessary).
1774 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1783 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1775 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1784 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1776 "\"google:verbatimrelevance\":9990," 1785 "\"google:verbatimrelevance\":9990,"
1777 "\"google:suggestrelevance\":[9998, 9999]}]", 1786 "\"google:suggestrelevance\":[9998, 9999]}]",
1778 { { "a2.com", false, false }, 1787 { { "a", true, true },
1788 { "a2.com", false, false },
1779 { "a1.com", false, false }, 1789 { "a1.com", false, false },
1780 { "a", true, true },
1781 { "k a", false, false }, 1790 { "k a", false, false },
1782 kEmptyMatch, kEmptyMatch }, 1791 kEmptyMatch, kEmptyMatch },
1783 std::string() }, 1792 std::string() },
1784 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1793 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1785 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1794 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1786 "\"google:verbatimrelevance\":9990," 1795 "\"google:verbatimrelevance\":9990,"
1787 "\"google:suggestrelevance\":[9999, 9998]}]", 1796 "\"google:suggestrelevance\":[9999, 9998]}]",
1788 { { "a1.com", false, false }, 1797 { { "a", true, true },
1798 { "a1.com", false, false },
1789 { "a2.com", false, false }, 1799 { "a2.com", false, false },
1790 { "a", true, true },
1791 { "k a", false, false }, 1800 { "k a", false, false },
1792 kEmptyMatch, kEmptyMatch }, 1801 kEmptyMatch, kEmptyMatch },
1793 std::string() }, 1802 std::string() },
1794 { "[\"a\",[\"https://a/\"],[],[]," 1803 { "[\"a\",[\"https://a/\"],[],[],"
1795 "{\"google:suggesttype\":[\"NAVIGATION\"]," 1804 "{\"google:suggesttype\":[\"NAVIGATION\"],"
1796 "\"google:suggestrelevance\":[9999]}]", 1805 "\"google:suggestrelevance\":[9999]}]",
1797 { { "https://a", false, false }, 1806 { { "a", true, true },
1798 { "a", true, true }, 1807 { "https://a", false, false },
1799 { "k a", false, false }, 1808 { "k a", false, false },
1800 kEmptyMatch, kEmptyMatch, kEmptyMatch }, 1809 kEmptyMatch, kEmptyMatch, kEmptyMatch },
1801 std::string() }, 1810 std::string() },
1802 // Check when navsuggest scores more than verbatim and there is query 1811 // Check when navsuggest scores more than verbatim and there is query
1803 // suggestion but it scores lower. 1812 // suggestion but it scores lower.
1804 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1813 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1805 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1814 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1806 "\"google:verbatimrelevance\":9990," 1815 "\"google:verbatimrelevance\":9990,"
1807 "\"google:suggestrelevance\":[9998, 9999, 1300]}]", 1816 "\"google:suggestrelevance\":[9998, 9999, 1300]}]",
1808 { { "a2.com", false, false }, 1817 { { "a", true, true },
1818 { "a2.com", false, false },
1809 { "a1.com", false, false }, 1819 { "a1.com", false, false },
1810 { "a", true, true }, 1820 { "a3", true, false },
1811 { "a3", true, true },
1812 { "k a", false, false }, 1821 { "k a", false, false },
1813 kEmptyMatch }, 1822 kEmptyMatch },
1814 std::string() }, 1823 std::string() },
1815 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1824 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1816 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1825 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1817 "\"google:verbatimrelevance\":9990," 1826 "\"google:verbatimrelevance\":9990,"
1818 "\"google:suggestrelevance\":[9999, 9998, 1300]}]", 1827 "\"google:suggestrelevance\":[9999, 9998, 1300]}]",
1819 { { "a1.com", false, false }, 1828 { { "a", true, true },
1829 { "a1.com", false, false },
1820 { "a2.com", false, false }, 1830 { "a2.com", false, false },
1821 { "a", true, true }, 1831 { "a3", true, false },
1822 { "a3", true, true },
1823 { "k a", false, false }, 1832 { "k a", false, false },
1824 kEmptyMatch }, 1833 kEmptyMatch },
1825 std::string() }, 1834 std::string() },
1826 // Check when navsuggest scores more than a query suggestion. There is 1835 // Check when navsuggest scores more than a query suggestion. There is
1827 // a verbatim but it scores lower. 1836 // a verbatim but it scores lower.
1828 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1837 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1829 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1838 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1830 "\"google:verbatimrelevance\":9990," 1839 "\"google:verbatimrelevance\":9990,"
1831 "\"google:suggestrelevance\":[9998, 9999, 9997]}]", 1840 "\"google:suggestrelevance\":[9998, 9999, 9997]}]",
1832 { { "a2.com", false, false }, 1841 { { "a3", true, true },
1842 { "a2.com", false, false },
1833 { "a1.com", false, false }, 1843 { "a1.com", false, false },
1834 { "a3", true, true },
1835 { "a", true, true }, 1844 { "a", true, true },
1836 { "k a", false, false }, 1845 { "k a", false, false },
1837 kEmptyMatch }, 1846 kEmptyMatch },
1838 "3" }, 1847 "3" },
1839 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1848 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1840 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1849 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1841 "\"google:verbatimrelevance\":9990," 1850 "\"google:verbatimrelevance\":9990,"
1842 "\"google:suggestrelevance\":[9999, 9998, 9997]}]", 1851 "\"google:suggestrelevance\":[9999, 9998, 9997]}]",
1843 { { "a1.com", false, false }, 1852 { { "a3", true, true },
1853 { "a1.com", false, false },
1844 { "a2.com", false, false }, 1854 { "a2.com", false, false },
1845 { "a3", true, true },
1846 { "a", true, true }, 1855 { "a", true, true },
1847 { "k a", false, false }, 1856 { "k a", false, false },
1848 kEmptyMatch }, 1857 kEmptyMatch },
1849 "3" }, 1858 "3" },
1850 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1859 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1851 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1860 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1852 "\"google:verbatimrelevance\":0," 1861 "\"google:verbatimrelevance\":0,"
1853 "\"google:suggestrelevance\":[9998, 9999, 9997]}]", 1862 "\"google:suggestrelevance\":[9998, 9999, 9997]}]",
1854 { { "a2.com", false, false }, 1863 { { "a3", true, true },
1864 { "a2.com", false, false },
1855 { "a1.com", false, false }, 1865 { "a1.com", false, false },
1856 { "a3", true, true },
1857 { "k a", false, false }, 1866 { "k a", false, false },
1858 kEmptyMatch, kEmptyMatch }, 1867 kEmptyMatch, kEmptyMatch },
1859 "3" }, 1868 "3" },
1860 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1869 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1861 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1870 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1862 "\"google:verbatimrelevance\":0," 1871 "\"google:verbatimrelevance\":0,"
1863 "\"google:suggestrelevance\":[9999, 9998, 9997]}]", 1872 "\"google:suggestrelevance\":[9999, 9998, 9997]}]",
1864 { { "a1.com", false, false }, 1873 { { "a3", true, true },
1874 { "a1.com", false, false },
1865 { "a2.com", false, false }, 1875 { "a2.com", false, false },
1866 { "a3", true, true },
1867 { "k a", false, false }, 1876 { "k a", false, false },
1868 kEmptyMatch, kEmptyMatch }, 1877 kEmptyMatch, kEmptyMatch },
1869 "3" }, 1878 "3" },
1870 // Check when there is neither verbatim nor a query suggestion that, 1879 // Check when there is neither verbatim nor a query suggestion that,
1871 // because we can't demote navsuggestions below a query suggestion, 1880 // because we can't demote navsuggestions below a query suggestion,
1872 // we restore the keyword verbatim score. 1881 // we restore the keyword verbatim score.
1873 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1882 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1874 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1883 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1875 "\"google:verbatimrelevance\":0," 1884 "\"google:verbatimrelevance\":0,"
1876 "\"google:suggestrelevance\":[9998, 9999]}]", 1885 "\"google:suggestrelevance\":[9998, 9999]}]",
1877 { { "a2.com", false, false }, 1886 { { "a", true, true },
1887 { "a2.com", false, false },
1878 { "a1.com", false, false }, 1888 { "a1.com", false, false },
1879 { "a", true, true },
1880 { "k a", false, false }, 1889 { "k a", false, false },
1881 kEmptyMatch, kEmptyMatch }, 1890 kEmptyMatch, kEmptyMatch },
1882 std::string() }, 1891 std::string() },
1883 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[]," 1892 { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1884 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]," 1893 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1885 "\"google:verbatimrelevance\":0," 1894 "\"google:verbatimrelevance\":0,"
1886 "\"google:suggestrelevance\":[9999, 9998]}]", 1895 "\"google:suggestrelevance\":[9999, 9998]}]",
1887 { { "a1.com", false, false }, 1896 { { "a", true, true },
1897 { "a1.com", false, false },
1888 { "a2.com", false, false }, 1898 { "a2.com", false, false },
1889 { "a", true, true },
1890 { "k a", false, false }, 1899 { "k a", false, false },
1891 kEmptyMatch, kEmptyMatch }, 1900 kEmptyMatch, kEmptyMatch },
1892 std::string() }, 1901 std::string() },
1893 // More checks that everything works when it's not necessary to demote. 1902 // More checks that everything works when it's not necessary to demote.
1894 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1903 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1895 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1904 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1896 "\"google:verbatimrelevance\":9990," 1905 "\"google:verbatimrelevance\":9990,"
1897 "\"google:suggestrelevance\":[9997, 9998, 9999]}]", 1906 "\"google:suggestrelevance\":[9997, 9998, 9999]}]",
1898 { { "a3", true, true }, 1907 { { "a3", true, true },
1899 { "a2.com", false, false }, 1908 { "a2.com", false, false },
1900 { "a1.com", false, false }, 1909 { "a1.com", false, false },
1901 { "a", true, true }, 1910 { "a", true, true },
1902 { "k a", false, false }, 1911 { "k a", false, false },
1903 kEmptyMatch }, 1912 kEmptyMatch },
1904 "3" }, 1913 "3" },
1905 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[]," 1914 { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1906 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"]," 1915 "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1907 "\"google:verbatimrelevance\":9990," 1916 "\"google:verbatimrelevance\":9990,"
1908 "\"google:suggestrelevance\":[9998, 9997, 9999]}]", 1917 "\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1909 { { "a3", true, true }, 1918 { { "a3", true, true },
1910 { "a1.com", false, false }, 1919 { "a1.com", false, false },
1911 { "a2.com", false, false }, 1920 { "a2.com", false, false },
1912 { "a", true, true }, 1921 { "a", true, true },
1913 { "k a", false, false }, 1922 { "k a", false, false },
1914 kEmptyMatch }, 1923 kEmptyMatch },
1915 "3" }, 1924 "3" },
1916 }; 1925 };
1917 1926
1918 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 1927 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
1919 QueryForInput(ASCIIToUTF16("k a"), false, true); 1928 // Send the query twice in order to have a synchronous pass after the first
1929 // response is received. This is necessary because SearchProvider doesn't
1930 // allow an asynchronous response to change the default match.
1931 for (size_t j = 0; j < 2; ++j) {
1932 QueryForInput(ASCIIToUTF16("k a"), false, true);
1920 1933
1921 // Set up a default fetcher with no results. 1934 // Set up a default fetcher with no results.
1922 net::TestURLFetcher* default_fetcher = 1935 net::TestURLFetcher* default_fetcher =
1923 test_factory_.GetFetcherByID( 1936 test_factory_.GetFetcherByID(
1924 SearchProvider::kDefaultProviderURLFetcherID); 1937 SearchProvider::kDefaultProviderURLFetcherID);
1925 ASSERT_TRUE(default_fetcher); 1938 ASSERT_TRUE(default_fetcher);
1926 default_fetcher->set_response_code(200); 1939 default_fetcher->set_response_code(200);
1927 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher); 1940 default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
1928 default_fetcher = NULL; 1941 default_fetcher = NULL;
1929 1942
1930 // Set up a keyword fetcher with provided results. 1943 // Set up a keyword fetcher with provided results.
1931 net::TestURLFetcher* keyword_fetcher = 1944 net::TestURLFetcher* keyword_fetcher =
1932 test_factory_.GetFetcherByID( 1945 test_factory_.GetFetcherByID(
1933 SearchProvider::kKeywordProviderURLFetcherID); 1946 SearchProvider::kKeywordProviderURLFetcherID);
1934 ASSERT_TRUE(keyword_fetcher); 1947 ASSERT_TRUE(keyword_fetcher);
1935 keyword_fetcher->set_response_code(200); 1948 keyword_fetcher->set_response_code(200);
1936 keyword_fetcher->SetResponseString(cases[i].json); 1949 keyword_fetcher->SetResponseString(cases[i].json);
1937 keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher); 1950 keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
1938 keyword_fetcher = NULL; 1951 keyword_fetcher = NULL;
1939 RunTillProviderDone(); 1952 RunTillProviderDone();
1953 }
1940 1954
1941 const std::string description = "for input with json=" + cases[i].json; 1955 SCOPED_TRACE("for input with json=" + cases[i].json);
1942 const ACMatches& matches = provider_->matches(); 1956 const ACMatches& matches = provider_->matches();
1943 ASSERT_FALSE(matches.empty()); 1957 ASSERT_FALSE(matches.empty());
1944 // Find the first match that's allowed to be the default match and check 1958 // Find the first match that's allowed to be the default match and check
1945 // its inline_autocompletion. 1959 // its inline_autocompletion.
1946 ACMatches::const_iterator it = FindDefaultMatch(matches); 1960 ACMatches::const_iterator it = FindDefaultMatch(matches);
1947 ASSERT_NE(matches.end(), it); 1961 ASSERT_NE(matches.end(), it);
1948 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion), 1962 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
1949 it->inline_autocompletion) << description; 1963 it->inline_autocompletion);
1950 1964
1951 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches)); 1965 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
1952 size_t j = 0; 1966 size_t j = 0;
1953 // Ensure that the returned matches equal the expectations. 1967 // Ensure that the returned matches equal the expectations.
1954 for (; j < matches.size(); ++j) { 1968 for (; j < matches.size(); ++j) {
1955 EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents), 1969 EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents),
1956 matches[j].contents) << description; 1970 matches[j].contents);
1957 EXPECT_EQ(cases[i].matches[j].from_keyword, 1971 EXPECT_EQ(cases[i].matches[j].from_keyword,
1958 matches[j].keyword == ASCIIToUTF16("k")) << description; 1972 matches[j].keyword == ASCIIToUTF16("k"));
1959 EXPECT_EQ(cases[i].matches[j].allowed_to_be_default_match, 1973 EXPECT_EQ(cases[i].matches[j].allowed_to_be_default_match,
1960 matches[j].allowed_to_be_default_match) << description; 1974 matches[j].allowed_to_be_default_match);
1961 } 1975 }
1962 // Ensure that no expected matches are missing. 1976 // Ensure that no expected matches are missing.
1963 for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j) 1977 for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j) {
1964 EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents) << 1978 SCOPED_TRACE(" Case # " + base::IntToString(i));
1965 "Case # " << i << " " << description; 1979 EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents);
1980 }
1966 } 1981 }
1967 } 1982 }
1968 1983
1984 TEST_F(SearchProviderTest, DontInlineAutocompleteAsynchronously) {
1985 // This test sends two separate queries, each receiving different JSON
1986 // replies, and checks that at each stage of processing (receiving first
1987 // asynchronous response, handling new keystroke synchronously / sending the
1988 // second request, and receiving the second asynchronous response) we have the
1989 // expected matches. In particular, receiving the second response shouldn't
1990 // cause an unexpected inline autcompletion.
1991 struct {
1992 const std::string first_json;
1993 const ExpectedMatch first_async_matches[4];
1994 const ExpectedMatch sync_matches[4];
1995 const std::string second_json;
1996 const ExpectedMatch second_async_matches[4];
1997 } cases[] = {
1998 // A simple test that verifies we don't inline autocomplete after the
1999 // first asynchronous response, but we do at the next keystroke if the
2000 // response's results were good enough. Furthermore, we should continue
2001 // inline autocompleting after the second asynchronous response if the new
2002 // top suggestion is the same as the old inline autocompleted suggestion.
2003 { "[\"a\",[\"ab1\", \"ab2\"],[],[],"
2004 "{\"google:verbatimrelevance\":9000,"
2005 "\"google:suggestrelevance\":[9002, 9001]}]",
2006 { { "a", true }, { "ab1", false }, { "ab2", false },
2007 kEmptyExpectedMatch },
2008 { { "ab1", true }, { "ab2", true }, { "ab", true },
2009 kEmptyExpectedMatch },
2010 "[\"ab\",[\"ab1\", \"ab2\"],[],[],"
2011 "{\"google:verbatimrelevance\":9000,"
2012 "\"google:suggestrelevance\":[9002, 9001]}]",
2013 { { "ab1", true }, { "ab2", false }, { "ab", true },
2014 kEmptyExpectedMatch } },
2015 // Ditto, just for a navigation suggestion.
2016 { "[\"a\",[\"ab1.com\", \"ab2.com\"],[],[],"
2017 "{\"google:verbatimrelevance\":9000,"
2018 "\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
2019 "\"google:suggestrelevance\":[9002, 9001]}]",
2020 { { "a", true }, { "ab1.com", false }, { "ab2.com", false },
2021 kEmptyExpectedMatch },
2022 { { "ab1.com", true }, { "ab2.com", true }, { "ab", true },
2023 kEmptyExpectedMatch },
2024 "[\"ab\",[\"ab1.com\", \"ab2.com\"],[],[],"
2025 "{\"google:verbatimrelevance\":9000,"
2026 "\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
2027 "\"google:suggestrelevance\":[9002, 9001]}]",
2028 { { "ab1.com", true }, { "ab2.com", false }, { "ab", true },
2029 kEmptyExpectedMatch } },
2030 // A more realistic test of the same situation.
2031 { "[\"a\",[\"abcdef\", \"abcdef.com\", \"abc\"],[],[],"
2032 "{\"google:verbatimrelevance\":900,"
2033 "\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\", \"QUERY\"],"
2034 "\"google:suggestrelevance\":[1250, 1200, 1000]}]",
2035 { { "a", true }, { "abcdef", false }, { "abcdef.com", false },
2036 { "abc", false } },
2037 { { "abcdef", true }, { "abcdef.com", true }, { "abc", true },
2038 { "ab", true } },
2039 "[\"ab\",[\"abcdef\", \"abcdef.com\", \"abc\"],[],[],"
2040 "{\"google:verbatimrelevance\":900,"
2041 "\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\", \"QUERY\"],"
2042 "\"google:suggestrelevance\":[1250, 1200, 1000]}]",
2043 { { "abcdef", true }, { "abcdef.com", false }, { "abc", false },
2044 { "ab", true } } },
2045
2046 // Without an original inline autcompletion, a new inline autcompletion
2047 // should be rejected.
2048 { "[\"a\",[\"ab1\", \"ab2\"],[],[],"
2049 "{\"google:verbatimrelevance\":9000,"
2050 "\"google:suggestrelevance\":[8000, 7000]}]",
2051 { { "a", true }, { "ab1", false }, { "ab2", false },
2052 kEmptyExpectedMatch },
2053 { { "ab", true }, { "ab1", true }, { "ab2", true },
2054 kEmptyExpectedMatch },
2055 "[\"ab\",[\"ab1\", \"ab2\"],[],[],"
2056 "{\"google:verbatimrelevance\":9000,"
2057 "\"google:suggestrelevance\":[9002, 9001]}]",
2058 { { "ab", true }, { "ab1", false }, { "ab2", false },
2059 kEmptyExpectedMatch } },
2060 // For the same test except with the queries scored in the opposite order
2061 // on the second JSON response, the queries should be ordered by the second
2062 // response's scores, not the first.
2063 { "[\"a\",[\"ab1\", \"ab2\"],[],[],"
2064 "{\"google:verbatimrelevance\":9000,"
2065 "\"google:suggestrelevance\":[8000, 7000]}]",
2066 { { "a", true }, { "ab1", false }, { "ab2", false },
2067 kEmptyExpectedMatch },
2068 { { "ab", true }, { "ab1", true }, { "ab2", true },
2069 kEmptyExpectedMatch },
2070 "[\"ab\",[\"ab1\", \"ab2\"],[],[],"
2071 "{\"google:verbatimrelevance\":9000,"
2072 "\"google:suggestrelevance\":[9001, 9002]}]",
2073 { { "ab", true }, { "ab2", false }, { "ab1", false },
2074 kEmptyExpectedMatch } },
2075 // Now, the same verifications but with the new inline autocompletion as a
2076 // navsuggestion. The new autocompletion should still be rejected.
2077 { "[\"a\",[\"ab1.com\", \"ab2.com\"],[],[],"
2078 "{\"google:verbatimrelevance\":9000,"
2079 "\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
2080 "\"google:suggestrelevance\":[8000, 7000]}]",
2081 { { "a", true }, { "ab1.com", false }, { "ab2.com", false },
2082 kEmptyExpectedMatch },
2083 { { "ab", true }, { "ab1.com", true }, { "ab2.com", true },
2084 kEmptyExpectedMatch },
2085 "[\"ab\",[\"ab1.com\", \"ab2.com\"],[],[],"
2086 "{\"google:verbatimrelevance\":9000,"
2087 "\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
2088 "\"google:suggestrelevance\":[9002, 9001]}]",
2089 { { "ab", true }, { "ab1.com", false }, { "ab2.com", false },
2090 kEmptyExpectedMatch } },
2091 { "[\"a\",[\"ab1.com\", \"ab2.com\"],[],[],"
2092 "{\"google:verbatimrelevance\":9000,"
2093 "\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
2094 "\"google:suggestrelevance\":[8000, 7000]}]",
2095 { { "a", true }, { "ab1.com", false }, { "ab2.com", false },
2096 kEmptyExpectedMatch },
2097 { { "ab", true }, { "ab1.com", true }, { "ab2.com", true },
2098 kEmptyExpectedMatch },
2099 "[\"ab\",[\"ab1.com\", \"ab2.com\"],[],[],"
2100 "{\"google:verbatimrelevance\":9000,"
2101 "\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
2102 "\"google:suggestrelevance\":[9001, 9002]}]",
2103 { { "ab", true }, { "ab2.com", false }, { "ab1.com", false },
2104 kEmptyExpectedMatch } },
2105
2106 // It's okay to abandon an inline autocompletion asynchronously.
2107 { "[\"a\",[\"ab1\", \"ab2\"],[],[],"
2108 "{\"google:verbatimrelevance\":9000,"
2109 "\"google:suggestrelevance\":[9002, 9001]}]",
2110 { { "a", true }, { "ab1", false }, { "ab2", false },
2111 kEmptyExpectedMatch },
2112 { { "ab1", true }, { "ab2", true }, { "ab", true },
2113 kEmptyExpectedMatch },
2114 "[\"ab\",[\"ab1\", \"ab2\"],[],[],"
2115 "{\"google:verbatimrelevance\":9000,"
2116 "\"google:suggestrelevance\":[8000, 7000]}]",
2117 { { "ab", true }, { "ab1", true }, { "ab2", false },
2118 kEmptyExpectedMatch } },
2119
2120 // Note: it's possible that the suggest server returns a suggestion with
2121 // an inline autocompletion (that as usual we delay in allowing it to
2122 // be displayed as an inline autocompletion until the next keystroke),
2123 // then, in response to the next keystroke, the server returns a different
2124 // suggestion as an inline autocompletion. This is not likely to happen.
2125 // Regardless, if it does, one could imagine three different behaviors:
2126 // - keep the original inline autocompletion until the next keystroke
2127 // (i.e., don't abandon an inline autocompletion asynchronously), then
2128 // use the new suggestion
2129 // - abandon all inline autocompletions upon the server response, then use
2130 // the new suggestion on the next keystroke
2131 // - ignore the new inline autocompletion provided by the server, yet
2132 // possibly keep the original if it scores well in the most recent
2133 // response, then use the new suggestion on the next keystroke
2134 // All of these behaviors are reasonable. The main thing we want to
2135 // ensure is that the second asynchronous response shouldn't cause *a new*
2136 // inline autocompletion to be displayed. We test that here.
2137 // The current implementation does the third bullet, but all of these
2138 // behaviors seem reasonable.
2139 { "[\"a\",[\"ab1\", \"ab2\"],[],[],"
2140 "{\"google:verbatimrelevance\":9000,"
2141 "\"google:suggestrelevance\":[9002, 9001]}]",
2142 { { "a", true }, { "ab1", false }, { "ab2", false },
2143 kEmptyExpectedMatch },
2144 { { "ab1", true }, { "ab2", true }, { "ab", true },
2145 kEmptyExpectedMatch },
2146 "[\"ab\",[\"ab1\", \"ab3\"],[],[],"
2147 "{\"google:verbatimrelevance\":9000,"
2148 "\"google:suggestrelevance\":[9002, 9900]}]",
2149 { { "ab1", true }, { "ab3", false }, { "ab", true },
2150 kEmptyExpectedMatch } },
2151 { "[\"a\",[\"ab1\", \"ab2\"],[],[],"
2152 "{\"google:verbatimrelevance\":9000,"
2153 "\"google:suggestrelevance\":[9002, 9001]}]",
2154 { { "a", true }, { "ab1", false }, { "ab2", false },
2155 kEmptyExpectedMatch },
2156 { { "ab1", true }, { "ab2", true }, { "ab", true },
2157 kEmptyExpectedMatch },
2158 "[\"ab\",[\"ab1\", \"ab3\"],[],[],"
2159 "{\"google:verbatimrelevance\":9000,"
2160 "\"google:suggestrelevance\":[8000, 9500]}]",
2161 { { "ab", true }, { "ab3", false }, { "ab1", true },
2162 kEmptyExpectedMatch } },
2163 };
2164
2165 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2166 // First, send the query "a" and receive the JSON response |first_json|.
2167 ClearAllResults();
2168 QueryForInputAndWaitForFetcherResponses(
2169 ASCIIToUTF16("a"), false, cases[i].first_json, std::string());
2170
2171 // Verify that the matches after the asynchronous results are as expected.
2172 std::string description = "first asynchronous response for input with "
2173 "first_json=" + cases[i].first_json;
2174 CheckMatches(description, ARRAYSIZE_UNSAFE(cases[i].first_async_matches),
2175 cases[i].first_async_matches, provider_->matches());
2176
2177 // Then, send the query "ab" and check the synchronous matches.
2178 description = "synchronous response after the first keystroke after input "
2179 "with first_json=" + cases[i].first_json;
2180 QueryForInput(ASCIIToUTF16("ab"), false, false);
2181 CheckMatches(description, ARRAYSIZE_UNSAFE(cases[i].sync_matches),
2182 cases[i].sync_matches, provider_->matches());
2183
2184 // Finally, get the provided JSON response, |second_json|, and verify the
2185 // matches after the second asynchronous response are as expected.
2186 description = "second asynchronous response after input with first_json=" +
2187 cases[i].first_json + " and second_json=" + cases[i].second_json;
2188 net::TestURLFetcher* second_fetcher =
2189 test_factory_.GetFetcherByID(
2190 SearchProvider::kDefaultProviderURLFetcherID);
2191 ASSERT_TRUE(second_fetcher);
2192 second_fetcher->set_response_code(200);
2193 second_fetcher->SetResponseString(cases[i].second_json);
2194 second_fetcher->delegate()->OnURLFetchComplete(second_fetcher);
2195 RunTillProviderDone();
2196 CheckMatches(description, ARRAYSIZE_UNSAFE(cases[i].second_async_matches),
2197 cases[i].second_async_matches, provider_->matches());
2198 }
2199 }
2200
1969 TEST_F(SearchProviderTest, LocalAndRemoteRelevances) { 2201 TEST_F(SearchProviderTest, LocalAndRemoteRelevances) {
1970 // We hardcode the string "term1" below, so ensure that the search term that 2202 // We hardcode the string "term1" below, so ensure that the search term that
1971 // got added to history already is that string. 2203 // got added to history already is that string.
1972 ASSERT_EQ(ASCIIToUTF16("term1"), term1_); 2204 ASSERT_EQ(ASCIIToUTF16("term1"), term1_);
1973 base::string16 term = term1_.substr(0, term1_.length() - 1); 2205 base::string16 term = term1_.substr(0, term1_.length() - 1);
1974 2206
1975 AddSearchToHistory(default_t_url_, term + ASCIIToUTF16("2"), 2); 2207 AddSearchToHistory(default_t_url_, term + ASCIIToUTF16("2"), 2);
1976 profile_.BlockUntilHistoryProcessesPendingRequests(); 2208 profile_.BlockUntilHistoryProcessesPendingRequests();
1977 2209
1978 struct { 2210 struct {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2019 "\"google:suggestrelevance\":[1440, 1430, 1420, 1410, 1400, 1390]}]", 2251 "\"google:suggestrelevance\":[1440, 1430, 1420, 1410, 1400, 1390]}]",
2020 { "term", "a1", "a2", "a3", "a4", "a5" } }, 2252 { "term", "a1", "a2", "a3", "a4", "a5" } },
2021 { term, 2253 { term,
2022 "[\"term\",[\"a1\", \"a2\", \"a3\", \"a4\"],[],[]," 2254 "[\"term\",[\"a1\", \"a2\", \"a3\", \"a4\"],[],[],"
2023 "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\", \"QUERY\"]," 2255 "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\", \"QUERY\"],"
2024 "\"google:verbatimrelevance\":1450," 2256 "\"google:verbatimrelevance\":1450,"
2025 "\"google:suggestrelevance\":[1430, 1410, 1390, 1370]}]", 2257 "\"google:suggestrelevance\":[1430, 1410, 1390, 1370]}]",
2026 { "term", "a1", "a2", "term2", "a3", "a4" } } 2258 { "term", "a1", "a2", "term2", "a3", "a4" } }
2027 }; 2259 };
2028 2260
2029 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 2261 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2030 QueryForInput(cases[i].input, false, false); 2262 QueryForInputAndWaitForFetcherResponses(
2031 net::TestURLFetcher* fetcher = 2263 cases[i].input, false, cases[i].json, std::string());
2032 test_factory_.GetFetcherByID(
2033 SearchProvider::kDefaultProviderURLFetcherID);
2034 ASSERT_TRUE(fetcher);
2035 fetcher->set_response_code(200);
2036 fetcher->SetResponseString(cases[i].json);
2037 fetcher->delegate()->OnURLFetchComplete(fetcher);
2038 RunTillProviderDone();
2039 2264
2040 const std::string description = "for input with json=" + cases[i].json; 2265 const std::string description = "for input with json=" + cases[i].json;
2041 const ACMatches& matches = provider_->matches(); 2266 const ACMatches& matches = provider_->matches();
2042 2267
2043 // Ensure no extra matches are present. 2268 // Ensure no extra matches are present.
2044 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches)); 2269 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
2045 2270
2046 size_t j = 0; 2271 size_t j = 0;
2047 // Ensure that the returned matches equal the expectations. 2272 // Ensure that the returned matches equal the expectations.
2048 for (; j < matches.size(); ++j) 2273 for (; j < matches.size(); ++j)
(...skipping 13 matching lines...) Expand all
2062 AutocompleteMatch::Type match_type; 2287 AutocompleteMatch::Type match_type;
2063 bool allowed_to_be_default_match; 2288 bool allowed_to_be_default_match;
2064 }; 2289 };
2065 const DefaultFetcherUrlInputMatch kEmptyMatch = 2290 const DefaultFetcherUrlInputMatch kEmptyMatch =
2066 { kNotApplicable, AutocompleteMatchType::NUM_TYPES, false }; 2291 { kNotApplicable, AutocompleteMatchType::NUM_TYPES, false };
2067 struct { 2292 struct {
2068 const std::string input; 2293 const std::string input;
2069 const std::string json; 2294 const std::string json;
2070 const DefaultFetcherUrlInputMatch output[4]; 2295 const DefaultFetcherUrlInputMatch output[4];
2071 } cases[] = { 2296 } cases[] = {
2072 // Ensure NAVIGATION matches are allowed to be listed first for URL 2297 // Ensure NAVIGATION matches are allowed to be listed first for URL input.
2073 // input regardless of whether the match is inlineable. Note that 2298 // Non-inlineable matches should not be allowed to be the default match.
2074 // non-inlineable matches should not be allowed to be the default match. 2299 // Note that the top-scoring inlineable match is moved to the top
2300 // regardless of its score.
2075 { "a.com", "[\"a.com\",[\"http://b.com/\"],[],[]," 2301 { "a.com", "[\"a.com\",[\"http://b.com/\"],[],[],"
2076 "{\"google:suggesttype\":[\"NAVIGATION\"]," 2302 "{\"google:suggesttype\":[\"NAVIGATION\"],"
2077 "\"google:suggestrelevance\":[9999]}]", 2303 "\"google:suggestrelevance\":[9999]}]",
2078 { { "b.com", AutocompleteMatchType::NAVSUGGEST, false }, 2304 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2079 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2305 { "b.com", AutocompleteMatchType::NAVSUGGEST, false },
2080 kEmptyMatch, kEmptyMatch } }, 2306 kEmptyMatch, kEmptyMatch } },
2081 { "a.com", "[\"a.com\",[\"https://b.com\"],[],[]," 2307 { "a.com", "[\"a.com\",[\"https://b.com\"],[],[],"
2082 "{\"google:suggesttype\":[\"NAVIGATION\"]," 2308 "{\"google:suggesttype\":[\"NAVIGATION\"],"
2083 "\"google:suggestrelevance\":[9999]}]", 2309 "\"google:suggestrelevance\":[9999]}]",
2084 { { "https://b.com", AutocompleteMatchType::NAVSUGGEST, false }, 2310 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2085 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2311 { "https://b.com", AutocompleteMatchType::NAVSUGGEST, false },
2086 kEmptyMatch, kEmptyMatch } }, 2312 kEmptyMatch, kEmptyMatch } },
2087 { "a.com", "[\"a.com\",[\"http://a.com/a\"],[],[]," 2313 { "a.com", "[\"a.com\",[\"http://a.com/a\"],[],[],"
2088 "{\"google:suggesttype\":[\"NAVIGATION\"]," 2314 "{\"google:suggesttype\":[\"NAVIGATION\"],"
2089 "\"google:suggestrelevance\":[9999]}]", 2315 "\"google:suggestrelevance\":[9999]}]",
2090 { { "a.com/a", AutocompleteMatchType::NAVSUGGEST, true }, 2316 { { "a.com/a", AutocompleteMatchType::NAVSUGGEST, true },
2091 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2317 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2092 kEmptyMatch, kEmptyMatch } }, 2318 kEmptyMatch, kEmptyMatch } },
2093 { "a.com", "[\"a.com\",[\"https://a.com\"],[],[]," 2319 { "a.com", "[\"a.com\",[\"https://a.com\"],[],[],"
2094 "{\"google:suggesttype\":[\"NAVIGATION\"]," 2320 "{\"google:suggesttype\":[\"NAVIGATION\"],"
2095 "\"google:suggestrelevance\":[9999]}]", 2321 "\"google:suggestrelevance\":[9999]}]",
2096 { { "https://a.com", AutocompleteMatchType::NAVSUGGEST, true }, 2322 { { "https://a.com", AutocompleteMatchType::NAVSUGGEST, true },
2097 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2323 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2098 kEmptyMatch, kEmptyMatch } }, 2324 kEmptyMatch, kEmptyMatch } },
2099 2325
2100 // Ensure topmost inlineable SUGGEST matches are NOT allowed for URL 2326 // Ensure topmost inlineable SUGGEST matches are NOT allowed for URL
2101 // input. SearchProvider disregards search and verbatim suggested 2327 // input. SearchProvider disregards search and verbatim suggested
2102 // relevances. 2328 // relevances.
2103 { "a.com", "[\"a.com\",[\"a.com info\"],[],[]," 2329 { "a.com", "[\"a.com\",[\"a.com info\"],[],[],"
2104 "{\"google:suggestrelevance\":[9999]}]", 2330 "{\"google:suggestrelevance\":[9999]}]",
2105 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2331 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2106 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, true }, 2332 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, false },
2107 kEmptyMatch, kEmptyMatch } }, 2333 kEmptyMatch, kEmptyMatch } },
2108 { "a.com", "[\"a.com\",[\"a.com info\"],[],[]," 2334 { "a.com", "[\"a.com\",[\"a.com info\"],[],[],"
2109 "{\"google:suggestrelevance\":[9999]}]", 2335 "{\"google:suggestrelevance\":[9999]}]",
2110 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2336 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2111 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, true }, 2337 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, false },
2112 kEmptyMatch, kEmptyMatch } }, 2338 kEmptyMatch, kEmptyMatch } },
2113 2339
2114 // Ensure the fallback mechanism allows inlinable NAVIGATION matches. 2340 // Ensure the fallback mechanism allows inlineable NAVIGATION matches.
2115 { "a.com", "[\"a.com\",[\"a.com info\", \"http://a.com/b\"],[],[]," 2341 { "a.com", "[\"a.com\",[\"a.com info\", \"http://a.com/b\"],[],[],"
2116 "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"]," 2342 "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
2117 "\"google:suggestrelevance\":[9999, 9998]}]", 2343 "\"google:suggestrelevance\":[9999, 9998]}]",
2118 { { "a.com/b", AutocompleteMatchType::NAVSUGGEST, true }, 2344 { { "a.com/b", AutocompleteMatchType::NAVSUGGEST, true },
2119 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2345 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, false },
2120 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, true }, 2346 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2121 kEmptyMatch } }, 2347 kEmptyMatch } },
2122 { "a.com", "[\"a.com\",[\"a.com info\", \"http://a.com/b\"],[],[]," 2348 { "a.com", "[\"a.com\",[\"a.com info\", \"http://a.com/b\"],[],[],"
2123 "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"]," 2349 "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
2124 "\"google:suggestrelevance\":[9998, 9997]," 2350 "\"google:suggestrelevance\":[9998, 9997],"
2125 "\"google:verbatimrelevance\":9999}]", 2351 "\"google:verbatimrelevance\":9999}]",
2126 { { "a.com/b", AutocompleteMatchType::NAVSUGGEST, true }, 2352 { { "a.com/b", AutocompleteMatchType::NAVSUGGEST, true },
2127 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2353 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2128 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, true }, 2354 { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST, false },
2129 kEmptyMatch } }, 2355 kEmptyMatch } },
2130 2356
2131 // Ensure topmost non-inlineable SUGGEST matches are allowed for URL 2357 // Ensure non-inlineable SUGGEST matches are allowed for URL input
2132 // input assuming the top inlineable match is not a query (i.e., is a 2358 // assuming the best inlineable match is not a query (i.e., is a
2133 // NAVSUGGEST). 2359 // NAVSUGGEST). The best inlineable match will be at the top of the
2360 // list regardless of its score.
2134 { "a.com", "[\"a.com\",[\"info\"],[],[]," 2361 { "a.com", "[\"a.com\",[\"info\"],[],[],"
2135 "{\"google:suggestrelevance\":[9999]}]", 2362 "{\"google:suggestrelevance\":[9999]}]",
2136 { { "info", AutocompleteMatchType::SEARCH_SUGGEST, false }, 2363 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2137 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2364 { "info", AutocompleteMatchType::SEARCH_SUGGEST, false },
2138 kEmptyMatch, kEmptyMatch } }, 2365 kEmptyMatch, kEmptyMatch } },
2139 { "a.com", "[\"a.com\",[\"info\"],[],[]," 2366 { "a.com", "[\"a.com\",[\"info\"],[],[],"
2140 "{\"google:suggestrelevance\":[9999]}]", 2367 "{\"google:suggestrelevance\":[9999]}]",
2141 { { "info", AutocompleteMatchType::SEARCH_SUGGEST, false }, 2368 { { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2142 { "a.com", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true }, 2369 { "info", AutocompleteMatchType::SEARCH_SUGGEST, false },
2143 kEmptyMatch, kEmptyMatch } }, 2370 kEmptyMatch, kEmptyMatch } },
2144 }; 2371 };
2145 2372
2146 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 2373 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2147 QueryForInput(ASCIIToUTF16(cases[i].input), false, false); 2374 // Send the query twice in order to have a synchronous pass after the first
2148 net::TestURLFetcher* fetcher = 2375 // response is received. This is necessary because SearchProvider doesn't
2149 test_factory_.GetFetcherByID( 2376 // allow an asynchronous response to change the default match.
2150 SearchProvider::kDefaultProviderURLFetcherID); 2377 for (size_t j = 0; j < 2; ++j) {
2151 ASSERT_TRUE(fetcher); 2378 QueryForInputAndWaitForFetcherResponses(
2152 fetcher->set_response_code(200); 2379 ASCIIToUTF16(cases[i].input), false, cases[i].json, std::string());
2153 fetcher->SetResponseString(cases[i].json); 2380 }
2154 fetcher->delegate()->OnURLFetchComplete(fetcher);
2155 RunTillProviderDone();
2156 2381
2382 SCOPED_TRACE("input=" + cases[i].input + " json=" + cases[i].json);
2157 size_t j = 0; 2383 size_t j = 0;
2158 const ACMatches& matches = provider_->matches(); 2384 const ACMatches& matches = provider_->matches();
2159 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].output)); 2385 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].output));
2160 // Ensure that the returned matches equal the expectations. 2386 // Ensure that the returned matches equal the expectations.
2161 for (; j < matches.size(); ++j) { 2387 for (; j < matches.size(); ++j) {
2162 EXPECT_EQ(ASCIIToUTF16(cases[i].output[j].match_contents), 2388 EXPECT_EQ(ASCIIToUTF16(cases[i].output[j].match_contents),
2163 matches[j].contents); 2389 matches[j].contents);
2164 EXPECT_EQ(cases[i].output[j].match_type, matches[j].type); 2390 EXPECT_EQ(cases[i].output[j].match_type, matches[j].type);
2165 EXPECT_EQ(cases[i].output[j].allowed_to_be_default_match, 2391 EXPECT_EQ(cases[i].output[j].allowed_to_be_default_match,
2166 matches[j].allowed_to_be_default_match); 2392 matches[j].allowed_to_be_default_match);
2167 } 2393 }
2168 // Ensure that no expected matches are missing. 2394 // Ensure that no expected matches are missing.
2169 for (; j < ARRAYSIZE_UNSAFE(cases[i].output); ++j) { 2395 for (; j < ARRAYSIZE_UNSAFE(cases[i].output); ++j) {
2170 EXPECT_EQ(kNotApplicable, cases[i].output[j].match_contents); 2396 EXPECT_EQ(kNotApplicable, cases[i].output[j].match_contents);
2171 EXPECT_EQ(AutocompleteMatchType::NUM_TYPES, 2397 EXPECT_EQ(AutocompleteMatchType::NUM_TYPES,
2172 cases[i].output[j].match_type); 2398 cases[i].output[j].match_type);
2173 EXPECT_FALSE(cases[i].output[j].allowed_to_be_default_match); 2399 EXPECT_FALSE(cases[i].output[j].allowed_to_be_default_match);
2174 } 2400 }
2175 } 2401 }
2176 } 2402 }
2177 2403
2178 // A basic test that verifies the field trial triggered parsing logic. 2404 // A basic test that verifies the field trial triggered parsing logic.
2179 TEST_F(SearchProviderTest, FieldTrialTriggeredParsing) { 2405 TEST_F(SearchProviderTest, FieldTrialTriggeredParsing) {
2180 QueryForInput(ASCIIToUTF16("foo"), false, false); 2406 QueryForInputAndWaitForFetcherResponses(
2181 2407 ASCIIToUTF16("foo"), false,
2182 // Make sure the default providers suggest service was queried.
2183 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
2184 SearchProvider::kDefaultProviderURLFetcherID);
2185 ASSERT_TRUE(fetcher);
2186
2187 // Tell the SearchProvider the suggest query is done.
2188 fetcher->set_response_code(200);
2189 fetcher->SetResponseString(
2190 "[\"foo\",[\"foo bar\"],[\"\"],[]," 2408 "[\"foo\",[\"foo bar\"],[\"\"],[],"
2191 "{\"google:suggesttype\":[\"QUERY\"]," 2409 "{\"google:suggesttype\":[\"QUERY\"],"
2192 "\"google:fieldtrialtriggered\":true}]"); 2410 "\"google:fieldtrialtriggered\":true}]",
2193 fetcher->delegate()->OnURLFetchComplete(fetcher); 2411 std::string());
2194 fetcher = NULL;
2195
2196 // Run till the history results complete.
2197 RunTillProviderDone();
2198 2412
2199 { 2413 {
2200 // Check for the match and field trial triggered bits. 2414 // Check for the match and field trial triggered bits.
2201 AutocompleteMatch match; 2415 AutocompleteMatch match;
2202 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("foo bar"), &match)); 2416 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("foo bar"), &match));
2203 ProvidersInfo providers_info; 2417 ProvidersInfo providers_info;
2204 provider_->AddProviderInfo(&providers_info); 2418 provider_->AddProviderInfo(&providers_info);
2205 ASSERT_EQ(1U, providers_info.size()); 2419 ASSERT_EQ(1U, providers_info.size());
2206 EXPECT_EQ(1, providers_info[0].field_trial_triggered_size()); 2420 EXPECT_EQ(1, providers_info[0].field_trial_triggered_size());
2207 EXPECT_EQ(1, providers_info[0].field_trial_triggered_in_session_size()); 2421 EXPECT_EQ(1, providers_info[0].field_trial_triggered_in_session_size());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 { "abc.com ", "http://www.abc.com", 2491 { "abc.com ", "http://www.abc.com",
2278 "www.abc.com", std::string(), true, true }, 2492 "www.abc.com", std::string(), true, true },
2279 { "abc.com/ ", "http://www.abc.com", 2493 { "abc.com/ ", "http://www.abc.com",
2280 "www.abc.com", std::string(), true, true }, 2494 "www.abc.com", std::string(), true, true },
2281 { "abc.com ", "http://www.abc.com/bar", 2495 { "abc.com ", "http://www.abc.com/bar",
2282 "www.abc.com/bar", "/bar", false, false }, 2496 "www.abc.com/bar", "/bar", false, false },
2283 2497
2284 // A suggestion that's equivalent to what the input gets fixed up to 2498 // A suggestion that's equivalent to what the input gets fixed up to
2285 // should be inlined. 2499 // should be inlined.
2286 { "abc.com:", "http://abc.com/", 2500 { "abc.com:", "http://abc.com/",
2287 "abc.com", "", true, true }, 2501 "abc.com", std::string(), true, true },
2288 { "abc.com:", "http://www.abc.com", 2502 { "abc.com:", "http://www.abc.com",
2289 "www.abc.com", "", true, true }, 2503 "www.abc.com", std::string(), true, true },
2290 2504
2291 // Inline matches when the input is a leading substring of the scheme. 2505 // Inline matches when the input is a leading substring of the scheme.
2292 { "h", "http://www.abc.com", 2506 { "h", "http://www.abc.com",
2293 "http://www.abc.com", "ttp://www.abc.com", true, false }, 2507 "http://www.abc.com", "ttp://www.abc.com", true, false },
2294 { "http", "http://www.abc.com", 2508 { "http", "http://www.abc.com",
2295 "http://www.abc.com", "://www.abc.com", true, false }, 2509 "http://www.abc.com", "://www.abc.com", true, false },
2296 2510
2297 // Inline matches when the input is a leading substring of the full URL. 2511 // Inline matches when the input is a leading substring of the full URL.
2298 { "http:", "http://www.abc.com", 2512 { "http:", "http://www.abc.com",
2299 "http://www.abc.com", "//www.abc.com", true, false }, 2513 "http://www.abc.com", "//www.abc.com", true, false },
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2364 "c.com/path/file.htm?q=x#foo", true, false }, 2578 "c.com/path/file.htm?q=x#foo", true, false },
2365 { "ab", "https://www.abc.com/path/file.htm?q=x#foo", 2579 { "ab", "https://www.abc.com/path/file.htm?q=x#foo",
2366 "https://www.abc.com/path/file.htm?q=x#foo", 2580 "https://www.abc.com/path/file.htm?q=x#foo",
2367 "c.com/path/file.htm?q=x#foo", true, false }, 2581 "c.com/path/file.htm?q=x#foo", true, false },
2368 { "ab", "https://abc.com/path/file.htm?q=x#foo", 2582 { "ab", "https://abc.com/path/file.htm?q=x#foo",
2369 "https://abc.com/path/file.htm?q=x#foo", 2583 "https://abc.com/path/file.htm?q=x#foo",
2370 "c.com/path/file.htm?q=x#foo", true, false }, 2584 "c.com/path/file.htm?q=x#foo", true, false },
2371 2585
2372 // Forced query input should inline and retain the "?" prefix. 2586 // Forced query input should inline and retain the "?" prefix.
2373 { "?http://www.ab", "http://www.abc.com", 2587 { "?http://www.ab", "http://www.abc.com",
2374 "?http://www.abc.com", "c.com", true, false }, 2588 "?http://www.abc.com", "c.com", true, false },
2375 { "?www.ab", "http://www.abc.com", 2589 { "?www.ab", "http://www.abc.com",
2376 "?www.abc.com", "c.com", true, false }, 2590 "?www.abc.com", "c.com", true, false },
2377 { "?ab", "http://www.abc.com", 2591 { "?ab", "http://www.abc.com",
2378 "?www.abc.com", "c.com", true, false }, 2592 "?www.abc.com", "c.com", true, false },
2379 { "?abc.com", "http://www.abc.com", 2593 { "?abc.com", "http://www.abc.com",
2380 "?www.abc.com", "", true, true }, 2594 "?www.abc.com", std::string(), true, true },
2381 }; 2595 };
2382 2596
2383 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 2597 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2384 // First test regular mode. 2598 // First test regular mode.
2385 QueryForInput(ASCIIToUTF16(cases[i].input), false, false); 2599 QueryForInput(ASCIIToUTF16(cases[i].input), false, false);
2386 AutocompleteMatch match( 2600 SearchSuggestionParser::NavigationResult result(
2387 provider_->NavigationToMatch(SearchSuggestionParser::NavigationResult( 2601 ChromeAutocompleteSchemeClassifier(&profile_), GURL(cases[i].url),
2388 ChromeAutocompleteSchemeClassifier(&profile_), GURL(cases[i].url), 2602 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(),
2389 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(), 2603 false, 0, false, ASCIIToUTF16(cases[i].input), std::string());
2390 false, 0, false, ASCIIToUTF16(cases[i].input), std::string()))); 2604 result.set_received_after_last_keystroke(false);
2605 AutocompleteMatch match(provider_->NavigationToMatch(result));
2391 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion), 2606 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
2392 match.inline_autocompletion); 2607 match.inline_autocompletion);
2393 EXPECT_EQ(ASCIIToUTF16(cases[i].fill_into_edit), match.fill_into_edit); 2608 EXPECT_EQ(ASCIIToUTF16(cases[i].fill_into_edit), match.fill_into_edit);
2394 EXPECT_EQ(cases[i].allowed_to_be_default_match_in_regular_mode, 2609 EXPECT_EQ(cases[i].allowed_to_be_default_match_in_regular_mode,
2395 match.allowed_to_be_default_match); 2610 match.allowed_to_be_default_match);
2396 2611
2397 // Then test prevent-inline-autocomplete mode. 2612 // Then test prevent-inline-autocomplete mode.
2398 QueryForInput(ASCIIToUTF16(cases[i].input), true, false); 2613 QueryForInput(ASCIIToUTF16(cases[i].input), true, false);
2614 SearchSuggestionParser::NavigationResult result_prevent_inline(
2615 ChromeAutocompleteSchemeClassifier(&profile_), GURL(cases[i].url),
2616 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(),
2617 false, 0, false, ASCIIToUTF16(cases[i].input), std::string());
2618 result_prevent_inline.set_received_after_last_keystroke(false);
2399 AutocompleteMatch match_prevent_inline( 2619 AutocompleteMatch match_prevent_inline(
2400 provider_->NavigationToMatch(SearchSuggestionParser::NavigationResult( 2620 provider_->NavigationToMatch(result_prevent_inline));
2401 ChromeAutocompleteSchemeClassifier(&profile_), GURL(cases[i].url),
2402 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(),
2403 false, 0, false, ASCIIToUTF16(cases[i].input), std::string())));
2404 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion), 2621 EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
2405 match_prevent_inline.inline_autocompletion); 2622 match_prevent_inline.inline_autocompletion);
2406 EXPECT_EQ(ASCIIToUTF16(cases[i].fill_into_edit), 2623 EXPECT_EQ(ASCIIToUTF16(cases[i].fill_into_edit),
2407 match_prevent_inline.fill_into_edit); 2624 match_prevent_inline.fill_into_edit);
2408 EXPECT_EQ(cases[i].allowed_to_be_default_match_in_prevent_inline_mode, 2625 EXPECT_EQ(cases[i].allowed_to_be_default_match_in_prevent_inline_mode,
2409 match_prevent_inline.allowed_to_be_default_match); 2626 match_prevent_inline.allowed_to_be_default_match);
2410 } 2627 }
2411 } 2628 }
2412 2629
2413 // Verifies that "http://" is not trimmed for input that is a leading substring. 2630 // Verifies that "http://" is not trimmed for input that is a leading substring.
2414 TEST_F(SearchProviderTest, NavigationInlineSchemeSubstring) { 2631 TEST_F(SearchProviderTest, NavigationInlineSchemeSubstring) {
2415 const base::string16 input(ASCIIToUTF16("ht")); 2632 const base::string16 input(ASCIIToUTF16("ht"));
2416 const base::string16 url(ASCIIToUTF16("http://a.com")); 2633 const base::string16 url(ASCIIToUTF16("http://a.com"));
2417 const SearchSuggestionParser::NavigationResult result( 2634 SearchSuggestionParser::NavigationResult result(
2418 ChromeAutocompleteSchemeClassifier(&profile_), GURL(url), 2635 ChromeAutocompleteSchemeClassifier(&profile_), GURL(url),
2419 AutocompleteMatchType::NAVSUGGEST, 2636 AutocompleteMatchType::NAVSUGGEST,
2420 base::string16(), std::string(), false, 0, false, input, std::string()); 2637 base::string16(), std::string(), false, 0, false, input, std::string());
2638 result.set_received_after_last_keystroke(false);
2421 2639
2422 // Check the offset and strings when inline autocompletion is allowed. 2640 // Check the offset and strings when inline autocompletion is allowed.
2423 QueryForInput(input, false, false); 2641 QueryForInput(input, false, false);
2424 AutocompleteMatch match_inline(provider_->NavigationToMatch(result)); 2642 AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
2425 EXPECT_EQ(url, match_inline.fill_into_edit); 2643 EXPECT_EQ(url, match_inline.fill_into_edit);
2426 EXPECT_EQ(url.substr(2), match_inline.inline_autocompletion); 2644 EXPECT_EQ(url.substr(2), match_inline.inline_autocompletion);
2427 EXPECT_TRUE(match_inline.allowed_to_be_default_match); 2645 EXPECT_TRUE(match_inline.allowed_to_be_default_match);
2428 EXPECT_EQ(url, match_inline.contents); 2646 EXPECT_EQ(url, match_inline.contents);
2429 2647
2430 // Check the same strings when inline autocompletion is prevented. 2648 // Check the same strings when inline autocompletion is prevented.
2431 QueryForInput(input, true, false); 2649 QueryForInput(input, true, false);
2432 AutocompleteMatch match_prevent(provider_->NavigationToMatch(result)); 2650 AutocompleteMatch match_prevent(provider_->NavigationToMatch(result));
2433 EXPECT_EQ(url, match_prevent.fill_into_edit); 2651 EXPECT_EQ(url, match_prevent.fill_into_edit);
2434 EXPECT_FALSE(match_prevent.allowed_to_be_default_match); 2652 EXPECT_FALSE(match_prevent.allowed_to_be_default_match);
2435 EXPECT_EQ(url, match_prevent.contents); 2653 EXPECT_EQ(url, match_prevent.contents);
2436 } 2654 }
2437 2655
2438 // Verifies that input "w" marks a more significant domain label than "www.". 2656 // Verifies that input "w" marks a more significant domain label than "www.".
2439 TEST_F(SearchProviderTest, NavigationInlineDomainClassify) { 2657 TEST_F(SearchProviderTest, NavigationInlineDomainClassify) {
2440 QueryForInput(ASCIIToUTF16("w"), false, false); 2658 QueryForInput(ASCIIToUTF16("w"), false, false);
2441 AutocompleteMatch match( 2659 SearchSuggestionParser::NavigationResult result(
2442 provider_->NavigationToMatch(SearchSuggestionParser::NavigationResult( 2660 ChromeAutocompleteSchemeClassifier(&profile_),
2443 ChromeAutocompleteSchemeClassifier(&profile_), 2661 GURL("http://www.wow.com"), AutocompleteMatchType::NAVSUGGEST,
2444 GURL("http://www.wow.com"), 2662 base::string16(), std::string(), false, 0, false, ASCIIToUTF16("w"),
2445 AutocompleteMatchType::NAVSUGGEST, base::string16(), std::string(), 2663 std::string());
2446 false, 0, false, ASCIIToUTF16("w"), std::string()))); 2664 result.set_received_after_last_keystroke(false);
2665 AutocompleteMatch match(provider_->NavigationToMatch(result));
2447 EXPECT_EQ(ASCIIToUTF16("ow.com"), match.inline_autocompletion); 2666 EXPECT_EQ(ASCIIToUTF16("ow.com"), match.inline_autocompletion);
2448 EXPECT_TRUE(match.allowed_to_be_default_match); 2667 EXPECT_TRUE(match.allowed_to_be_default_match);
2449 EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.fill_into_edit); 2668 EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.fill_into_edit);
2450 EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.contents); 2669 EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.contents);
2451 2670
2452 // Ensure that the match for input "w" is marked on "wow" and not "www". 2671 // Ensure that the match for input "w" is marked on "wow" and not "www".
2453 ASSERT_EQ(3U, match.contents_class.size()); 2672 ASSERT_EQ(3U, match.contents_class.size());
2454 EXPECT_EQ(0U, match.contents_class[0].offset); 2673 EXPECT_EQ(0U, match.contents_class[0].offset);
2455 EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL, 2674 EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL,
2456 match.contents_class[0].style); 2675 match.contents_class[0].style);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2504 "\"google:suggesttype\":[\"QUERY\",\"ENTITY\"]}]", 2723 "\"google:suggesttype\":[\"QUERY\",\"ENTITY\"]}]",
2505 { { "x", "", "", "x", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED }, 2724 { { "x", "", "", "x", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED },
2506 { "xy", "", "", "xy", AutocompleteMatchType::SEARCH_SUGGEST }, 2725 { "xy", "", "", "xy", AutocompleteMatchType::SEARCH_SUGGEST },
2507 { "xy", "A", "p=v", "xy", 2726 { "xy", "A", "p=v", "xy",
2508 AutocompleteMatchType::SEARCH_SUGGEST_ENTITY }, 2727 AutocompleteMatchType::SEARCH_SUGGEST_ENTITY },
2509 kEmptyMatch, 2728 kEmptyMatch,
2510 kEmptyMatch 2729 kEmptyMatch
2511 }, 2730 },
2512 }, 2731 },
2513 }; 2732 };
2514 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 2733 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2515 QueryForInput(ASCIIToUTF16(cases[i].input_text), false, false); 2734 QueryForInputAndWaitForFetcherResponses(
2516 2735 ASCIIToUTF16(cases[i].input_text), false, cases[i].response_json,
2517 // Set up a default fetcher with provided results. 2736 std::string());
2518 net::TestURLFetcher* fetcher =
2519 test_factory_.GetFetcherByID(
2520 SearchProvider::kDefaultProviderURLFetcherID);
2521 ASSERT_TRUE(fetcher);
2522 fetcher->set_response_code(200);
2523 fetcher->SetResponseString(cases[i].response_json);
2524 fetcher->delegate()->OnURLFetchComplete(fetcher);
2525
2526 RunTillProviderDone();
2527 2737
2528 const ACMatches& matches = provider_->matches(); 2738 const ACMatches& matches = provider_->matches();
2529 ASSERT_FALSE(matches.empty()); 2739 ASSERT_FALSE(matches.empty());
2530 2740
2531 SCOPED_TRACE("for input with json = " + cases[i].response_json); 2741 SCOPED_TRACE("for input with json = " + cases[i].response_json);
2532 2742
2533 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches)); 2743 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
2534 size_t j = 0; 2744 size_t j = 0;
2535 // Ensure that the returned matches equal the expectations. 2745 // Ensure that the returned matches equal the expectations.
2536 for (; j < matches.size(); ++j) { 2746 for (; j < matches.size(); ++j) {
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
2639 "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]", 2849 "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
2640 { { "a", false, AutocompleteMatchType::SEARCH_OTHER_ENGINE, true}, 2850 { { "a", false, AutocompleteMatchType::SEARCH_OTHER_ENGINE, true},
2641 { "k a", false, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, false }, 2851 { "k a", false, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, false },
2642 { "ab", false, AutocompleteMatchType::SEARCH_SUGGEST, false }, 2852 { "ab", false, AutocompleteMatchType::SEARCH_SUGGEST, false },
2643 { "c", false, AutocompleteMatchType::SEARCH_SUGGEST, true }, 2853 { "c", false, AutocompleteMatchType::SEARCH_SUGGEST, true },
2644 { "b", false, AutocompleteMatchType::SEARCH_SUGGEST, true } 2854 { "b", false, AutocompleteMatchType::SEARCH_SUGGEST, true }
2645 }, 2855 },
2646 } 2856 }
2647 }; 2857 };
2648 2858
2649 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 2859 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2650 QueryForInput(ASCIIToUTF16(cases[i].input_text), false, 2860 QueryForInputAndWaitForFetcherResponses(
2651 cases[i].prefer_keyword_provider_results); 2861 ASCIIToUTF16(cases[i].input_text),
2652 2862 cases[i].prefer_keyword_provider_results,
2653 // Set up a default fetcher with provided results. 2863 cases[i].default_provider_response_json,
2654 net::TestURLFetcher* fetcher = 2864 cases[i].prefer_keyword_provider_results ?
2655 test_factory_.GetFetcherByID( 2865 cases[i].keyword_provider_response_json : std::string());
2656 SearchProvider::kDefaultProviderURLFetcherID);
2657 ASSERT_TRUE(fetcher);
2658 fetcher->set_response_code(200);
2659 fetcher->SetResponseString(cases[i].default_provider_response_json);
2660 fetcher->delegate()->OnURLFetchComplete(fetcher);
2661
2662 if (cases[i].prefer_keyword_provider_results) {
2663 // Set up a keyword fetcher with provided results.
2664 net::TestURLFetcher* keyword_fetcher =
2665 test_factory_.GetFetcherByID(
2666 SearchProvider::kKeywordProviderURLFetcherID);
2667 ASSERT_TRUE(keyword_fetcher);
2668 keyword_fetcher->set_response_code(200);
2669 keyword_fetcher->SetResponseString(
2670 cases[i].keyword_provider_response_json);
2671 keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
2672 keyword_fetcher = NULL;
2673 }
2674
2675 RunTillProviderDone();
2676 2866
2677 const std::string description = 2867 const std::string description =
2678 "for input with json =" + cases[i].default_provider_response_json; 2868 "for input with json =" + cases[i].default_provider_response_json;
2679 const ACMatches& matches = provider_->matches(); 2869 const ACMatches& matches = provider_->matches();
2680 // The top match must inline and score as highly as calculated verbatim. 2870 // The top match must inline and score as highly as calculated verbatim.
2681 ASSERT_FALSE(matches.empty()); 2871 ASSERT_FALSE(matches.empty());
2682 EXPECT_GE(matches[0].relevance, 1300); 2872 EXPECT_GE(matches[0].relevance, 1300);
2683 2873
2684 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches)); 2874 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
2685 // Ensure that the returned matches equal the expectations. 2875 // Ensure that the returned matches equal the expectations.
2686 for (size_t j = 0; j < matches.size(); ++j) { 2876 for (size_t j = 0; j < matches.size(); ++j) {
2687 SCOPED_TRACE(description); 2877 SCOPED_TRACE(description);
2688 EXPECT_EQ(cases[i].matches[j].contents, 2878 EXPECT_EQ(cases[i].matches[j].contents,
2689 base::UTF16ToUTF8(matches[j].contents)); 2879 base::UTF16ToUTF8(matches[j].contents));
2690 EXPECT_EQ(cases[i].matches[j].allowed_to_be_prefetched, 2880 EXPECT_EQ(cases[i].matches[j].allowed_to_be_prefetched,
2691 SearchProvider::ShouldPrefetch(matches[j])); 2881 SearchProvider::ShouldPrefetch(matches[j]));
2692 EXPECT_EQ(cases[i].matches[j].type, matches[j].type); 2882 EXPECT_EQ(cases[i].matches[j].type, matches[j].type);
2693 EXPECT_EQ(cases[i].matches[j].from_keyword, 2883 EXPECT_EQ(cases[i].matches[j].from_keyword,
2694 matches[j].keyword == ASCIIToUTF16("k")); 2884 matches[j].keyword == ASCIIToUTF16("k"));
2695 } 2885 }
2696 } 2886 }
2697 } 2887 }
2698 2888
2699 TEST_F(SearchProviderTest, XSSIGuardedJSONParsing_InvalidResponse) { 2889 TEST_F(SearchProviderTest, XSSIGuardedJSONParsing_InvalidResponse) {
2700 ClearAllResults(); 2890 ClearAllResults();
2701 2891
2702 std::string input_str("abc"); 2892 std::string input_str("abc");
2703 QueryForInput(ASCIIToUTF16(input_str), false, false); 2893 QueryForInputAndWaitForFetcherResponses(
2704 2894 ASCIIToUTF16(input_str), false, "this is a bad non-json response",
2705 // Set up a default fetcher with provided results. 2895 std::string());
2706 net::TestURLFetcher* fetcher =
2707 test_factory_.GetFetcherByID(
2708 SearchProvider::kDefaultProviderURLFetcherID);
2709 ASSERT_TRUE(fetcher);
2710 fetcher->set_response_code(200);
2711 fetcher->SetResponseString("this is a bad non-json response");
2712 fetcher->delegate()->OnURLFetchComplete(fetcher);
2713
2714 RunTillProviderDone();
2715 2896
2716 const ACMatches& matches = provider_->matches(); 2897 const ACMatches& matches = provider_->matches();
2717 2898
2718 // Should have exactly one "search what you typed" match 2899 // Should have exactly one "search what you typed" match
2719 ASSERT_TRUE(matches.size() == 1); 2900 ASSERT_TRUE(matches.size() == 1);
2720 EXPECT_EQ(input_str, base::UTF16ToUTF8(matches[0].contents)); 2901 EXPECT_EQ(input_str, base::UTF16ToUTF8(matches[0].contents));
2721 EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, 2902 EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
2722 matches[0].type); 2903 matches[0].type);
2723 } 2904 }
2724 2905
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2766 "{\"google:suggesttype\":[\"QUERY\",\"QUERY\"]," 2947 "{\"google:suggesttype\":[\"QUERY\",\"QUERY\"],"
2767 "\"google:suggestrelevance\":[1, 2]}]", 2948 "\"google:suggestrelevance\":[1, 2]}]",
2768 { { "a", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED }, 2949 { { "a", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED },
2769 { "c", AutocompleteMatchType::SEARCH_SUGGEST }, 2950 { "c", AutocompleteMatchType::SEARCH_SUGGEST },
2770 { "b", AutocompleteMatchType::SEARCH_SUGGEST }, 2951 { "b", AutocompleteMatchType::SEARCH_SUGGEST },
2771 kEmptyMatch, 2952 kEmptyMatch,
2772 }, 2953 },
2773 }, 2954 },
2774 }; 2955 };
2775 2956
2776 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 2957 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2777 ClearAllResults(); 2958 ClearAllResults();
2778 QueryForInput(ASCIIToUTF16(cases[i].input_text), false, false); 2959 QueryForInputAndWaitForFetcherResponses(
2779 2960 ASCIIToUTF16(cases[i].input_text), false,
2780 // Set up a default fetcher with provided results. 2961 cases[i].default_provider_response_json, std::string());
2781 net::TestURLFetcher* fetcher =
2782 test_factory_.GetFetcherByID(
2783 SearchProvider::kDefaultProviderURLFetcherID);
2784 ASSERT_TRUE(fetcher);
2785 fetcher->set_response_code(200);
2786 fetcher->SetResponseString(cases[i].default_provider_response_json);
2787 fetcher->delegate()->OnURLFetchComplete(fetcher);
2788
2789 RunTillProviderDone();
2790 2962
2791 const ACMatches& matches = provider_->matches(); 2963 const ACMatches& matches = provider_->matches();
2792 // The top match must inline and score as highly as calculated verbatim. 2964 // The top match must inline and score as highly as calculated verbatim.
2793 ASSERT_FALSE(matches.empty()); 2965 ASSERT_FALSE(matches.empty());
2794 EXPECT_GE(matches[0].relevance, 1300); 2966 EXPECT_GE(matches[0].relevance, 1300);
2795 2967
2796 SCOPED_TRACE("for case: " + base::IntToString(i)); 2968 SCOPED_TRACE("for case: " + base::IntToString(i));
2797 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches)); 2969 ASSERT_LE(matches.size(), ARRAYSIZE_UNSAFE(cases[i].matches));
2798 size_t j = 0; 2970 size_t j = 0;
2799 // Ensure that the returned matches equal the expectations. 2971 // Ensure that the returned matches equal the expectations.
(...skipping 14 matching lines...) Expand all
2814 // Test that deletion url gets set on an AutocompleteMatch when available for a 2986 // Test that deletion url gets set on an AutocompleteMatch when available for a
2815 // personalized query or a personalized URL. 2987 // personalized query or a personalized URL.
2816 TEST_F(SearchProviderTest, ParseDeletionUrl) { 2988 TEST_F(SearchProviderTest, ParseDeletionUrl) {
2817 struct Match { 2989 struct Match {
2818 std::string contents; 2990 std::string contents;
2819 std::string deletion_url; 2991 std::string deletion_url;
2820 AutocompleteMatchType::Type type; 2992 AutocompleteMatchType::Type type;
2821 }; 2993 };
2822 2994
2823 const Match kEmptyMatch = { 2995 const Match kEmptyMatch = {
2824 kNotApplicable, "", AutocompleteMatchType::NUM_TYPES 2996 kNotApplicable, std::string(), AutocompleteMatchType::NUM_TYPES
2825 }; 2997 };
2826 2998
2827 const char* url[] = { 2999 const char* url[] = {
2828 "http://defaultturl/complete/deleteitems" 3000 "http://defaultturl/complete/deleteitems"
2829 "?delq=ab&client=chrome&deltok=xsrf124", 3001 "?delq=ab&client=chrome&deltok=xsrf124",
2830 "http://defaultturl/complete/deleteitems" 3002 "http://defaultturl/complete/deleteitems"
2831 "?delq=www.amazon.com&client=chrome&deltok=xsrf123", 3003 "?delq=www.amazon.com&client=chrome&deltok=xsrf123",
2832 }; 3004 };
2833 3005
2834 struct { 3006 struct {
2835 const std::string input_text; 3007 const std::string input_text;
2836 const std::string response_json; 3008 const std::string response_json;
2837 const Match matches[5]; 3009 const Match matches[5];
2838 } cases[] = { 3010 } cases[] = {
2839 // A deletion URL on a personalized query should be reflected in the 3011 // A deletion URL on a personalized query should be reflected in the
2840 // resulting AutocompleteMatch. 3012 // resulting AutocompleteMatch.
2841 { "a", 3013 { "a",
2842 "[\"a\",[\"ab\", \"ac\",\"www.amazon.com\"],[],[]," 3014 "[\"a\",[\"ab\", \"ac\",\"www.amazon.com\"],[],[],"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2882 { { "a", "", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED }, 3054 { { "a", "", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED },
2883 { "ac", "", AutocompleteMatchType::SEARCH_SUGGEST }, 3055 { "ac", "", AutocompleteMatchType::SEARCH_SUGGEST },
2884 { "ab", "", AutocompleteMatchType::SEARCH_SUGGEST }, 3056 { "ab", "", AutocompleteMatchType::SEARCH_SUGGEST },
2885 { "www.amazon.com", "", 3057 { "www.amazon.com", "",
2886 AutocompleteMatchType::NAVSUGGEST_PERSONALIZED }, 3058 AutocompleteMatchType::NAVSUGGEST_PERSONALIZED },
2887 kEmptyMatch, 3059 kEmptyMatch,
2888 }, 3060 },
2889 }, 3061 },
2890 }; 3062 };
2891 3063
2892 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) { 3064 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
2893 QueryForInput(ASCIIToUTF16(cases[i].input_text), false, false); 3065 QueryForInputAndWaitForFetcherResponses(
2894 3066 ASCIIToUTF16(cases[i].input_text), false, cases[i].response_json,
2895 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID( 3067 std::string());
2896 SearchProvider::kDefaultProviderURLFetcherID);
2897 ASSERT_TRUE(fetcher);
2898 fetcher->set_response_code(200);
2899 fetcher->SetResponseString(cases[i].response_json);
2900 fetcher->delegate()->OnURLFetchComplete(fetcher);
2901
2902 RunTillProviderDone();
2903 3068
2904 const ACMatches& matches = provider_->matches(); 3069 const ACMatches& matches = provider_->matches();
2905 ASSERT_FALSE(matches.empty()); 3070 ASSERT_FALSE(matches.empty());
2906 3071
2907 SCOPED_TRACE("for input with json = " + cases[i].response_json); 3072 SCOPED_TRACE("for input with json = " + cases[i].response_json);
2908 3073
2909 for (size_t j = 0; j < matches.size(); ++j) { 3074 for (size_t j = 0; j < matches.size(); ++j) {
2910 const Match& match = cases[i].matches[j]; 3075 const Match& match = cases[i].matches[j];
2911 SCOPED_TRACE(" and match index: " + base::IntToString(j)); 3076 SCOPED_TRACE(" and match index: " + base::IntToString(j));
2912 EXPECT_EQ(match.contents, base::UTF16ToUTF8(matches[j].contents)); 3077 EXPECT_EQ(match.contents, base::UTF16ToUTF8(matches[j].contents));
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
3127 EXPECT_FALSE(FindMatchWithContents(ASCIIToUTF16("flash games"), &games)); 3292 EXPECT_FALSE(FindMatchWithContents(ASCIIToUTF16("flash games"), &games));
3128 } 3293 }
3129 3294
3130 // Verifies that duplicates are preserved in AddMatchToMap(). 3295 // Verifies that duplicates are preserved in AddMatchToMap().
3131 TEST_F(SearchProviderTest, CheckDuplicateMatchesSaved) { 3296 TEST_F(SearchProviderTest, CheckDuplicateMatchesSaved) {
3132 AddSearchToHistory(default_t_url_, ASCIIToUTF16("a"), 1); 3297 AddSearchToHistory(default_t_url_, ASCIIToUTF16("a"), 1);
3133 AddSearchToHistory(default_t_url_, ASCIIToUTF16("alpha"), 1); 3298 AddSearchToHistory(default_t_url_, ASCIIToUTF16("alpha"), 1);
3134 AddSearchToHistory(default_t_url_, ASCIIToUTF16("avid"), 1); 3299 AddSearchToHistory(default_t_url_, ASCIIToUTF16("avid"), 1);
3135 3300
3136 profile_.BlockUntilHistoryProcessesPendingRequests(); 3301 profile_.BlockUntilHistoryProcessesPendingRequests();
3137 QueryForInput(ASCIIToUTF16("a"), false, false); 3302 QueryForInputAndWaitForFetcherResponses(
3138 3303 ASCIIToUTF16("a"), false,
3139 // Make sure the default provider's suggest service was queried.
3140 net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
3141 SearchProvider::kDefaultProviderURLFetcherID);
3142 ASSERT_TRUE(fetcher);
3143
3144 // Tell the SearchProvider the suggest query is done.
3145 fetcher->set_response_code(200);
3146 fetcher->SetResponseString(
3147 "[\"a\",[\"a\", \"alpha\", \"avid\", \"apricot\"],[],[]," 3304 "[\"a\",[\"a\", \"alpha\", \"avid\", \"apricot\"],[],[],"
3148 "{\"google:suggestrelevance\":[1450, 1200, 1150, 1100]," 3305 "{\"google:suggestrelevance\":[1450, 1200, 1150, 1100],"
3149 "\"google:verbatimrelevance\":1350}]"); 3306 "\"google:verbatimrelevance\":1350}]",
3150 fetcher->delegate()->OnURLFetchComplete(fetcher); 3307 std::string());
3151 fetcher = NULL;
3152
3153 // Run till the history results complete.
3154 RunTillProviderDone();
3155 3308
3156 AutocompleteMatch verbatim, match_alpha, match_apricot, match_avid; 3309 AutocompleteMatch verbatim, match_alpha, match_apricot, match_avid;
3157 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a"), &verbatim)); 3310 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a"), &verbatim));
3158 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("alpha"), &match_alpha)); 3311 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("alpha"), &match_alpha));
3159 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("apricot"), &match_apricot)); 3312 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("apricot"), &match_apricot));
3160 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("avid"), &match_avid)); 3313 EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("avid"), &match_avid));
3161 3314
3162 // Verbatim match duplicates are added such that each one has a higher 3315 // Verbatim match duplicates are added such that each one has a higher
3163 // relevance than the previous one. 3316 // relevance than the previous one.
3164 EXPECT_EQ(2U, verbatim.duplicate_matches.size()); 3317 EXPECT_EQ(2U, verbatim.duplicate_matches.size());
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
3260 AutocompleteInput input(base::ASCIIToUTF16("weather l"), 3413 AutocompleteInput input(base::ASCIIToUTF16("weather l"),
3261 base::string16::npos, base::string16(), GURL(), 3414 base::string16::npos, base::string16(), GURL(),
3262 metrics::OmniboxEventProto::INVALID_SPEC, false, 3415 metrics::OmniboxEventProto::INVALID_SPEC, false,
3263 false, true, true, 3416 false, true, true,
3264 ChromeAutocompleteSchemeClassifier(&profile_)); 3417 ChromeAutocompleteSchemeClassifier(&profile_));
3265 provider_->DoAnswersQuery(input); 3418 provider_->DoAnswersQuery(input);
3266 EXPECT_EQ(base::ASCIIToUTF16("weather los angeles"), 3419 EXPECT_EQ(base::ASCIIToUTF16("weather los angeles"),
3267 provider_->prefetch_data_.full_query_text); 3420 provider_->prefetch_data_.full_query_text);
3268 EXPECT_EQ(base::ASCIIToUTF16("2334"), provider_->prefetch_data_.query_type); 3421 EXPECT_EQ(base::ASCIIToUTF16("2334"), provider_->prefetch_data_.query_type);
3269 } 3422 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ui/search/instant_extended_interactive_uitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698