search_provider_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/search_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <string>
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/field_trial.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string16.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_input.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider_listener.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/autocomplete/history_url_provider.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/omnibox/omnibox_field_trial.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/chrome_switches.h"
34c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/common/metrics/variations/variations_util.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/entropy_provider.h"
39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// SearchProviderTest ---------------------------------------------------------
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following environment is configured for these tests:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The TemplateURL default_t_url_ is set as the default provider.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The TemplateURL keyword_t_url_ is added to the TemplateURLService. This
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   TemplateURL has a valid suggest and search URL.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The URL created by using the search term term1_ with default_t_url_ is
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   added to history.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . The URL created by using the search term keyword_term_ with keyword_t_url_
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   is added to history.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . test_factory_ is set as the URLFetcherFactory.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchProviderTest : public testing::Test,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public AutocompleteProviderListener {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct ResultInfo {
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ResultInfo() : result_type(AutocompleteMatchType::NUM_TYPES) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResultInfo(GURL gurl,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               AutocompleteMatch::Type result_type,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               string16 fill_into_edit)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : gurl(gurl),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        result_type(result_type),
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fill_into_edit(fill_into_edit) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL gurl;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const AutocompleteMatch::Type result_type;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16 fill_into_edit;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct TestData {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const string16 input;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const size_t num_results;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ResultInfo output[3];
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SearchProviderTest()
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : default_t_url_(NULL),
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        term1_(ASCIIToUTF16("term1")),
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        keyword_t_url_(NULL),
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        keyword_term_(ASCIIToUTF16("keyword")),
85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        run_loop_(NULL) {
86c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    ResetFieldTrialList();
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // See description above class for what this registers.
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetUp() OVERRIDE;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void TearDown() OVERRIDE;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunTest(TestData* cases, int num_cases, bool prefer_keyword);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Needed for AutocompleteFieldTrial::ActivateStaticTrials();
97c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  scoped_ptr<base::FieldTrialList> field_trial_list_;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Default value used for testing.
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const std::string kNotApplicable;
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a search for |term|, using the engine |t_url| to the history, and
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returns the URL for that search.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL AddSearchToHistory(TemplateURL* t_url, string16 term, int visit_count);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for a match in |provider_| with |contents| equal to |contents|.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets |match| to it if found.  Returns whether |match| was set.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindMatchWithContents(const string16& contents,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             AutocompleteMatch* match);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for a match in |provider_| with destination |url|.  Sets |match| to
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it if found.  Returns whether |match| was set.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FindMatchWithDestination(const GURL& url, AutocompleteMatch* match);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutocompleteProviderListener:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're waiting for the provider to finish, this exits the message loop.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProviderUpdate(bool updated_matches) OVERRIDE;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs a nested message loop until provider_ is done. The message loop is
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // exited by way of OnProviderUpdate.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTillProviderDone();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invokes Start on provider_, then runs all pending tasks.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryForInput(const string16& text,
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     bool prevent_inline_autocomplete,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     bool prefer_keyword);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls QueryForInput(), finishes any suggest query, then if |wyt_match| is
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-NULL, sets it to the "what you typed" entry for |text|.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void QueryForInputAndSetWYTMatch(const string16& text,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   AutocompleteMatch* wyt_match);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the URLFetcher for the suggest query corresponding to the default
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // search provider that it's done.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishDefaultSuggestQuery();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  void ResetFieldTrialList();
139c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void ClearAllResults();
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See description above class for details of these fields.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURL* default_t_url_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 term1_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term1_url_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURL* keyword_t_url_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 keyword_term_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL keyword_url_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLFetcherFactory implementation registered.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcherFactory test_factory_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Profile we use.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The provider.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SearchProvider> provider_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // If non-NULL, OnProviderUpdate quits the current |run_loop_|.
162a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop* run_loop_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchProviderTest);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::string SearchProviderTest::kNotApplicable = "Not Applicable";
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::SetUp() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that fetchers are automatically ungregistered upon destruction.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_factory_.set_remove_fetcher_on_delete(true);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need both the history service and template url model loaded.
175bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  ASSERT_TRUE(profile_.CreateHistoryService(true, false));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* turl_model =
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(&profile_);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Load();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the default TemplateURL.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLData data;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.short_name = ASCIIToUTF16("t");
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://defaultturl/{searchTerms}");
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.suggestions_url = "http://defaultturl2/{searchTerms}";
189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  data.instant_url = "http://does/not/exist?strk=1";
190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  data.search_terms_replacement_key = "strk";
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_t_url_ = new TemplateURL(&profile_, data);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(default_t_url_);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->SetDefaultSearchProvider(default_t_url_);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID default_provider_id = default_t_url_->id();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, default_provider_id);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add url1, with search term term1_.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  term1_url_ = AddSearchToHistory(default_t_url_, term1_, 1);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another TemplateURL.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.short_name = ASCIIToUTF16("k");
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetKeyword(ASCIIToUTF16("k"));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://keyword/{searchTerms}");
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.suggestions_url = "http://suggest_keyword/{searchTerms}";
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_t_url_ = new TemplateURL(&profile_, data);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(keyword_t_url_);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, keyword_t_url_->id());
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a page and search term for keyword_t_url_.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_url_ = AddSearchToHistory(keyword_t_url_, keyword_term_, 1);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keywords are updated by the InMemoryHistoryBackend only after the message
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has been processed on the history thread. Block until history processes all
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests to ensure the InMemoryDatabase is the state we expect it.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_ = new SearchProvider(this, &profile_);
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  provider_->kMinimumTimeBetweenSuggestQueriesMs = 0;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchProviderTest::TearDown() {
222a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Shutdown the provider before the profile.
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  provider_ = NULL;
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SearchProviderTest::RunTest(TestData* cases,
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 int num_cases,
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 bool prefer_keyword) {
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ACMatches matches;
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (int i = 0; i < num_cases; ++i) {
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AutocompleteInput input(cases[i].input, string16::npos, string16(), GURL(),
234d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            AutocompleteInput::INVALID_SPEC, false,
235d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            prefer_keyword, true,
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            AutocompleteInput::ALL_MATCHES);
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    provider_->Start(input, false);
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    matches = provider_->matches();
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    string16 diagnostic_details = ASCIIToUTF16("Input was: ") + cases[i].input +
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        ASCIIToUTF16("; prefer_keyword was: ") +
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        (prefer_keyword ? ASCIIToUTF16("true") : ASCIIToUTF16("false"));
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(cases[i].num_results, matches.size()) << diagnostic_details;
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (matches.size() == cases[i].num_results) {
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      for (size_t j = 0; j < cases[i].num_results; ++j) {
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_EQ(cases[i].output[j].gurl, matches[j].destination_url) <<
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            diagnostic_details;
247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_EQ(cases[i].output[j].result_type, matches[j].type) <<
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            diagnostic_details;
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        EXPECT_EQ(cases[i].output[j].fill_into_edit,
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                  matches[j].fill_into_edit) <<
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            diagnostic_details;
252c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        // All callers that use this helper function at the moment produce
253c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        // matches that are always allowed to be the default match.
254c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        EXPECT_TRUE(matches[j].allowed_to_be_default_match);
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      }
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::OnProviderUpdate(bool updated_matches) {
261a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (run_loop_ && provider_->done()) {
262a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    run_loop_->Quit();
263a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    run_loop_ = NULL;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::RunTillProviderDone() {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (provider_->done())
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::RunLoop run_loop;
272a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  run_loop_ = &run_loop;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop.Run();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::QueryForInput(const string16& text,
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool prevent_inline_autocomplete,
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       bool prefer_keyword) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a query.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteInput input(text, string16::npos, string16(), GURL(),
281d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                          AutocompleteInput::INVALID_SPEC,
282d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                          prevent_inline_autocomplete, prefer_keyword, true,
283d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                          AutocompleteInput::ALL_MATCHES);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider_->Start(input, false);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RunUntilIdle so that the task scheduled by SearchProvider to create the
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLFetchers runs.
288a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::RunLoop().RunUntilIdle();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::QueryForInputAndSetWYTMatch(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& text,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteMatch* wyt_match) {
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(text, false, false);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!wyt_match)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GE(provider_->matches().size(), 1u);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(GURL(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_t_url_->url_ref().ReplaceSearchTerms(
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TemplateURLRef::SearchTermsArgs(text))),
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wyt_match));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL SearchProviderTest::AddSearchToHistory(TemplateURL* t_url,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            string16 term,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int visit_count) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* history =
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryServiceFactory::GetForProfile(&profile_,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           Profile::EXPLICIT_ACCESS);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL search(t_url->url_ref().ReplaceSearchTerms(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(term)));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static base::Time last_added_time;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_added_time = std::max(base::Time::Now(),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_added_time + base::TimeDelta::FromMicroseconds(1));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history->AddPageWithDetails(search, string16(), visit_count, visit_count,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_added_time, false, history::SOURCE_BROWSED);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history->SetKeywordSearchTermsForURL(search, t_url->id(), term);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return search;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchProviderTest::FindMatchWithContents(const string16& contents,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               AutocompleteMatch* match) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator i = provider_->matches().begin();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != provider_->matches().end(); ++i) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->contents == contents) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *match = *i;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SearchProviderTest::FindMatchWithDestination(const GURL& url,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  AutocompleteMatch* match) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ACMatches::const_iterator i = provider_->matches().begin();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != provider_->matches().end(); ++i) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i->destination_url == url) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *match = *i;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchProviderTest::FinishDefaultSuggestQuery() {
348a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  net::TestURLFetcher* default_fetcher =
349a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      test_factory_.GetFetcherByID(
350a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch          SearchProvider::kDefaultProviderURLFetcherID);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(default_fetcher);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the default suggest query is done.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->set_response_code(200);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
358c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochvoid SearchProviderTest::ResetFieldTrialList() {
359c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // Destroy the existing FieldTrialList before creating a new one to avoid
360c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // a DCHECK.
361c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  field_trial_list_.reset();
362c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  field_trial_list_.reset(new base::FieldTrialList(
363c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      new metrics::SHA1EntropyProvider("foo")));
364c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  chrome_variations::testing::ClearAllVariationParams();
365c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
366c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "AutocompleteDynamicTrial_0", "DefaultGroup");
367c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  trial->group();
368c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SearchProviderTest::ClearAllResults() {
3711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  provider_->ClearAllResults();
3721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Actual Tests ---------------------------------------------------------------
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure we query history for the default provider and a URLFetcher is
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created for the default provider suggest results.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, QueryDefaultProvider) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term = term1_.substr(0, term1_.length() - 1);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(term, false, false);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default providers suggest service was queried.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the URL matches what we expected.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_url(default_t_url_->suggestions_url_ref().ReplaceSearchTerms(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(term)));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher->GetOriginalURL() == expected_url);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->set_response_code(200);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher = NULL;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SearchProvider is done. Make sure it has a result for the history
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // term term1.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term1_match;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term1_url_, &term1_match));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Term1 should not have a description, it's set later.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(term1_match.description.empty());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(default_t_url_->url_ref().ReplaceSearchTerms(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TemplateURLRef::SearchTermsArgs(term))), &wyt_match));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(wyt_match.description.empty());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
413c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // The match for term1 should be more relevant than the what you typed match.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term1_match.relevance, wyt_match.relevance);
415c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // This longer match should be inlineable.
416c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term1_match.allowed_to_be_default_match);
417c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  // The what you typed match should be too, of course.
418c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, HonorPreventInlineAutocomplete) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term = term1_.substr(0, term1_.length() - 1);
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(term, true, false);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(provider_->matches().empty());
42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            provider_->matches()[0].type);
428c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(provider_->matches()[0].allowed_to_be_default_match);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Issues a query that matches the registered keyword and makes sure history
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is queried as well as URLFetchers getting created.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, QueryKeywordProvider) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term = keyword_term_.substr(0, keyword_term_.length() - 1);
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  QueryForInput(keyword_t_url_->keyword() + ASCIIToUTF16(" ") + term,
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false,
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                false);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default providers suggest service was queried.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID(
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(default_fetcher);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the default suggest query is done.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->set_response_code(200);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fetcher = NULL;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the keyword providers suggest service was queried.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* keyword_fetcher = test_factory_.GetFetcherByID(
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kKeywordProviderURLFetcherID);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(keyword_fetcher);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the URL matches what we expected.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_url(keyword_t_url_->suggestions_url_ref().ReplaceSearchTerms(
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(term)));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(keyword_fetcher->GetOriginalURL() == expected_url);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the keyword suggest query is done.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_fetcher->set_response_code(200);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyword_fetcher = NULL;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SearchProvider is done. Make sure it has a result for the history
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // term keyword.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch match;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(keyword_url_, &match));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The match should have an associated keyword.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(match.keyword.empty());
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The fill into edit should contain the keyword.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(keyword_t_url_->keyword() + char16(' ') + keyword_term_,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.fill_into_edit);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontSendPrivateDataToSuggest) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // None of the following input strings should be sent to the suggest server,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because they may contain private data.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* inputs[] = {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "username:password",
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://username:password",
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://username:password",
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "username:password@hostname",
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://username:password@hostname/",
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "file://filename",
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "data://data",
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "unknownscheme:anything",
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://hostname/?query=q",
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://hostname/path#ref",
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "http://hostname/path #ref",
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://hostname/path",
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(inputs); ++i) {
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(inputs[i]), false, false);
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Make sure the default provider's suggest service was not queried.
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(test_factory_.GetFetcherByID(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SearchProvider::kDefaultProviderURLFetcherID) == NULL);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run till the history results complete.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTillProviderDone();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(SearchProviderTest, SendNonPrivateDataToSuggest) {
5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // All of the following input strings should be sent to the suggest server,
5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // because they should not get caught by the private data checks.
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const char* inputs[] = {
5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "query",
5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "query with spaces",
5144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "http://hostname",
5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "http://hostname/path",
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "http://hostname #ref",
5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "www.hostname.com #ref",
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "https://hostname",
5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "#hashtag",
5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    "foo https://hostname/path"
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < arraysize(inputs); ++i) {
5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(inputs[i]), false, false);
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Make sure the default provider's suggest service was queried.
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(test_factory_.GetFetcherByID(
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        SearchProvider::kDefaultProviderURLFetcherID) != NULL);
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontAutocompleteURLLikeTerms) {
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteClassifierFactory::GetInstance()->SetTestingFactoryAndUse(
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &AutocompleteClassifierFactory::BuildInstanceFor);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = AddSearchToHistory(default_t_url_,
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                ASCIIToUTF16("docs.google.com"), 1);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the term as a url.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryServiceFactory::GetForProfile(&profile_, Profile::EXPLICIT_ACCESS)->
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddPageWithDetails(GURL("http://docs.google.com"), string16(), 1, 1,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         base::Time::Now(), false, history::SOURCE_BROWSED);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("docs"),
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should be two matches, one for what you typed, the other for
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'docs.google.com'. The search term should have a lower priority than the
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // what you typed match.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(url, &term_match));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match.relevance);
555c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
556c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A multiword search with one visit should not autocomplete until multiple
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// words are typed.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontAutocompleteUntilMultipleWordsTyped) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("one search"),
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   1));
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("on"),
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match.relevance);
573c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
574c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("one se"),
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
581c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
582c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A multiword search with more than one visit should autocomplete immediately.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, AutocompleteMultipleVisitsImmediately) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("two searches"),
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   2));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("tw"),
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
598c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
599c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocompletion should work at a word boundary after a space.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, AutocompleteAfterSpace) {
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("two searches"),
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   2));
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("two "),
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
615c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
616c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Newer multiword searches should score more highly than older ones.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, ScoreNewerSearchesHigher) {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_a(AddSearchToHistory(default_t_url_,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("three searches aaa"), 1));
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_b(AddSearchToHistory(default_t_url_,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("three searches bbb"), 1));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("three se"),
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, provider_->matches().size());
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_a;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a));
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_b;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b));
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_b.relevance, term_match_a.relevance);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_a.relevance, wyt_match.relevance);
637c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match_b.allowed_to_be_default_match);
638c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match_a.allowed_to_be_default_match);
639c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An autocompleted multiword search should not be replaced by a different
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// autocompletion while the user is still typing a valid prefix.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontReplacePreviousAutocompletion) {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_a(AddSearchToHistory(default_t_url_,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("four searches aaa"), 2));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url_b(AddSearchToHistory(default_t_url_,
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ASCIIToUTF16("four searches bbb"), 1));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("fo"),
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, provider_->matches().size());
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_a;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match_b;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_a.relevance, wyt_match.relevance);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match_b.relevance);
661c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match_a.allowed_to_be_default_match);
662c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match_b.allowed_to_be_default_match);
663c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("four se"),
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, provider_->matches().size());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_a, &term_match_a));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url_b, &term_match_b));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match_a.relevance, wyt_match.relevance);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(wyt_match.relevance, term_match_b.relevance);
672c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match_a.allowed_to_be_default_match);
673c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match_b.allowed_to_be_default_match);
674c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Non-completable multiword searches should not crowd out single-word searches.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, DontCrowdOutSingleWords) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("five"), 1));
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches bbb"), 1);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches ccc"), 1);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches ddd"), 1);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(default_t_url_, ASCIIToUTF16("five searches eee"), 1);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("fi"),
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(AutocompleteProvider::kMaxMatches + 1, provider_->matches().size());
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
693c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
694c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(wyt_match.allowed_to_be_default_match);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Inline autocomplete matches regardless of case differences from the input.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, InlineMixedCaseMatches) {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL term_url(AddSearchToHistory(default_t_url_, ASCIIToUTF16("FOO"), 1));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch wyt_match;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(QueryForInputAndSetWYTMatch(ASCIIToUTF16("f"),
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &wyt_match));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, provider_->matches().size());
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch term_match;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(term_url, &term_match));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(term_match.relevance, wyt_match.relevance);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("FOO"), term_match.fill_into_edit);
710ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("OO"), term_match.inline_autocompletion);
711c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(term_match.allowed_to_be_default_match);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies AutocompleteControllers return results (including keyword
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// results) in the right order and set descriptions for them correctly.
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, KeywordOrderingAndDescriptions) {
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an entry that corresponds to a keyword search with 'term2'.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddSearchToHistory(keyword_t_url_, ASCIIToUTF16("term2"), 1);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile_.BlockUntilHistoryProcessesPendingRequests();
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteController controller(&profile_, NULL,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutocompleteProvider::TYPE_SEARCH);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller.Start(AutocompleteInput(
724d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      ASCIIToUTF16("k t"), string16::npos, string16(), GURL(),
725d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      AutocompleteInput::INVALID_SPEC, false, false, true,
726d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      AutocompleteInput::ALL_MATCHES));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AutocompleteResult& result = controller.result();
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There should be three matches, one for the keyword history, one for
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // keyword provider's what-you-typed, and one for the default provider's
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // what you typed, in that order.
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3u, result.size());
73390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatchType::SEARCH_HISTORY, result.match_at(0).type);
73490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatchType::SEARCH_OTHER_ENGINE,
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            result.match_at(1).type);
73690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            result.match_at(2).type);
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(result.match_at(0).relevance, result.match_at(1).relevance);
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_GT(result.match_at(1).relevance, result.match_at(2).relevance);
740c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(result.match_at(0).allowed_to_be_default_match);
741c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(result.match_at(1).allowed_to_be_default_match);
742c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(result.match_at(2).allowed_to_be_default_match);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The two keyword results should come with the keyword we expect.
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("k"), result.match_at(0).keyword);
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("k"), result.match_at(1).keyword);
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default provider has a different keyword.  (We don't explicitly
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // set it during this test, so all we do is assert that it's different.)
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(result.match_at(0).keyword, result.match_at(2).keyword);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The top result will always have a description.  The third result,
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // coming from a different provider than the first two, should also.
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the second result has one doesn't matter much.  (If it was
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // missing, people would infer that it's the same search provider as
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the one above it.)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result.match_at(0).description.empty());
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(result.match_at(2).description.empty());
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(result.match_at(0).description, result.match_at(2).description);
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, KeywordVerbatim) {
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestData cases[] = {
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Test a simple keyword input.
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k foo"), 2,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/k%20foo"),
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo") ) } },
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure extra whitespace after the keyword doesn't change the
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // keyword verbatim query.
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k   foo"), 2,
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
77690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/k%20%20%20foo"),
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k   foo")) } },
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Leading whitespace should be stripped before SearchProvider gets the
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // input; hence there are no tests here about how it handles those inputs.
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // But whitespace elsewhere in the query string should matter to both
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // matches.
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k  foo  bar"), 2,
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo%20%20bar"),
78890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo  bar")),
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/k%20%20foo%20%20bar"),
79190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k  foo  bar")) } },
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note in the above test case we don't test trailing whitespace because
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // SearchProvider still doesn't handle this well.  See related bugs:
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // 102690, 99239, 164635.
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Keywords can be prefixed by certain things that should get ignored
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // when constructing the keyword match.
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("www.k foo"), 2,
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
80190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/www.k%20foo"),
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("www.k foo")) } },
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("http://k foo"), 2,
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/http%3A//k%20foo"),
81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("http://k foo")) } },
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("http://www.k foo"), 2,
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://keyword/foo"),
81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k foo")),
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResultInfo(GURL("http://defaultturl/http%3A//www.k%20foo"),
81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("http://www.k foo")) } },
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // A keyword with no remaining input shouldn't get a keyword
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // verbatim match.
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k"), 1,
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://defaultturl/k"),
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k")) } },
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ASCIIToUTF16("k "), 1,
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      { ResultInfo(GURL("http://defaultturl/k%20"),
82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ASCIIToUTF16("k ")) } }
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The fact that verbatim queries to keyword are handled by KeywordProvider
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // not SearchProvider is tested in
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // chrome/browser/extensions/api/omnibox/omnibox_apitest.cc.
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test not in keyword mode.
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunTest(cases, arraysize(cases), false);
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test in keyword mode.  (Both modes should give the same result.)
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunTest(cases, arraysize(cases), true);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Ensures command-line flags are reflected in the URLs the search provider
845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// generates.
846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(SearchProviderTest, CommandLineOverrides) {
847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TemplateURLService* turl_model =
848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      TemplateURLServiceFactory::GetForProfile(&profile_);
849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TemplateURLData data;
851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  data.short_name = ASCIIToUTF16("default");
852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  data.SetKeyword(data.short_name);
853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  data.SetURL("{google:baseURL}{searchTerms}");
854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  default_t_url_ = new TemplateURL(&profile_, data);
855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  turl_model->Add(default_t_url_);
856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  turl_model->SetDefaultSearchProvider(default_t_url_);
857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CommandLine::ForCurrentProcess()->AppendSwitchASCII(switches::kGoogleBaseURL,
859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                      "http://www.bar.com/");
860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      switches::kExtraSearchQueryParams, "a=b");
862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestData cases[] = {
864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { ASCIIToUTF16("k a"), 2,
865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { ResultInfo(GURL("http://keyword/a"),
866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   AutocompleteMatchType::SEARCH_OTHER_ENGINE,
867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   ASCIIToUTF16("k a")),
868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        ResultInfo(GURL("http://www.bar.com/k%20a?a=b"),
869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   ASCIIToUTF16("k a")) } },
871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RunTest(cases, arraysize(cases), false);
874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies Navsuggest results don't set a TemplateURL, which Instant relies on.
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Also verifies that just the *first* navigational result is listed as a match
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if suggested relevance scores were not sent.
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, NavSuggestNoSuggestedRelevanceScores) {
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("a.c"), false, false);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default providers suggest service was queried.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->set_response_code(200);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->SetResponseString(
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[\"a.c\",[\"a.com\", \"a.com/b\"],[\"a\", \"b\"],[],"
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]");
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher = NULL;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the only match is 'a.com' and it doesn't have a template_url.
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch nav_match;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithDestination(GURL("http://a.com"), &nav_match));
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(nav_match.keyword.empty());
902c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(nav_match.allowed_to_be_default_match);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindMatchWithDestination(GURL("http://a.com/b"), &nav_match));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that the most relevant suggest results are added properly.
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, SuggestRelevance) {
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("a"), false, false);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default provider's suggest service was queried.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(fetcher);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->set_response_code(200);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->SetResponseString("[\"a\",[\"a1\", \"a2\", \"a3\", \"a4\"]]");
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fetcher = NULL;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run till the history results complete.
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTillProviderDone();
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the expected verbatim and (first 3) suggestions' relative relevances.
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteMatch verbatim, match_a1, match_a2, match_a3, match_a4;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a"), &verbatim));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a1"), &match_a1));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a2"), &match_a2));
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("a3"), &match_a3));
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(FindMatchWithContents(ASCIIToUTF16("a4"), &match_a4));
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(verbatim.relevance, match_a1.relevance);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(match_a1.relevance, match_a2.relevance);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(match_a2.relevance, match_a3.relevance);
934c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(verbatim.allowed_to_be_default_match);
935c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(match_a1.allowed_to_be_default_match);
936c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(match_a2.allowed_to_be_default_match);
937c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(match_a3.allowed_to_be_default_match);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that suggest results with relevance scores are added
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// properly when using the default fetcher.  When adding a new test
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// case to this test, please consider adding it to the tests in
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// KeywordFetcherSuggestRelevance below.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, DefaultFetcherSuggestRelevance) {
945c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  struct DefaultFetcherMatch {
946c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    std::string contents;
947c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    bool allowed_to_be_default_match;
948c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  };
949c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  const DefaultFetcherMatch kEmptyMatch = { kNotApplicable, false };
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string json;
952c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const DefaultFetcherMatch matches[4];
953ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::string inline_autocompletion;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } cases[] = {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that suggestrelevance scores reorder matches.
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
957c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "c", false }, { "b", false }, kEmptyMatch },
958c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1, 2]}]",
962c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "c.com", false }, { "b.com", false }, kEmptyMatch },
963c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Without suggested relevance scores, we should only allow one
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // navsuggest result to be be displayed.
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
969c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch },
970c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that verbatimrelevance scores reorder or suppress verbatim.
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Negative values will have no effect; the calculated value will be used.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9998]}]",
976c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true}, { "a1", true }, kEmptyMatch, kEmptyMatch },
977c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
980c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
981c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0,"
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
984c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
985c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1,"
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
988c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
989c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":9999,"
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9998]}]",
994c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a.com", true }, kEmptyMatch, kEmptyMatch },
995c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":9998,"
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
1000c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1001c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0,"
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
1006c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1007c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":-1,"
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
1012c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1013c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that both types of relevance scores reorder matches together.
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "\"google:verbatimrelevance\":9998}]",
1018c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, { "a2", true }, kEmptyMatch },
1019c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that only inlinable matches may be ranked as the highest result.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore all suggested relevance scores if this constraint is violated.
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
1024c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b", false }, kEmptyMatch, kEmptyMatch },
1025c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            "\"google:verbatimrelevance\":0}]",
1028c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b", false }, kEmptyMatch, kEmptyMatch },
1029c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
1033c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch },
1034c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[9999],"
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
1039c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch },
1040c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
104158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    { "[\"a\",[\"https://a/\"],[],[],"
104258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
104358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
104458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { { "https://a", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
104558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::string() },
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that the top result is ranked as highly as calculated verbatim.
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore the suggested verbatim relevance if this constraint is violated.
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
1050c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch },
1051c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]",
1053c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch },
1054c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1],"
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             "\"google:verbatimrelevance\":0}]",
1057c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch },
1058c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2],"
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     "\"google:verbatimrelevance\":0}]",
1061c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a2", true }, { "a1", true }, kEmptyMatch },
1062c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3],"
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"google:verbatimrelevance\":2}]",
1065c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a2", true }, { "a1", true }, kEmptyMatch },
1066c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1],"
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
1071c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a.com", true }, kEmptyMatch, kEmptyMatch },
1072c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1, 2],"
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
1077c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a2.com", true }, { "a1.com", true }, kEmptyMatch },
1078c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that all suggestions are considered, regardless of order.
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
1083c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "h", false }, { "g", false }, { "f", false } },
1084c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "\"http://e.com\", \"http://f.com\", \"http://g.com\","
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "\"http://h.com\"],[],[],"
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                "\"NAVIGATION\"],"
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
1093c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "h.com", false }, { "g.com", false },
1094c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "f.com", false } },
1095c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that incorrectly sized suggestion relevance lists are ignored.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]",
1099c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, { "a2", true }, kEmptyMatch },
1100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]",
1102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch },
1103c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:suggestrelevance\":[1]}]",
1107c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch },
1108c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"http://a1.com\"],[],[],"
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "\"google:suggestrelevance\":[9999, 1]}]",
1112c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch },
1113c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that all 'verbatim' results are merged with their maximum score.
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1118c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch },
1119c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2" },
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999],"
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
1123c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch },
1124c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2" },
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that verbatim is always generated without other suggestions.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(msw): Ensure verbatimrelevance is respected (except suppression).
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
1129c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1130c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
1132c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1133c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16("a"), false, false);
1138a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    net::TestURLFetcher* fetcher =
1139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        test_factory_.GetFetcherByID(
1140a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            SearchProvider::kDefaultProviderURLFetcherID);
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(fetcher);
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(200);
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(cases[i].json);
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTillProviderDone();
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string description = "for input with json=" + cases[i].json;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The top match must inline and score as highly as calculated verbatim.
1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_FALSE(matches.empty());
1151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
1152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              matches[0].inline_autocompletion) << description;
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_GE(matches[0].relevance, 1300) << description;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t j = 0;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
1157c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    for (; j < matches.size(); ++j) {
1158c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents),
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                matches[j].contents) << description;
1160c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(cases[i].matches[j].allowed_to_be_default_match,
1161c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                matches[j].allowed_to_be_default_match) << description;
1162c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    }
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that no expected matches are missing.
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
1165c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents) <<
1166c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch          "Case # " << i << " " << description;
1167c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
1168c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
1169c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1170c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch// This test is like DefaultFetcherSuggestRelevance above except it enables
1171c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch// the field trial that causes the omnibox to be willing to reorder matches
1172c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch// to guarantee the top result is a legal default match.  This field trial
1173c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch// causes SearchProvider to allow some constraints to be violated that it
1174c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch// wouldn't normally because the omnibox will fix the problems later.
1175c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben MurdochTEST_F(SearchProviderTest, DefaultFetcherSuggestRelevanceWithReorder) {
1176c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  struct DefaultFetcherMatch {
1177c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    std::string contents;
1178c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    bool allowed_to_be_default_match;
1179c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  };
1180c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  const DefaultFetcherMatch kEmptyMatch = { kNotApplicable, false };
1181c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  struct {
1182c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const std::string json;
1183c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const DefaultFetcherMatch matches[4];
1184c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const std::string inline_autocompletion;
1185c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  } cases[] = {
1186c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that suggestrelevance scores reorder matches.
1187c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
1188c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "c", false }, { "b", false }, kEmptyMatch },
1189c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1190c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
1191c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1192c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[1, 2]}]",
1193c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "c.com", false }, { "b.com", false }, kEmptyMatch },
1194c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1195c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1196c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Without suggested relevance scores, we should only allow one
1197c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // navsuggest result to be be displayed.
1198c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
1199c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
1200c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch },
1201c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1202c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1203c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that verbatimrelevance scores reorder or suppress verbatim.
1204c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Negative values will have no effect; the calculated value will be used.
1205c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
1206c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                             "\"google:suggestrelevance\":[9998]}]",
1207c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true}, { "a1", true }, kEmptyMatch, kEmptyMatch },
1208c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1209c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
1210c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                             "\"google:suggestrelevance\":[9999]}]",
1211c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1212c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1213c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0,"
1214c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                             "\"google:suggestrelevance\":[9999]}]",
1215c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1216c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1217c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1,"
1218c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                             "\"google:suggestrelevance\":[9999]}]",
1219c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1220c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1221c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a.com\"],[],[],"
1222c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1223c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":9999,"
1224c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[9998]}]",
1225c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a.com", true }, kEmptyMatch, kEmptyMatch },
1226c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1227c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a.com\"],[],[],"
1228c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1229c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":9998,"
1230c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[9999]}]",
1231c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1232c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
1233c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a.com\"],[],[],"
1234c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1235c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":0,"
1236c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[9999]}]",
1237c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1238c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
1239c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a.com\"],[],[],"
1240c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1241c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":-1,"
1242c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[9999]}]",
1243c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1244c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
1245c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1246c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that both types of relevance scores reorder matches together.
1247c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
1248c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "\"google:verbatimrelevance\":9998}]",
1249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, { "a2", true }, kEmptyMatch },
1250c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1251c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1252c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Allow non-inlineable matches to be the highest-scoring match but,
1253c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // if the result set lacks a single inlineable result, abandon suggested
1254c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // relevance scores entirely.
1255c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
1256c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "b", false }, { "a", true }, kEmptyMatch, kEmptyMatch },
1257c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1258c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
1259c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                            "\"google:verbatimrelevance\":0}]",
1260c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b", false }, kEmptyMatch, kEmptyMatch },
1261c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1262c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://b.com\"],[],[],"
1263c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1264c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[9999]}]",
1265c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "b.com", false }, { "a", true }, kEmptyMatch, kEmptyMatch },
1266c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1267c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://b.com\"],[],[],"
1268c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1269c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[9999],"
1270c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":0}]",
1271c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "b.com", false }, kEmptyMatch, kEmptyMatch },
1272c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1273c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1274c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Allow low-scoring matches.
1275c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
1276c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1277c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1278c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]",
1279c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, { "a", true }, kEmptyMatch, kEmptyMatch },
1280c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1281c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1],"
1282c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                             "\"google:verbatimrelevance\":0}]",
1283c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1284c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "1" },
1285c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2],"
1286c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "\"google:verbatimrelevance\":0}]",
1287c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2", true }, { "a1", true }, kEmptyMatch, kEmptyMatch },
1288c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2" },
1289c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3],"
1290c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "\"google:verbatimrelevance\":2}]",
1291c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch },
1292c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2" },
1293c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a.com\"],[],[],"
1294c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1295c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[1],"
1296c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":0}]",
1297c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1298c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ".com" },
1299c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1300c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1301c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[1, 2],"
1302c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":0}]",
1303c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2.com", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch },
1304c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2.com" },
1305c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1306c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that all suggestions are considered, regardless of order.
1307c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
1308c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
1309c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "h", false }, { "g", false }, { "f", false } },
1310c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1311c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
1312c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch              "\"http://e.com\", \"http://f.com\", \"http://g.com\","
1313c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch              "\"http://h.com\"],[],[],"
1314c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
1315c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "\"NAVIGATION\", \"NAVIGATION\","
1316c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "\"NAVIGATION\", \"NAVIGATION\","
1317c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "\"NAVIGATION\"],"
1318c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
1319c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "h.com", false }, { "g.com", false },
1320c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "f.com", false } },
1321c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1322c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1323c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that incorrectly sized suggestion relevance lists are ignored.
1324c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]",
1325c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, { "a2", true }, kEmptyMatch },
1326c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1327c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]",
1328c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1", true }, kEmptyMatch, kEmptyMatch },
1329c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1330c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1331c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1332c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:suggestrelevance\":[1]}]",
1333c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch },
1334c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1335c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"http://a1.com\"],[],[],"
1336c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggesttype\":[\"NAVIGATION\"],"
1337c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "\"google:suggestrelevance\":[9999, 1]}]",
1338c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, { "a1.com", true }, kEmptyMatch, kEmptyMatch },
1339c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1340c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1341c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that all 'verbatim' results are merged with their maximum score.
1342c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
1343c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1344c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch },
1345c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2" },
1346c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
1347c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch       "{\"google:suggestrelevance\":[9998, 9997, 9999],"
1348c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        "\"google:verbatimrelevance\":0}]",
1349c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2", true }, { "a", true }, { "a1", true }, kEmptyMatch },
1350c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      "2" },
1351c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1352c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that verbatim is always generated without other suggestions.
1353c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // TODO(msw): Ensure verbatimrelevance is respected (except suppression).
1354c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
1355c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1356c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1357c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
1358c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a", true }, kEmptyMatch, kEmptyMatch, kEmptyMatch },
1359c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      std::string() },
1360c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  };
1361c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1362c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  std::map<std::string, std::string> params;
1363c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  params[std::string(OmniboxFieldTrial::kReorderForLegalDefaultMatchRule) +
1364c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch         ":*:*"] = OmniboxFieldTrial::kReorderForLegalDefaultMatchRuleEnabled;
1365c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  ASSERT_TRUE(chrome_variations::AssociateVariationParams(
1366c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A", params));
1367c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  base::FieldTrialList::CreateFieldTrial(
1368c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A");
1369c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1370c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1371c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    QueryForInput(ASCIIToUTF16("a"), false, false);
1372c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    net::TestURLFetcher* fetcher =
1373c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        test_factory_.GetFetcherByID(
1374c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch            SearchProvider::kDefaultProviderURLFetcherID);
1375c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    ASSERT_TRUE(fetcher);
1376c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    fetcher->set_response_code(200);
1377c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    fetcher->SetResponseString(cases[i].json);
1378c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    fetcher->delegate()->OnURLFetchComplete(fetcher);
1379c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    RunTillProviderDone();
1380c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1381c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const std::string description = "for input with json=" + cases[i].json;
1382c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const ACMatches& matches = provider_->matches();
1383c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // The top match must inline and score as highly as calculated verbatim.
1384c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    ASSERT_FALSE(matches.empty());
1385c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
1386c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch              matches[0].inline_autocompletion) << description;
1387c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1388c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    size_t j = 0;
1389c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that the returned matches equal the expectations.
1390c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    for (; j < matches.size(); ++j) {
1391c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents),
1392c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                matches[j].contents) << description;
1393c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(cases[i].matches[j].allowed_to_be_default_match,
1394c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                matches[j].allowed_to_be_default_match) << description;
1395c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    }
1396c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Ensure that no expected matches are missing.
1397c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
1398c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents) <<
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "Case # " << i << " " << description;
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that suggest results with relevance scores are added
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// properly when using the keyword fetcher.  This is similar to the
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// test DefaultFetcherSuggestRelevance above but this uses inputs that
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// trigger keyword suggestions (i.e., "k a" rather than "a") and has
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// different expectations (because now the results are a mix of
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// keyword suggestions and default provider suggestions).  When a new
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// test is added to this TEST_F, please consider if it would be
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// appropriate to add to DefaultFetcherSuggestRelevance as well.
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, KeywordFetcherSuggestRelevance) {
1412c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  struct KeywordFetcherMatch {
1413c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    std::string contents;
1414c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    bool from_keyword;
1415c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    bool allowed_to_be_default_match;
1416c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  };
1417c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  const KeywordFetcherMatch kEmptyMatch = { kNotApplicable, false, false };
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct {
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string json;
1420c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const KeywordFetcherMatch matches[5];
1421ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::string inline_autocompletion;
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } cases[] = {
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that suggest relevance scores reorder matches and that
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the keyword verbatim (lacking a suggested verbatim score) beats
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the default provider verbatim.
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
1427c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1428c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1429c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "c",   true,  false },
1430c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b",   true,  false },
1431c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1432ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Again, check that relevance scores reorder matches, just this
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // time with navigation matches.  This also checks that with
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // suggested relevance scores we allow multiple navsuggest results.
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It's odd that navsuggest results that come from a keyword
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // provider are marked as not a keyword result.  I think this
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // comes from them not going to a keyword search engine).
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(mpearson): Investigate the implications (if any) of
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tagging these results appropriately.  If so, do it because it
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // makes more sense.
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"d\"],[],[],"
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "\"google:suggestrelevance\":[1301, 1302, 1303]}]",
1445c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",     true,  true },
1446c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "d",     true,  false },
1447c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "c.com", false, false },
1448c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b.com", false, false },
1449c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",   false, true }, },
1450ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Without suggested relevance scores, we should only allow one
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // navsuggest result to be be displayed.
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\"],[],[],"
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"]}]",
1456c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",     true,  true },
1457c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b.com", false, false },
1458c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",   false, true },
1459c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1460ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that verbatimrelevance scores reorder or suppress verbatim.
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Negative values will have no effect; the calculated value will be used.
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9999,"
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9998]}]",
1466c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1467c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1468c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1469c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1470ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":9998,"
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
1473c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1",  true,  true },
1474c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",   true,  true },
1475c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1476c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1477ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "1" },
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0,"
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
1480c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1",  true,  true },
1481c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1482c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch, kEmptyMatch },
1483ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "1" },
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":-1,"
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:suggestrelevance\":[9999]}]",
1486c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1",  true,  true },
1487c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",   true,  true },
1488c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1489c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1490ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "1" },
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://a.com\"],[],[],"
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:verbatimrelevance\":9999,"
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[9998]}]",
1495c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",     true,  true },
1496c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com", false, true },
1497c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",   false, true },
1498c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1499ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that both types of relevance scores reorder matches together.
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[9999, 9997],"
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     "\"google:verbatimrelevance\":9998}]",
1504c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a1",  true,  true },
1505c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",   true,  true },
1506c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2",  true,  true },
1507c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1508c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1509ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "1" },
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that only inlinable matches may be ranked as the highest result.
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ignore all suggested relevance scores if this constraint is violated.
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999]}]",
1514c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1515c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b",   true,  false },
1516c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1517c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1518ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\"],[],[],{\"google:suggestrelevance\":[9999],"
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            "\"google:verbatimrelevance\":0}]",
1521c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1522c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b",   true,  false },
1523c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1524c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1525ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
1529c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",     true,  true },
1530c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b.com", false, false },
1531c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",   false, true },
1532c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1533ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\"],[],[],"
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[9999],"
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
1538c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",     true,  true },
1539c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "b.com", false, false },
1540c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",   false, true },
1541c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1542ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that the top result is ranked as highly as calculated verbatim.
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ignore the suggested verbatim relevance if this constraint is violated.
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note that keyword suggestions by default (not in suggested relevance
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mode) score more highly than the default verbatim.
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":0}]",
1549c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1550c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1551c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1552c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch },
1553ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:verbatimrelevance\":1}]",
1555c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1556c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1557c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1558c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1559ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Continuing the same category of tests, but make sure we keep the
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // suggested relevance scores even as we discard the verbatim relevance
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // scores.
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[1],"
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "\"google:verbatimrelevance\":0}]",
1565c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1566c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1567c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",   true, true },
1568c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1569ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 2],"
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     "\"google:verbatimrelevance\":0}]",
1572c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1573c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1574c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2",  true,  true },
1575c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1576c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1577ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1, 3],"
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "\"google:verbatimrelevance\":2}]",
1580c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1581c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1582c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2",  true,  true },
1583c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1584c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1585ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that all suggestions are considered, regardless of order.
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"],[],[],"
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
1590c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1591c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1592c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "h",   true,  false },
1593c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "g",   true,  false },
1594c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "f",   true,  false } },
1595ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://b.com\", \"http://c.com\", \"http://d.com\","
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "\"http://e.com\", \"http://f.com\", \"http://g.com\","
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "\"http://h.com\"],[],[],"
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\","
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "\"NAVIGATION\", \"NAVIGATION\","
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                "\"NAVIGATION\"],"
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[1, 2, 3, 4, 5, 6, 7]}]",
1604c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",     true,  true },
1605c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",   false, true },
1606c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "h.com", false, false },
1607c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "g.com", false, false },
1608c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "f.com", false, false } },
1609ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that incorrectly sized suggestion relevance lists are ignored.
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note that keyword suggestions by default (not in suggested relevance
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mode) score more highly than the default verbatim.
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\", \"a2\"],[],[],{\"google:suggestrelevance\":[1]}]",
1615c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1616c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1617c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2",  true,  true },
1618c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1619c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1620ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a1\"],[],[],{\"google:suggestrelevance\":[9999, 1]}]",
1622c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1623c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1624c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1625c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1626ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // In this case, ignored the suggested relevance scores means we keep
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // only one navsuggest result.
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:suggestrelevance\":[1]}]",
1632c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1633c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1634c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1635c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1636ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\"],[],[],"
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "\"google:suggestrelevance\":[9999, 1]}]",
1640c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1641c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1642c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1643c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1644ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that all 'verbatim' results are merged with their maximum score.
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1649c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2",  true,  true },
1650c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",   true,  true },
1651c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1652c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1653c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1654ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "2" },
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[\"a\", \"a1\", \"a2\"],[],[],"
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "{\"google:suggestrelevance\":[9998, 9997, 9999],"
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "\"google:verbatimrelevance\":0}]",
1658c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a2",  true,  true },
1659c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",   true,  true },
1660c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1",  true,  true },
1661c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1662c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1663ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "2" },
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that verbatim is always generated without other suggestions.
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(mpearson): Ensure the value of verbatimrelevance is respected
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // (except when suggested relevances are ignored).
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":1}]",
1669c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1670c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1671c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch, kEmptyMatch},
1672ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { "[\"a\",[],[],[],{\"google:verbatimrelevance\":0}]",
1674c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",   true,  true },
1675c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a", false, true },
1676c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch, kEmptyMatch},
1677ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
1678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check that navsuggestions will be demoted below queries.
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // (Navsuggestions are not allowed to appear first.)  In the process,
1681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // make sure the navsuggestions still remain in the same order.
1682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // First, check the situation where navsuggest scores more than verbatim
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // and there are no query suggestions.
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999]}]",
1688c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1689c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1690c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1691c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1692c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1693ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998]}]",
1698c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1699c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1700c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1701c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1702c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
170458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    { "[\"a\",[\"https://a/\"],[],[],"
170558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\"],"
170658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        "\"google:suggestrelevance\":[9999]}]",
170758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { { "a",         true, true },
170858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        { "https://a", false, true },
170958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        { "k a",       false, true },
171058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        kEmptyMatch,
171158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        kEmptyMatch },
171258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::string() },
1713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check when navsuggest scores more than verbatim and there is query
1714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // suggestion but it scores lower.
1715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999, 1300]}]",
1719c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1720c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1721c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1722c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a3",     true,  true },
1723c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true } },
1724ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
1725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998, 1300]}]",
1729c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1730c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1731c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1732c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a3",     true,  true },
1733c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true } },
1734ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
1735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check when navsuggest scores more than a query suggestion.  There is
1736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // a verbatim but it scores lower.
1737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999, 9997]}]",
1741c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a3",     true,  true },
1742c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1743c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1744c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",      true,  true },
1745c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true } },
1746ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "3" },
1747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1750c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998, 9997]}]",
1751c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a3",     true,  true },
1752c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1753c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1754c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",      true,  true },
1755c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true } },
1756ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "3" },
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999, 9997]}]",
1761c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a3",     true,  true },
1762c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1763c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1764c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1765c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "3" },
1767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998, 9997]}]",
1771c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a3",     true,  true },
1772c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1773c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1774c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1775c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch },
1776ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "3" },
1777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check when there is neither verbatim nor a query suggestion that,
1778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // because we can't demote navsuggestions below a query suggestion,
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // we abandon suggested relevance scores entirely.  One consequence is
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // that this means we restore the keyword verbatim match.  Note
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // that in this case of abandoning suggested relevance scores, we still
1782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // keep the navsuggestions in the same order, but we revert to only allowing
1783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // one navigation to appear because the scores are completely local.
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9999]}]",
1788c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1789c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1790c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1791c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
1793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\"],[],[],"
1794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\"],"
1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":0,"
1796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9999, 9998]}]",
1797c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a",      true,  true },
1798c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1799c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true },
1800c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch},
1801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      std::string() },
1802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // More checks that everything works when it's not necessary to demote.
1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9997, 9998, 9999]}]",
1807c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a3",     true,  true },
1808c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1809c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1810c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",      true,  true },
1811c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true } },
1812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "3" },
1813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "[\"a\",[\"http://a1.com\", \"http://a2.com\", \"a3\"],[],[],"
1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       "{\"google:suggesttype\":[\"NAVIGATION\", \"NAVIGATION\", \"QUERY\"],"
1815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:verbatimrelevance\":9990,"
1816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "\"google:suggestrelevance\":[9998, 9997, 9999]}]",
1817c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a3",     true,  true },
1818c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a1.com", false, true },
1819c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a2.com", false, true },
1820c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a",      true,  true },
1821c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "k a",    false, true } },
1822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      "3" },
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16("k a"), false, true);
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up a default fetcher with no results.
1829a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    net::TestURLFetcher* default_fetcher =
1830a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        test_factory_.GetFetcherByID(
1831a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            SearchProvider::kDefaultProviderURLFetcherID);
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(default_fetcher);
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_fetcher->set_response_code(200);
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_fetcher->delegate()->OnURLFetchComplete(default_fetcher);
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default_fetcher = NULL;
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set up a keyword fetcher with provided results.
1838a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    net::TestURLFetcher* keyword_fetcher =
1839a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        test_factory_.GetFetcherByID(
1840a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            SearchProvider::kKeywordProviderURLFetcherID);
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(keyword_fetcher);
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher->set_response_code(200);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher->SetResponseString(cases[i].json);
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keyword_fetcher = NULL;
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunTillProviderDone();
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string description = "for input with json=" + cases[i].json;
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ACMatches& matches = provider_->matches();
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The top match must inline and score as highly as calculated verbatim.
1851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_FALSE(matches.empty());
1852ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
1853ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              matches[0].inline_autocompletion) << description;
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_GE(matches[0].relevance, 1300) << description;
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t j = 0;
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that the returned matches equal the expectations.
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (; j < matches.size(); ++j) {
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j].contents),
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                matches[j].contents) << description;
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].from_keyword,
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                matches[j].keyword == ASCIIToUTF16("k")) << description;
1863c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(cases[i].matches[j].allowed_to_be_default_match,
1864c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                matches[j].allowed_to_be_default_match) << description;
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ensure that no expected matches are missing.
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(kNotApplicable, cases[i].matches[j].contents) <<
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "Case # " << i << " " << description;
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(SearchProviderTest, LocalAndRemoteRelevances) {
1874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Enable Instant Extended in order to allow an increased number of
1875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // suggestions.
1876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::EnableInstantExtendedAPIForTesting();
1877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We hardcode the string "term1" below, so ensure that the search term that
1879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // got added to history already is that string.
1880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(ASCIIToUTF16("term1"), term1_);
1881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  string16 term = term1_.substr(0, term1_.length() - 1);
1882eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddSearchToHistory(default_t_url_, term + ASCIIToUTF16("2"), 2);
1884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  profile_.BlockUntilHistoryProcessesPendingRequests();
1885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1886eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct {
1887eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const string16 input;
1888eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string json;
1889eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string matches[6];
1890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } cases[] = {
1891eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // The history results outscore the default verbatim score.  term2 has more
1892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // visits so it outscores term1.  The suggestions are still returned since
1893eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // they're server-scored.
1894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { term,
1895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"term\",[\"a1\", \"a2\", \"a3\"],[],[],"
1896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\"],"
1897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[1, 2, 3]}]",
1898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "term2", "term1", "term", "a3", "a2", "a1" } },
1899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Because we already have three suggestions by the time we see the history
1900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // results, they don't get returned.
1901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { term,
1902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"term\",[\"a1\", \"a2\", \"a3\"],[],[],"
1903eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\"],"
1904eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:verbatimrelevance\":1450,"
1905eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[1440, 1430, 1420]}]",
1906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "term", "a1", "a2", "a3", kNotApplicable, kNotApplicable } },
1907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // If we only have two suggestions, we have room for a history result.
1908eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { term,
1909eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"term\",[\"a1\", \"a2\"],[],[],"
1910eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\"],"
1911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:verbatimrelevance\":1450,"
1912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[1430, 1410]}]",
1913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "term", "a1", "a2", "term2", kNotApplicable, kNotApplicable } },
1914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // If we have more than three suggestions, they should all be returned as
1915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // long as we have enough total space for them.
1916eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { term,
1917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"term\",[\"a1\", \"a2\", \"a3\", \"a4\"],[],[],"
1918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\", \"QUERY\"],"
1919eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:verbatimrelevance\":1450,"
1920eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[1440, 1430, 1420, 1410]}]",
1921eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "term", "a1", "a2", "a3", "a4", kNotApplicable } },
1922eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { term,
1923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"term\",[\"a1\", \"a2\", \"a3\", \"a4\", \"a5\", \"a6\"],[],[],"
1924eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\", \"QUERY\","
1925eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                "\"QUERY\", \"QUERY\"],"
1926eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:verbatimrelevance\":1450,"
1927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[1440, 1430, 1420, 1410, 1400, 1390]}]",
1928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "term", "a1", "a2", "a3", "a4", "a5" } },
1929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { term,
1930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"term\",[\"a1\", \"a2\", \"a3\", \"a4\"],[],[],"
1931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"QUERY\", \"QUERY\"],"
1932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:verbatimrelevance\":1450,"
1933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[1430, 1410, 1390, 1370]}]",
1934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "term", "a1", "a2", "term2", "a3", "a4" } },
1935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // When the input looks like a URL, we disallow having a query as the
1936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // highest-ranking result.  If the query was provided by a suggestion, we
1937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // reset the suggest scores to enforce this (see
1938eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // SearchProvider::UpdateMatches()).  Even if we reset the suggest scores,
1939eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // however, we should still allow navsuggestions to be treated as
1940eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // server-provided.
1941eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    { ASCIIToUTF16("a.com"),
1942eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "[\"a.com\",[\"a1\", \"a2\", \"a.com/1\", \"a.com/2\"],[],[],"
1943eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch       "{\"google:suggesttype\":[\"QUERY\", \"QUERY\", \"NAVIGATION\","
1944eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                "\"NAVIGATION\"],"
1945eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // A verbatim query for URL-like input scores 850, so the navigation
1946eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // scores here should bracket it.
1947eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "\"google:suggestrelevance\":[9999, 9998, 900, 800]}]",
1948eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      { "a.com/1", "a.com", "a.com/2", "a1", kNotApplicable, kNotApplicable } },
1949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
1950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
1952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    QueryForInput(cases[i].input, false, false);
1953a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    net::TestURLFetcher* fetcher =
1954a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        test_factory_.GetFetcherByID(
1955a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            SearchProvider::kDefaultProviderURLFetcherID);
1956eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(fetcher);
1957eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fetcher->set_response_code(200);
1958eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fetcher->SetResponseString(cases[i].json);
1959eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fetcher->delegate()->OnURLFetchComplete(fetcher);
1960eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    RunTillProviderDone();
1961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string description = "for input with json=" + cases[i].json;
1963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ACMatches& matches = provider_->matches();
1964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Ensure no extra matches are present.
1966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_LE(matches.size(), 6U);
1967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    size_t j = 0;
1969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Ensure that the returned matches equal the expectations.
1970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (; j < matches.size(); ++j)
1971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_EQ(ASCIIToUTF16(cases[i].matches[j]),
1972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                matches[j].contents) << description;
1973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Ensure that no expected matches are missing.
1974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j)
1975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      EXPECT_EQ(kNotApplicable, cases[i].matches[j]) <<
1976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          "Case # " << i << " " << description;
1977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1978eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies suggest relevance behavior for URL input.
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, DefaultProviderSuggestRelevanceScoringUrlInput) {
1982c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  struct DefaultFetcherUrlInputMatch {
1983c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const std::string match_contents;
1984c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    AutocompleteMatch::Type match_type;
1985c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    bool allowed_to_be_default_match;
1986c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  };
1987c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  const DefaultFetcherUrlInputMatch kEmptyMatch =
1988c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { kNotApplicable, AutocompleteMatchType::NUM_TYPES, false };
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string input;
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string json;
1992c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const DefaultFetcherUrlInputMatch output[4];
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } cases[] = {
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure topmost NAVIGATION matches are allowed for URL input.
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"http://a.com/a\"],[],[],"
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"NAVIGATION\"],"
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9999]}]",
1998c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com/a", AutocompleteMatchType::NAVSUGGEST,            true },
1999c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com",   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2000c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch } },
200158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    { "a.com", "[\"a.com\",[\"https://a.com\"],[],[],"
200258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                "{\"google:suggesttype\":[\"NAVIGATION\"],"
200358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 "\"google:suggestrelevance\":[9999]}]",
200458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      { { "https://a.com", AutocompleteMatchType::NAVSUGGEST,            true },
200558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        { "a.com",         AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
200658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        kEmptyMatch, kEmptyMatch } },
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure topmost SUGGEST matches are not allowed for URL input.
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SearchProvider disregards search and verbatim suggested relevances.
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com info\"],[],[],"
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggestrelevance\":[9999]}]",
2012c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com",      AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2013c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com info", AutocompleteMatchType::SEARCH_SUGGEST,        true },
2014c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch } },
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\"],[],[],"
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggestrelevance\":[9999]}]",
2017c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com",   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2018c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com/a", AutocompleteMatchType::SEARCH_SUGGEST,        true },
2019c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch, kEmptyMatch } },
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure the fallback mechanism allows inlinable NAVIGATION matches.
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://a.com/b\"],[],[],"
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9999, 9998]}]",
2025c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com/b", AutocompleteMatchType::NAVSUGGEST,            true },
2026c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com",   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2027c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com/a", AutocompleteMatchType::SEARCH_SUGGEST,        true },
2028c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch } },
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://a.com/b\"],[],[],"
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9998, 9997],"
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:verbatimrelevance\":9999}]",
2033c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com/b", AutocompleteMatchType::NAVSUGGEST,            true },
2034c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com",   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2035c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com/a", AutocompleteMatchType::SEARCH_SUGGEST,        true },
2036c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch } },
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure the fallback mechanism disallows non-inlinable NAVIGATION matches.
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://abc.com\"],[],[],"
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\"google:suggestrelevance\":[9999, 9998]}]",
2042c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com",   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2043c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "abc.com", AutocompleteMatchType::NAVSUGGEST,            false },
2044c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com/a", AutocompleteMatchType::SEARCH_SUGGEST,        true },
2045c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch } },
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "a.com", "[\"a.com\",[\"a.com/a\", \"http://abc.com\"],[],[],"
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "{\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:suggestrelevance\":[9998, 9997],"
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "\"google:verbatimrelevance\":9999}]",
2050c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      { { "a.com",   AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, true },
2051c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "abc.com", AutocompleteMatchType::NAVSUGGEST,            false },
2052c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        { "a.com/a", AutocompleteMatchType::SEARCH_SUGGEST,        true },
2053c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        kEmptyMatch } },
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
2057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input), false, false);
2058a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    net::TestURLFetcher* fetcher =
2059a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        test_factory_.GetFetcherByID(
2060a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            SearchProvider::kDefaultProviderURLFetcherID);
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(fetcher);
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->set_response_code(200);
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->SetResponseString(cases[i].json);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunTillProviderDone();
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t j = 0;
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (; j < matches.size(); ++j) {
2071c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(ASCIIToUTF16(cases[i].output[j].match_contents),
2072c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                matches[j].contents);
2073c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(cases[i].output[j].match_type, matches[j].type);
2074c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(cases[i].output[j].allowed_to_be_default_match,
2075c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                matches[j].allowed_to_be_default_match);
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that no expected matches are missing.
2078c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    for (; j < ARRAYSIZE_UNSAFE(cases[i].output); ++j) {
2079c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(kNotApplicable, cases[i].output[j].match_contents);
2080c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_EQ(AutocompleteMatchType::NUM_TYPES,
2081c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                cases[i].output[j].match_type);
2082c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      EXPECT_FALSE(cases[i].output[j].allowed_to_be_default_match);
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A basic test that verifies the field trial triggered parsing logic.
20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SearchProviderTest, FieldTrialTriggeredParsing) {
2089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("foo"), false, false);
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the default providers suggest service was queried.
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SearchProvider::kDefaultProviderURLFetcherID);
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(fetcher);
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the SearchProvider the suggest query is done.
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->set_response_code(200);
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->SetResponseString(
20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "[\"foo\",[\"foo bar\"],[\"\"],[],"
21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "{\"google:suggesttype\":[\"QUERY\"],"
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "\"google:fieldtrialtriggered\":true}]");
21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fetcher = NULL;
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Run till the history results complete.
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunTillProviderDone();
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check for the match and field trial triggered bits.
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AutocompleteMatch match;
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(FindMatchWithContents(ASCIIToUTF16("foo bar"), &match));
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProvidersInfo providers_info;
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->AddProviderInfo(&providers_info);
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1U, providers_info.size());
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, providers_info[0].field_trial_triggered_size());
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, providers_info[0].field_trial_triggered_in_session_size());
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Reset the session and check that bits are reset.
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->ResetSession();
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProvidersInfo providers_info;
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->AddProviderInfo(&providers_info);
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1U, providers_info.size());
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, providers_info[0].field_trial_triggered_size());
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0, providers_info[0].field_trial_triggered_in_session_size());
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies inline autocompletion of navigational results.
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, NavigationInline) {
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string input;
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string url;
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test the expected fill_into_edit, which may drop "http://".
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some cases do not trim "http://" to match from the start of the scheme.
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string fill_into_edit;
2137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::string inline_autocompletion;
2138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    const bool allowed_to_be_default_match;
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } cases[] = {
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not inline matches that do not contain the input; trim http as needed.
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "x",                    "http://www.abc.com",
2142c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com",  std::string(), false },
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https:",               "http://www.abc.com",
2144c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com",  std::string(), false },
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.com/",             "http://www.abc.com",
2146c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com",  std::string(), false },
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com/a", "http://www.abc.com",
2148c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com",  std::string(), false },
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com",   "https://www.abc.com",
2150c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "https://www.abc.com", std::string(), false },
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://abc.com",       "ftp://abc.com",
2152c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "ftp://abc.com",       std::string(), false },
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "https://www.abc.com",  "http://www.abc.com",
2154c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com",  std::string(), false },
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://abc.com",        "http://abc.com",
2156c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "abc.com",      std::string(), false },
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not inline matches with invalid input prefixes; trim http as needed.
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ttp",                  "http://www.abc.com",
2160c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com", std::string(), false },
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "://w",                 "http://www.abc.com",
2162c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com", std::string(), false },
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ww.",                  "http://www.abc.com",
2164c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com", std::string(), false },
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ".ab",                  "http://www.abc.com",
2166c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com", std::string(), false },
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "bc",                   "http://www.abc.com",
2168c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com", std::string(), false },
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { ".com",                 "http://www.abc.com",
2170c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "www.abc.com", std::string(), false },
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do not inline matches that omit input domain labels; trim http as needed.
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.a",                "http://a.com",
2174c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "a.com",       std::string(), false },
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.a",         "http://a.com",
2176c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://a.com",       std::string(), false },
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "www.a",                "ftp://a.com",
2178c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "ftp://a.com",        std::string(), false },
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "ftp://www.a",          "ftp://a.com",
2180c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "ftp://a.com",        std::string(), false },
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
218258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Input matching but with nothing to inline will not yield an offset, but
218358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // will be allowed to be default.
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "abc.com",              "http://www.abc.com",
218558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                     "www.abc.com", std::string(), true },
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com",   "http://www.abc.com",
218758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                              "http://www.abc.com", std::string(), true },
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches when the input is a leading substring of the scheme.
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "h",                    "http://www.abc.com",
2191c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com", "ttp://www.abc.com", true },
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http",                 "http://www.abc.com",
2193c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com", "://www.abc.com",    true },
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches when the input is a leading substring of the full URL.
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http:",                "http://www.abc.com",
2197c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com", "//www.abc.com", true },
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://w",             "http://www.abc.com",
2199c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com", "ww.abc.com",    true },
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.",          "http://www.abc.com",
2201c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com", "abc.com",       true },
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.ab",        "http://www.abc.com",
2203c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              "http://www.abc.com", "c.com",         true },
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://www.abc.com/p", "http://www.abc.com/path/file.htm?q=x#foo",
2205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                              "http://www.abc.com/path/file.htm?q=x#foo",
2206c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                                  "ath/file.htm?q=x#foo",
2207c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                              true },
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "http://abc.com/p",     "http://abc.com/path/file.htm?q=x#foo",
2209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                              "http://abc.com/path/file.htm?q=x#foo",
2210c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                              "ath/file.htm?q=x#foo", true},
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches with valid URLPrefixes; only trim "http://".
2213c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "w",               "http://www.abc.com",
2214c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.abc.com", "ww.abc.com", true },
2215c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "www.a",           "http://www.abc.com",
2216c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.abc.com", "bc.com",     true },
2217c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "abc",             "http://www.abc.com",
2218c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.abc.com", ".com",       true },
2219c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "abc.c",           "http://www.abc.com",
2220c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.abc.com", "om",         true },
2221c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "abc.com/p",       "http://www.abc.com/path/file.htm?q=x#foo",
2222c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.abc.com/path/file.htm?q=x#foo",
2223c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                             "ath/file.htm?q=x#foo", true },
2224c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "abc.com/p",       "http://abc.com/path/file.htm?q=x#foo",
2225c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "abc.com/path/file.htm?q=x#foo",
2226c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                         "ath/file.htm?q=x#foo", true },
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Inline matches using the maximal URLPrefix components.
2229c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "h",               "http://help.com",
2230c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "help.com", "elp.com",     true },
2231c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "http",            "http://http.com",
2232c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "http.com", ".com",        true },
2233c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "h",               "http://www.help.com",
2234c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.help.com", "elp.com", true },
2235c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "http",            "http://www.http.com",
2236c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.http.com", ".com",    true },
2237c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "w",               "http://www.www.com",
2238c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                "www.www.com",  "ww.com",  true },
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test similar behavior for the ftp and https schemes.
2241c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "ftp://www.ab",    "ftp://www.abc.com/path/file.htm?q=x#foo",
2242c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "ftp://www.abc.com/path/file.htm?q=x#foo",
2243c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "c.com/path/file.htm?q=x#foo", true },
2244c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "www.ab",          "ftp://www.abc.com/path/file.htm?q=x#foo",
2245c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "ftp://www.abc.com/path/file.htm?q=x#foo",
2246c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "c.com/path/file.htm?q=x#foo", true },
2247c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "ab",              "ftp://www.abc.com/path/file.htm?q=x#foo",
2248c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "ftp://www.abc.com/path/file.htm?q=x#foo",
2249c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                     "c.com/path/file.htm?q=x#foo", true },
2250c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "ab",              "ftp://abc.com/path/file.htm?q=x#foo",
2251c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "ftp://abc.com/path/file.htm?q=x#foo",
2252c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                 "c.com/path/file.htm?q=x#foo",     true },
2253c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "https://www.ab",  "https://www.abc.com/path/file.htm?q=x#foo",
2254c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "https://www.abc.com/path/file.htm?q=x#foo",
2255c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                       "c.com/path/file.htm?q=x#foo", true },
2256c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "www.ab",          "https://www.abc.com/path/file.htm?q=x#foo",
2257c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "https://www.abc.com/path/file.htm?q=x#foo",
2258c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                       "c.com/path/file.htm?q=x#foo", true },
2259c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "ab",              "https://www.abc.com/path/file.htm?q=x#foo",
2260c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "https://www.abc.com/path/file.htm?q=x#foo",
2261c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                       "c.com/path/file.htm?q=x#foo", true },
2262c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "ab",              "https://abc.com/path/file.htm?q=x#foo",
2263c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                         "https://abc.com/path/file.htm?q=x#foo",
2264c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                                   "c.com/path/file.htm?q=x#foo", true },
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Forced query input should inline and retain the "?" prefix.
2267c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "?http://www.ab",  "http://www.abc.com",
2268c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                        "?http://www.abc.com", "c.com", true },
2269c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "?www.ab",         "http://www.abc.com",
2270c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                               "?www.abc.com", "c.com", true },
2271c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    { "?ab",             "http://www.abc.com",
2272c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                               "?www.abc.com", "c.com", true },
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
2276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input), false, false);
2277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AutocompleteMatch match(
2278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        provider_->NavigationToMatch(SearchProvider::NavigationResult(
2279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            *provider_.get(), GURL(cases[i].url), string16(), false, 0,
2280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            false)));
2281ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(ASCIIToUTF16(cases[i].inline_autocompletion),
2282ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              match.inline_autocompletion);
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(cases[i].fill_into_edit), match.fill_into_edit);
2284c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    EXPECT_EQ(cases[i].allowed_to_be_default_match,
2285c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch              match.allowed_to_be_default_match);
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that "http://" is not trimmed for input that is a leading substring.
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, NavigationInlineSchemeSubstring) {
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 input(ASCIIToUTF16("ht"));
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 url(ASCIIToUTF16("http://a.com"));
2293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const SearchProvider::NavigationResult result(
2294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      *provider_.get(), GURL(url), string16(), false, 0, false);
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the offset and strings when inline autocompletion is allowed.
2297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(input, false, false);
2298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteMatch match_inline(provider_->NavigationToMatch(result));
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_inline.fill_into_edit);
2300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(url.substr(2), match_inline.inline_autocompletion);
2301c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(match_inline.allowed_to_be_default_match);
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_inline.contents);
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the same offset and strings when inline autocompletion is prevented.
2305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(input, true, false);
2306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteMatch match_prevent(provider_->NavigationToMatch(result));
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_prevent.fill_into_edit);
2308c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(match_prevent.inline_autocompletion.empty());
2309c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_FALSE(match_prevent.allowed_to_be_default_match);
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, match_prevent.contents);
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies that input "w" marks a more significant domain label than "www.".
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SearchProviderTest, NavigationInlineDomainClassify) {
2315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QueryForInput(ASCIIToUTF16("w"), false, false);
2316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AutocompleteMatch match(
2317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      provider_->NavigationToMatch(SearchProvider::NavigationResult(
2318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          *provider_.get(), GURL("http://www.wow.com"), string16(), false, 0,
2319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          false)));
2320ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(ASCIIToUTF16("ow.com"), match.inline_autocompletion);
2321c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  EXPECT_TRUE(match.allowed_to_be_default_match);
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.fill_into_edit);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("www.wow.com"), match.contents);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that the match for input "w" is marked on "wow" and not "www".
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, match.contents_class.size());
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, match.contents_class[0].offset);
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL,
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.contents_class[0].style);
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, match.contents_class[1].offset);
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL |
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AutocompleteMatch::ACMatchClassification::MATCH,
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.contents_class[1].style);
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, match.contents_class[2].offset);
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutocompleteMatch::ACMatchClassification::URL,
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            match.contents_class[2].style);
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SearchProviderTest, RemoveStaleResultsTest) {
2340a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // TODO(mpearson): Consider expanding this test to explicitly cover
2341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // testing staleness for keyword results.
2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct {
2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string omnibox_input;
2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const int verbatim_relevance;
2345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // These cached suggestions should already be sorted.
2346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The particular number 5 as the length of the array is
2347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // unimportant; it's merely enough cached results to fully test
2348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the functioning of RemoveAllStaleResults().
2349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    struct {
2350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string suggestion;
2351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const bool is_navigation_result;
2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const int relevance;
2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // |expect_match| is true if this result should survive
2354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // RemoveAllStaleResults() filtering against |omnibox_input| below.
2355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const bool expect_match;
2356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } results[5];
2357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } cases[] = {
2358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Simple case: multiple query suggestions and no navsuggestions.
2359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // All query suggestions score less than search-what-you-typed and
2360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // thus none should be filtered because none will appear first.
2361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1300,
2362a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "food",         false, 1299, true  },
2363a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",       false, 1298, true  },
2364a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "crazy",        false, 1297, true  },
2365a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",       false, 1296, true  },
2366a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { kNotApplicable, false, 0,    false } } },
2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Similarly simple cases, but the query suggestion appears first.
2369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "f", 1200,
2370a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "food",         false, 1299, true  },
2371a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",       false, 1298, true  },
2372a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "crazy",        false, 1297, true  },
2373a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",       false, 1296, true  },
2374a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { kNotApplicable, false, 0,    false } } },
2375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "c", 1200,
2376a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "food",         false, 1299, false },
2377a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",       false, 1298, false },
2378a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "crazy",        false, 1297, true  },
2379a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",       false, 1296, true  },
2380a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { kNotApplicable, false, 0,    false } } },
2381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1200,
2382a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "food",         false, 1299, false },
2383a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",       false, 1298, false },
2384a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "crazy",        false, 1297, false },
2385a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",       false, 1296, false },
2386a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { kNotApplicable, false, 0,    false } } },
2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The same sort of cases, just using a mix of queries and navsuggestions.
2389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1300,
2390a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, true },
2391a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, true },
2392a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, true },
2393a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, true },
2394a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, true } } },
2395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "f", 1200,
2396a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, true },
2397a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, true },
2398a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, true },
2399a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, true },
2400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, true } } },
2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "c", 1200,
2402a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2403a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, false },
2404a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, true  },
2405a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, true  },
2406a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, true  } } },
2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 1200,
2408a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2409a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, false },
2410a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, false },
2411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, false },
2412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, false } } },
2413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Run the three tests immediately above again, just with verbatim
2415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // suppressed.  Note that in the last case, all results are filtered.
2416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Because verbatim is also suppressed, SearchProvider will realize
2417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // in UpdateMatches() that it needs to restore verbatim to fulfill
2418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // its constraints.  This restoration does not happen in
2419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // RemoveAllStaleResults() and hence is not tested here.  This restoration
2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // is tested in the DefaultFetcherSuggestRelevance test.
2421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "f", 0,
2422a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, true },
2423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, true },
2424a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, true },
2425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, true },
2426a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, true } } },
2427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "c", 0,
2428a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2429a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, false },
2430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, true  },
2431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, true  },
2432a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, true  } } },
2433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    { "x", 0,
2434a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2435a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1298, false },
2436a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1297, false },
2437a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1296, false },
2438a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1295, false } } },
2439a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
2440a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // The same sort of tests again, just with verbatim with a score
2441a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // that would place it in between other suggestions.
2442a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    { "f", 1290,
2443a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, true },
2444a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1288, true },
2445a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1277, true },
2446a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1266, true },
2447a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1255, true } } },
2448a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    { "c", 1290,
2449a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2450a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1288, true  },
2451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1277, true  },
2452a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1266, true  },
2453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1255, true  } } },
2454a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    { "c", 1270,
2455a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2456a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1288, false },
2457a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1277, true  },
2458a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1266, true  },
2459a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1255, true  } } },
2460a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    { "x", 1280,
2461a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      { { "http://food.com/",   true,  1299, false },
2462a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "foobar",             false, 1288, false },
2463a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://crazy.com/",  true,  1277, true  },
2464a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "friend",             false, 1266, true  },
2465a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        { "http://friend.com/", true,  1255, true  } } },
2466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
2467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
2469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Initialize cached results for this test case.
247090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    provider_->default_results_.verbatim_relevance =
247190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        cases[i].verbatim_relevance;
247290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    provider_->default_results_.navigation_results.clear();
247390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    provider_->default_results_.suggest_results.clear();
2474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t j = 0; j < ARRAYSIZE_UNSAFE(cases[i].results); ++j) {
2475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& suggestion = cases[i].results[j].suggestion;
2476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (suggestion == kNotApplicable)
2477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
2478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (cases[i].results[j].is_navigation_result) {
247990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        provider_->default_results_.navigation_results.push_back(
2480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            SearchProvider::NavigationResult(
2481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                *provider_.get(), GURL(suggestion), string16(), false,
2482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                cases[i].results[j].relevance, false));
2483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
248490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        provider_->default_results_.suggest_results.push_back(
24851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            SearchProvider::SuggestResult(ASCIIToUTF16(suggestion), string16(),
24861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                          string16(), std::string(), false,
2487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          cases[i].results[j].relevance,
2488424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                          false, false));
2489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->input_ = AutocompleteInput(
2493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASCIIToUTF16(cases[i].omnibox_input), string16::npos, string16(),
2494d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        GURL(), AutocompleteInput::INVALID_SPEC, false, false, true,
2495d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        AutocompleteInput::ALL_MATCHES);
2496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    provider_->RemoveAllStaleResults();
2497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Check cached results.
2499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SearchProvider::SuggestResults::const_iterator sug_it =
250090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        provider_->default_results_.suggest_results.begin();
2501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SearchProvider::SuggestResults::const_iterator sug_end =
250290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        provider_->default_results_.suggest_results.end();
2503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SearchProvider::NavigationResults::const_iterator nav_it =
250490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        provider_->default_results_.navigation_results.begin();
2505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const SearchProvider::NavigationResults::const_iterator nav_end =
250690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        provider_->default_results_.navigation_results.end();
2507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (size_t j = 0; j < ARRAYSIZE_UNSAFE(cases[i].results); ++j) {
2508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& suggestion = cases[i].results[j].suggestion;
2509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (suggestion == kNotApplicable)
2510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        continue;
2511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!cases[i].results[j].expect_match)
2512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        continue;
2513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (cases[i].results[j].is_navigation_result) {
2514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_NE(nav_end, nav_it) << "Failed to find " << suggestion;
2515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(suggestion, nav_it->url().spec());
2516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ++nav_it;
2517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
2518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ASSERT_NE(sug_end, sug_it) << "Failed to find " << suggestion;
2519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        EXPECT_EQ(ASCIIToUTF16(suggestion), sug_it->suggestion());
2520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ++sug_it;
2521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
2522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(sug_end, sug_it);
2524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(nav_end, nav_it);
2525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2527424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
25281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if !defined(OS_WIN)
25291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Verify entity suggestion parsing.
25301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SearchProviderTest, ParseEntitySuggestion) {
25311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  struct Match {
25321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string contents;
25331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string query_params;
25341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string fill_into_edit;
25351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AutocompleteMatchType::Type type;
25361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    size_t classification_offsets[3];
25371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int classification_styles[3];
25381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
25391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const size_t invalid_offset = 10;
25401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const int invalid_style = -1;
25411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const Match kEmptyMatch = {
25421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    kNotApplicable, kNotApplicable, kNotApplicable,
25431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AutocompleteMatchType::NUM_TYPES,
25441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { invalid_offset, invalid_offset, invalid_offset },
25451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { invalid_style, invalid_style, invalid_style } };
25461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
25471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  struct {
25481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string input_text;
25491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string response_json;
25501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const Match matches[5];
25511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } cases[] = {
25521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // A query and an entity suggestion with different search terms.
25531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "x",
25541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "[\"x\",[\"xy\", \"xy\"],[\"\",\"\"],[],"
25551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      " {\"google:suggestdetail\":[{},"
25561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "   {\"a\":\"A\",\"dq\":\"yy\",\"q\":\"p=v\"}],"
25571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggesttype\":[\"QUERY\",\"ENTITY\"]}]",
25581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      { { "x", "", "x", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
25591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { 0, invalid_offset, invalid_offset },
25601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { ACMatchClassification::NONE, invalid_style, invalid_style } },
25611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "xy", "", "xy", AutocompleteMatchType::SEARCH_SUGGEST,
25621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { 0, 1, invalid_offset },
25631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { ACMatchClassification::NONE, ACMatchClassification::MATCH,
25641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            invalid_style } },
25651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "xy - A", "p=v", "yy", AutocompleteMatchType::SEARCH_SUGGEST,
25661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { 0, 1, 2 },
25671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { ACMatchClassification::NONE, ACMatchClassification::MATCH,
25681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            ACMatchClassification::DIM } },
25691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
25701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch
25711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
25721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    },
25731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // A query and an entity suggestion with same search terms.
25741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "x",
25751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "[\"x\",[\"xy\", \"xy\"],[\"\",\"\"],[],"
25761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      " {\"google:suggestdetail\":[{},"
25771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "   {\"a\":\"A\",\"dq\":\"xy\",\"q\":\"p=v\"}],"
25781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggesttype\":[\"QUERY\",\"ENTITY\"]}]",
25791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      { { "x", "", "x", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
25801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { 0, invalid_offset, invalid_offset },
25811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { ACMatchClassification::NONE, invalid_style, invalid_style } },
25821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "xy", "", "xy", AutocompleteMatchType::SEARCH_SUGGEST,
25831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { 0, 1, invalid_offset },
25841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { ACMatchClassification::NONE, ACMatchClassification::MATCH,
25851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            invalid_style } },
25861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "xy - A", "p=v", "xy", AutocompleteMatchType::SEARCH_SUGGEST,
25871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { 0, 1, 2 },
25881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          { ACMatchClassification::NONE, ACMatchClassification::MATCH,
25891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            ACMatchClassification::DIM } },
25901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
25911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch
25921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
25931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    },
25941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
25951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
25961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input_text), false, false);
25971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
25981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Set up a default fetcher with provided results.
25991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    net::TestURLFetcher* fetcher =
26001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        test_factory_.GetFetcherByID(
26011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            SearchProvider::kDefaultProviderURLFetcherID);
26021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(fetcher);
26031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->set_response_code(200);
26041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->SetResponseString(cases[i].response_json);
26051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
26061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RunTillProviderDone();
26081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
26101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_FALSE(matches.empty());
26111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    SCOPED_TRACE("for input with json = " + cases[i].response_json);
26131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    size_t j = 0;
26151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
26161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (; j < matches.size(); ++j) {
26171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const Match& match = cases[i].matches[j];
26181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SCOPED_TRACE(" and match index: " + base::IntToString(j));
26191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(match.contents,
26201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                UTF16ToUTF8(matches[j].contents));
26211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(match.query_params,
26221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                matches[j].search_terms_args->suggest_query_params);
26231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(match.fill_into_edit,
26241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                UTF16ToUTF8(matches[j].fill_into_edit));
26251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(match.type, matches[j].type);
26261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      size_t k = 0;
26281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      for (; k < matches[j].contents_class.size(); k++) {
26291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SCOPED_TRACE(" and contents class: " + base::IntToString(k));
26301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_EQ(match.classification_offsets[k],
26311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            matches[j].contents_class[k].offset);
26321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_EQ(match.classification_styles[k],
26331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            matches[j].contents_class[k].style);
26341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
26351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      for (; k < ARRAYSIZE_UNSAFE(match.classification_offsets); k++) {
26361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        SCOPED_TRACE(" and contents class: " + base::IntToString(k));
26371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_EQ(match.classification_offsets[k], invalid_offset);
26381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        EXPECT_EQ(match.classification_styles[k], invalid_style);
26391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
26401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
26411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Ensure that no expected matches are missing.
26421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j) {
26431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SCOPED_TRACE(" and match index: " + base::IntToString(j));
26441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].contents, kNotApplicable);
26451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].query_params, kNotApplicable);
26461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].fill_into_edit, kNotApplicable);
26471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].type, AutocompleteMatchType::NUM_TYPES);
26481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
26491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
26501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
26511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // !defined(OS_WIN)
26521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SearchProviderTest, SearchHistorySuppressesEntitySuggestion) {
26541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  struct Match {
26551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string contents;
26561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string query_params;
26571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string fill_into_edit;
26581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AutocompleteMatchType::Type type;
26591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
26601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const Match kEmptyMatch = { kNotApplicable, kNotApplicable, kNotApplicable,
26611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              AutocompleteMatchType::NUM_TYPES};
26621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  struct {
26641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string input_text;
26651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string history_search_term;
26661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string response_json;
26671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const Match matches[5];
26681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } cases[] = {
26691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Search history suppresses both query and entity suggestions.
26701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "x", "xy",
26711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "[\"x\",[\"xy\", \"xy\"],[\"\",\"\"],[],"
26721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      " {\"google:suggestdetail\":[{},"
26731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "   {\"a\":\"A\",\"dq\":\"xy\",\"q\":\"p=v\"}],"
26741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggesttype\":[\"QUERY\",\"ENTITY\"]}]",
26751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      {
26761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"xy", "", "xy", AutocompleteMatchType::SEARCH_HISTORY},
26771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"x", "", "x", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED},
26781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"xy - A", "p=v", "xy", AutocompleteMatchType::SEARCH_SUGGEST},
26791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
26801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
26811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
26821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    },
26831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Search history suppresses only query suggestion.
26841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "x", "xyy",
26851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "[\"x\",[\"xy\", \"xy\"],[\"\",\"\"],[],"
26861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      " {\"google:suggestdetail\":[{},"
26871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "   {\"a\":\"A\",\"dq\":\"xyy\",\"q\":\"p=v\"}],"
26881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggesttype\":[\"QUERY\",\"ENTITY\"]}]",
26891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      {
26901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"xyy", "", "xyy", AutocompleteMatchType::SEARCH_HISTORY},
26911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"xy", "", "xy", AutocompleteMatchType::SEARCH_HISTORY},
26921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"x", "", "x", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED},
26931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        {"xy - A", "p=v", "xyy", AutocompleteMatchType::SEARCH_SUGGEST},
26941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
26951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
26961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
26971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
26981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
26991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
27001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GURL term_url(AddSearchToHistory(
27011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        default_t_url_, ASCIIToUTF16(cases[i].history_search_term), 10));
27021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    profile_.BlockUntilHistoryProcessesPendingRequests();
27031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input_text), false, false);
27041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
27051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Set up a default fetcher with provided results.
27061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    net::TestURLFetcher* fetcher =
27071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        test_factory_.GetFetcherByID(
27081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            SearchProvider::kDefaultProviderURLFetcherID);
27091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(fetcher);
27101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->set_response_code(200);
27111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->SetResponseString(cases[i].response_json);
27121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
27131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
27141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RunTillProviderDone();
27151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
27161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
27171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_FALSE(matches.empty());
27181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    SCOPED_TRACE("for case: " + base::IntToString(i));
27191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
27201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    size_t j = 0;
27211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
27221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (; j < matches.size(); ++j) {
27231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SCOPED_TRACE(" and match index: " + base::IntToString(j));
27241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].contents,
27251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                UTF16ToUTF8(matches[j].contents));
27261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].query_params,
27271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                matches[j].search_terms_args->suggest_query_params);
27281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].fill_into_edit,
27291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                UTF16ToUTF8(matches[j].fill_into_edit));
27301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].type, matches[j].type);
27311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
27321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Ensure that no expected matches are missing.
27331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j) {
27341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SCOPED_TRACE(" and match index: " + base::IntToString(j));
27351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].contents, kNotApplicable);
27361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].query_params, kNotApplicable);
27371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].fill_into_edit, kNotApplicable);
27381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].type, AutocompleteMatchType::NUM_TYPES);
27391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
27401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
27411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
27421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2743424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// A basic test that verifies the prefetch metadata parsing logic.
2744424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(SearchProviderTest, PrefetchMetadataParsing) {
2745424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  struct Match {
2746424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    std::string contents;
2747424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool allowed_to_be_prefetched;
2748424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    AutocompleteMatchType::Type type;
2749424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool from_keyword;
2750424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
2751424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const Match kEmptyMatch = { kNotApplicable,
2752424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                              false,
2753424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                              AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
2754424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                              false };
2755424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2756424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  struct {
2757424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const std::string input_text;
2758424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bool prefer_keyword_provider_results;
2759424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const std::string default_provider_response_json;
2760424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const std::string keyword_provider_response_json;
2761424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const Match matches[5];
2762424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  } cases[] = {
2763424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Default provider response does not have prefetch details. Ensure that the
2764424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // suggestions are not marked as prefetch query.
2765424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    { "a",
2766424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      false,
2767424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
2768424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      std::string(),
2769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      { { "a", false, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, false },
2770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "c", false, AutocompleteMatchType::SEARCH_SUGGEST, false },
2771424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "b", false, AutocompleteMatchType::SEARCH_SUGGEST, false },
2772424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        kEmptyMatch,
2773424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        kEmptyMatch
2774424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      },
2775424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    },
2776424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Ensure that default provider suggest response prefetch details are
2777424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // parsed and recorded in AutocompleteMatch.
2778424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    { "ab",
2779424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      false,
2780424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[\"ab\",[\"abc\", \"http://b.com\", \"http://c.com\"],[],[],"
2781424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "{\"google:clientdata\":{\"phi\": 0},"
2782424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\", \"NAVIGATION\"],"
2783424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "\"google:suggestrelevance\":[999, 12, 1]}]",
2784424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      std::string(),
2785424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      { { "ab",    false, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, false },
2786424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "abc",   true,  AutocompleteMatchType::SEARCH_SUGGEST, false },
2787424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "b.com", false, AutocompleteMatchType::NAVSUGGEST, false },
2788424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "c.com", false, AutocompleteMatchType::NAVSUGGEST, false },
2789424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        kEmptyMatch
2790424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      },
2791424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    },
2792424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Default provider suggest response has prefetch details.
2793424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // SEARCH_WHAT_YOU_TYPE suggestion outranks SEARCH_SUGGEST suggestion for
2794424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // the same query string. Ensure that the prefetch details from
2795424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // SEARCH_SUGGEST match are set onto SEARCH_WHAT_YOU_TYPE match.
2796424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    { "ab",
2797424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      false,
2798424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[\"ab\",[\"ab\", \"http://ab.com\"],[],[],"
2799424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "{\"google:clientdata\":{\"phi\": 0},"
2800424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "\"google:suggesttype\":[\"QUERY\", \"NAVIGATION\"],"
2801424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "\"google:suggestrelevance\":[99, 98]}]",
2802424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      std::string(),
2803424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      { {"ab", true, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, false },
2804424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        {"ab.com", false, AutocompleteMatchType::NAVSUGGEST, false },
2805424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        kEmptyMatch,
2806424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        kEmptyMatch,
2807424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        kEmptyMatch
2808424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      },
2809424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    },
2810424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Default provider response has prefetch details. We prefer keyword
2811424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // provider results. Ensure that prefetch bit for a suggestion from the
2812424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // default search provider does not get copied onto a higher-scoring match
2813424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // for the same query string from the keyword provider.
2814424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    { "k a",
2815424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      true,
2816424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[\"k a\",[\"a\", \"ab\"],[],[], {\"google:clientdata\":{\"phi\": 0},"
2817424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "\"google:suggesttype\":[\"QUERY\", \"QUERY\"],"
2818424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          "\"google:suggestrelevance\":[9, 12]}]",
2819424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      "[\"a\",[\"b\", \"c\"],[],[],{\"google:suggestrelevance\":[1, 2]}]",
2820424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      { { "a", false, AutocompleteMatchType::SEARCH_OTHER_ENGINE, true},
2821424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "k a", false, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, false },
2822424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "ab", false, AutocompleteMatchType::SEARCH_SUGGEST, false },
2823424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "c", false, AutocompleteMatchType::SEARCH_SUGGEST, true },
2824424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        { "b", false, AutocompleteMatchType::SEARCH_SUGGEST, true }
2825424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      },
2826424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
2827424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
2828424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2829424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
2830424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input_text), false,
2831424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                  cases[i].prefer_keyword_provider_results);
2832424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2833424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Set up a default fetcher with provided results.
2834424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    net::TestURLFetcher* fetcher =
2835424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        test_factory_.GetFetcherByID(
2836424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            SearchProvider::kDefaultProviderURLFetcherID);
2837424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ASSERT_TRUE(fetcher);
2838424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    fetcher->set_response_code(200);
2839424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    fetcher->SetResponseString(cases[i].default_provider_response_json);
2840424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
2841424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2842424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (cases[i].prefer_keyword_provider_results) {
2843424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      // Set up a keyword fetcher with provided results.
2844424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      net::TestURLFetcher* keyword_fetcher =
2845424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          test_factory_.GetFetcherByID(
2846424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)              SearchProvider::kKeywordProviderURLFetcherID);
2847424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ASSERT_TRUE(keyword_fetcher);
2848424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      keyword_fetcher->set_response_code(200);
2849424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      keyword_fetcher->SetResponseString(
2850424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          cases[i].keyword_provider_response_json);
2851424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      keyword_fetcher->delegate()->OnURLFetchComplete(keyword_fetcher);
2852424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      keyword_fetcher = NULL;
2853424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
2854424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2855424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    RunTillProviderDone();
2856424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2857424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const std::string description =
2858424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        "for input with json =" + cases[i].default_provider_response_json;
2859424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
2860424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // The top match must inline and score as highly as calculated verbatim.
2861424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ASSERT_FALSE(matches.empty());
2862424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_GE(matches[0].relevance, 1300);
2863424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2864424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
2865424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    for (size_t j = 0; j < matches.size(); ++j) {
2866424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SCOPED_TRACE(description);
2867424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].contents, UTF16ToUTF8(matches[j].contents));
2868424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].allowed_to_be_prefetched,
2869424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                SearchProvider::ShouldPrefetch(matches[j]));
2870424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].type, matches[j].type);
2871424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].from_keyword,
2872424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                matches[j].keyword == ASCIIToUTF16("k"));
2873424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
2874424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
2875424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
28764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
28771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// A basic test that verifies that the XSSI guarded JSON response is parsed
28781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// correctly.
28791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(SearchProviderTest, XSSIGuardedJSONParsing) {
28801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  struct Match {
28811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    std::string contents;
28821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    AutocompleteMatchType::Type type;
28831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
28841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const Match kEmptyMatch = { kNotApplicable,
28851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                              AutocompleteMatchType::NUM_TYPES};
28861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
28871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  struct {
28881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string input_text;
28891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const std::string default_provider_response_json;
28901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const Match matches[4];
28911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } cases[] = {
28921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // No XSSI guard.
28931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "a",
28941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "[\"a\",[\"b\", \"c\"],[],[],"
28951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "{\"google:suggesttype\":[\"QUERY\",\"QUERY\"],"
28961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggestrelevance\":[1, 2]}]",
28971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      { { "a", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED },
28981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "c", AutocompleteMatchType::SEARCH_SUGGEST },
28991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "b", AutocompleteMatchType::SEARCH_SUGGEST },
29001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
29011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
29021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    },
29031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Standard XSSI guard - )]}'\n.
29041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "a",
29051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ")]}'\n[\"a\",[\"b\", \"c\"],[],[],"
29061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "{\"google:suggesttype\":[\"QUERY\",\"QUERY\"],"
29071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggestrelevance\":[1, 2]}]",
29081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      { { "a", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED },
29091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "c", AutocompleteMatchType::SEARCH_SUGGEST },
29101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "b", AutocompleteMatchType::SEARCH_SUGGEST },
29111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
29121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
29131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    },
29141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Modified XSSI guard - contains "[".
29151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "a",
29161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ")]}'\n[)\"[\"a\",[\"b\", \"c\"],[],[],"
29171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "{\"google:suggesttype\":[\"QUERY\",\"QUERY\"],"
29181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "\"google:suggestrelevance\":[1, 2]}]",
29191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      { { "a", AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED },
29201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "c", AutocompleteMatchType::SEARCH_SUGGEST },
29211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        { "b", AutocompleteMatchType::SEARCH_SUGGEST },
29221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        kEmptyMatch,
29231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      },
29241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    },
29251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
29261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); i++) {
29281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ClearAllResults();
29291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    QueryForInput(ASCIIToUTF16(cases[i].input_text), false, false);
29301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Set up a default fetcher with provided results.
29321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    net::TestURLFetcher* fetcher =
29331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        test_factory_.GetFetcherByID(
29341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            SearchProvider::kDefaultProviderURLFetcherID);
29351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_TRUE(fetcher);
29361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->set_response_code(200);
29371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->SetResponseString(cases[i].default_provider_response_json);
29381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fetcher->delegate()->OnURLFetchComplete(fetcher);
29391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RunTillProviderDone();
29411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const ACMatches& matches = provider_->matches();
29431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The top match must inline and score as highly as calculated verbatim.
29441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ASSERT_FALSE(matches.empty());
29451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    EXPECT_GE(matches[0].relevance, 1300);
29461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    SCOPED_TRACE("for case: " + base::IntToString(i));
29481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    size_t j = 0;
29491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Ensure that the returned matches equal the expectations.
29501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (; j < matches.size(); ++j) {
29511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SCOPED_TRACE("and match: " + base::IntToString(j));
29521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].contents, UTF16ToUTF8(matches[j].contents));
29531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].type, matches[j].type);
29541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
29551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (; j < ARRAYSIZE_UNSAFE(cases[i].matches); ++j) {
29561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SCOPED_TRACE("and match: " + base::IntToString(j));
29571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].contents, kNotApplicable);
29581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      EXPECT_EQ(cases[i].matches[j].type, AutocompleteMatchType::NUM_TYPES);
29591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
29601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
29611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
29621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(SearchProviderTest, ReflectsBookmarkBarState) {
29654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kShowBookmarkBar, false);
29664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  string16 term = term1_.substr(0, term1_.length() - 1);
29674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QueryForInput(term, true, false);
29684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(provider_->matches().empty());
29694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
29704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            provider_->matches()[0].type);
29714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(provider_->matches()[0].search_terms_args != NULL);
29724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(provider_->matches()[0].search_terms_args->bookmark_bar_pinned);
29734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
29744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  profile_.GetPrefs()->SetBoolean(prefs::kShowBookmarkBar, true);
29754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  term = term1_.substr(0, term1_.length() - 1);
29764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  QueryForInput(term, true, false);
29774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_FALSE(provider_->matches().empty());
29784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
29794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            provider_->matches()[0].type);
29804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(provider_->matches()[0].search_terms_args != NULL);
29814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(provider_->matches()[0].search_terms_args->bookmark_bar_pinned);
29824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2983