15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 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)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_input.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_match.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider_listener.h"
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/omnibox/keyword_provider.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/omnibox/search_provider.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_switches.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static std::ostream& operator<<(std::ostream& os,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const AutocompleteResult::const_iterator& it) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return os << static_cast<const AutocompleteMatch*>(&(*it));
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kResultsPerProvider = 3;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestTemplateURLKeyword[] = "t";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocomplete provider that provides known results. Note that this is
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// refcounted so that it can also be a task on the message loop.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestProvider : public AutocompleteProvider {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestProvider(int relevance, const base::string16& prefix,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Profile* profile,
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               const base::string16 match_keyword)
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : AutocompleteProvider(AutocompleteProvider::TYPE_SEARCH),
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        listener_(NULL),
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile_(profile),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        relevance_(relevance),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefix_(prefix),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        match_keyword_(match_keyword) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start(const AutocompleteInput& input,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     bool minimal_changes) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_listener(AutocompleteProviderListener* listener) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    listener_ = listener;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestProvider() {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Run();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddResults(int start_at, int num);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddResultsWithSearchTermsArgs(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int start_at,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int num,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutocompleteMatch::Type type,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const TemplateURLRef::SearchTermsArgs& search_terms_args);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AutocompleteProviderListener* listener_;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Profile* profile_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int relevance_;
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 prefix_;
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 match_keyword_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::Start(const AutocompleteInput& input,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool minimal_changes) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (minimal_changes)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  matches_.clear();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate 4 results synchronously, the rest later.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResults(0, 1);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResultsWithSearchTermsArgs(
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      1, 1, AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("echo")));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResultsWithSearchTermsArgs(
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      2, 1, AutocompleteMatchType::NAVSUGGEST,
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("nav")));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResultsWithSearchTermsArgs(
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      3, 1, AutocompleteMatchType::SEARCH_SUGGEST,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (input.want_asynchronous_matches()) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    done_ = false;
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        FROM_HERE, base::Bind(&TestProvider::Run, this));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::Run() {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(kResultsPerProvider, 0U);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResults(1, kResultsPerProvider);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done_ = true;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(listener_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  listener_->OnProviderUpdate(true);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::AddResults(int start_at, int num) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResultsWithSearchTermsArgs(start_at,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                num,
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                AutocompleteMatchType::URL_WHAT_YOU_TYPED,
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                TemplateURLRef::SearchTermsArgs(
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    base::string16()));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestProvider::AddResultsWithSearchTermsArgs(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int start_at,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteMatch::Type type,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TemplateURLRef::SearchTermsArgs& search_terms_args) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = start_at; i < num; i++) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteMatch match(this, relevance_ - i, false, type);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    match.fill_into_edit = prefix_ + base::UTF8ToUTF16(base::IntToString(i));
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    match.destination_url = GURL(base::UTF16ToUTF8(match.fill_into_edit));
138c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    match.allowed_to_be_default_match = true;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.contents = match.fill_into_edit;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.contents_class.push_back(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ACMatchClassification(0, ACMatchClassification::NONE));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.description = match.fill_into_edit;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.description_class.push_back(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ACMatchClassification(0, ACMatchClassification::NONE));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.search_terms_args.reset(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TemplateURLRef::SearchTermsArgs(search_terms_args));
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!match_keyword_.empty()) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      match.keyword = match_keyword_;
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      TemplateURLService* service =
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          TemplateURLServiceFactory::GetForProfile(profile_);
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ASSERT_TRUE(match.GetTemplateURL(service, false) != NULL);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches_.push_back(match);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutocompleteProviderTest : public testing::Test,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 public content::NotificationObserver {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct KeywordTestData {
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 fill_into_edit;
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 keyword;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::string16 expected_associated_keyword;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct AssistedQueryStatsTestData {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AutocompleteMatch::Type match_type;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string expected_aqs;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Registers a test TemplateURL under the given keyword.
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RegisterTemplateURL(const base::string16 keyword,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& template_url);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets |controller_| with two TestProviders.  |provider1_ptr| and
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |provider2_ptr| are updated to point to the new providers if non-NULL.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetControllerWithTestProviders(bool same_destinations,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        TestProvider** provider1_ptr,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        TestProvider** provider2_ptr);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs a query on the input "a", and makes sure both providers' input is
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properly collected.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Constructs an AutocompleteResult from |match_data|, sets the |controller_|
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // to pretend it was running against input |input|, calls the |controller_|'s
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // UpdateAssociatedKeywords, and checks that the matches have associated
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // keywords as expected.
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunKeywordTest(const base::string16& input,
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      const KeywordTestData* match_data,
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                      size_t size);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunAssistedQueryStatsTest(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AssistedQueryStatsTestData* aqs_test_data,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_t size);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RunQuery(const base::string16 query);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetControllerWithKeywordAndSearchProviders();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetControllerWithKeywordProvider();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunExactKeymatchTest(bool allow_exact_keyword_match);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void CopyResults();
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns match.destination_url as it would be set by
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // AutocompleteController::UpdateMatchDestinationURL().
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL GetDestinationURL(AutocompleteMatch match,
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                         base::TimeDelta query_formulation_time) const;
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteResult result_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AutocompleteController> controller_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // content::NotificationObserver:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RegisterTemplateURL(
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 keyword,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& template_url) {
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (TemplateURLServiceFactory::GetForProfile(&profile_) == NULL) {
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLData data;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL(template_url);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetKeyword(keyword);
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL* default_t_url = new TemplateURL(data);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* turl_model =
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(&profile_);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(default_t_url);
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  turl_model->SetUserSelectedDefaultSearchProvider(default_t_url);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Load();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID default_provider_id = default_t_url->id();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, default_provider_id);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::ResetControllerWithTestProviders(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool same_destinations,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestProvider** provider1_ptr,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestProvider** provider2_ptr) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO: Move it outside this method, after refactoring the existing
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unit tests.  Specifically:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   (1) Make sure that AutocompleteMatch.keyword is set iff there is
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       a corresponding call to RegisterTemplateURL; otherwise the
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       controller flow will crash; this practically means that
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       RunTests/ResetControllerXXX/RegisterTemplateURL should
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       be coordinated with each other.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   (2) Inject test arguments rather than rely on the hardcoded values, e.g.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       don't rely on kResultsPerProvided and default relevance ordering
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       (B > A).
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RegisterTemplateURL(base::ASCIIToUTF16(kTestTemplateURLKeyword),
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      "http://aqs/{searchTerms}/{google:assistedQueryStats}");
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AutocompleteController::Providers providers;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct two new providers, with either the same or different prefixes.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProvider* provider1 = new TestProvider(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kResultsPerProvider,
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16("http://a"),
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_,
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16(kTestTemplateURLKeyword));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  providers.push_back(provider1);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProvider* provider2 = new TestProvider(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kResultsPerProvider * 2,
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      same_destinations ? base::ASCIIToUTF16("http://a")
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        : base::ASCIIToUTF16("http://b"),
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_,
279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  providers.push_back(provider2);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the controller to contain our new providers.
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  controller_.reset(new AutocompleteController(
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &profile_, TemplateURLServiceFactory::GetForProfile(&profile_), NULL, 0));
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We're going to swap the providers vector, but the old vector should be
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // empty so no elements need to be freed at this point.
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(controller_->providers_.empty());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->providers_.swap(providers);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1->set_listener(controller_.get());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider2->set_listener(controller_.get());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The providers don't complete synchronously, so listen for "result updated"
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifications.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<AutocompleteController>(controller_.get()));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (provider1_ptr)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *provider1_ptr = provider1;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (provider2_ptr)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *provider2_ptr = provider2;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetControllerWithKeywordAndSearchProviders() {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the default TemplateURL.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLData data;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://defaultturl/{searchTerms}");
312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL* default_t_url = new TemplateURL(data);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* turl_model =
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(&profile_);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(default_t_url);
3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  turl_model->SetUserSelectedDefaultSearchProvider(default_t_url);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID default_provider_id = default_t_url->id();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, default_provider_id);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another TemplateURL for KeywordProvider.
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TemplateURLData data2;
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data2.short_name = base::ASCIIToUTF16("k");
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data2.SetKeyword(base::ASCIIToUTF16("k"));
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data2.SetURL("http://keyword/{searchTerms}");
325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL* keyword_t_url = new TemplateURL(data2);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(keyword_t_url);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, keyword_t_url->id());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.reset(new AutocompleteController(
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &profile_, TemplateURLServiceFactory::GetForProfile(&profile_), NULL,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutocompleteProvider::TYPE_KEYWORD | AutocompleteProvider::TYPE_SEARCH));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::ResetControllerWithKeywordProvider() {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLService* turl_model =
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(&profile_);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a TemplateURL for KeywordProvider.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLData data;
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.short_name = base::ASCIIToUTF16("foo.com");
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.SetKeyword(base::ASCIIToUTF16("foo.com"));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://foo.com/{searchTerms}");
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TemplateURL* keyword_t_url = new TemplateURL(data);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(keyword_t_url);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, keyword_t_url->id());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Make a TemplateURL for KeywordProvider that a shorter version of the
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // first.
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  data.short_name = base::ASCIIToUTF16("f");
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  data.SetKeyword(base::ASCIIToUTF16("f"));
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  data.SetURL("http://f.com/{searchTerms}");
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  keyword_t_url = new TemplateURL(data);
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  turl_model->Add(keyword_t_url);
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_NE(0, keyword_t_url->id());
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create another TemplateURL for KeywordProvider.
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.short_name = base::ASCIIToUTF16("bar.com");
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.SetKeyword(base::ASCIIToUTF16("bar.com"));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.SetURL("http://bar.com/{searchTerms}");
363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  keyword_t_url = new TemplateURL(data);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turl_model->Add(keyword_t_url);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(0, keyword_t_url->id());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_.reset(new AutocompleteController(
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      &profile_, TemplateURLServiceFactory::GetForProfile(&profile_), NULL,
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AutocompleteProvider::TYPE_KEYWORD));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RunTest() {
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RunQuery(base::ASCIIToUTF16("a"));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void AutocompleteProviderTest::RunKeywordTest(const base::string16& input,
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                              const KeywordTestData* match_data,
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                              size_t size) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatches matches;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteMatch match;
382c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    match.relevance = 1000;  // Arbitrary non-zero value.
383c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    match.allowed_to_be_default_match = true;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.fill_into_edit = match_data[i].fill_into_edit;
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    match.transition = ui::PAGE_TRANSITION_KEYWORD;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.keyword = match_data[i].keyword;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches.push_back(match);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteResult result;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.AppendMatches(matches);
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  controller_->input_ = AutocompleteInput(
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      input, base::string16::npos, base::string16(), GURL(),
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS,
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      false, true, true, true, ChromeAutocompleteSchemeClassifier(&profile_));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->UpdateAssociatedKeywords(&result);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t j = 0; j < result.size(); ++j) {
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(match_data[j].expected_associated_keyword,
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              result.match_at(j)->associated_keyword.get() ?
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  result.match_at(j)->associated_keyword->keyword :
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  base::string16());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RunAssistedQueryStatsTest(
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AssistedQueryStatsTestData* aqs_test_data,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t size) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prepare input.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kMaxRelevance = 1000;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACMatches matches;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteMatch match(NULL, kMaxRelevance - i, false,
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            aqs_test_data[i].match_type);
415c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    match.allowed_to_be_default_match = true;
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    match.keyword = base::ASCIIToUTF16(kTestTemplateURLKeyword);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match.search_terms_args.reset(
418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        new TemplateURLRef::SearchTermsArgs(base::string16()));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    matches.push_back(match);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_.Reset();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_.AppendMatches(matches);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update AQS.
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->UpdateAssistedQueryStats(&result_);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify data.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < size; ++i) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(aqs_test_data[i].expected_aqs,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              result_.match_at(i)->search_terms_args->assisted_query_stats);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void AutocompleteProviderTest::RunQuery(const base::string16 query) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result_.Reset();
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller_->Start(AutocompleteInput(
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      query, base::string16::npos, base::string16(), GURL(),
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      metrics::OmniboxEventProto::INVALID_SPEC, true, false, true, true,
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ChromeAutocompleteSchemeClassifier(&profile_)));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!controller_->done())
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The message loop will terminate when all autocomplete input has been
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // collected.
44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::RunExactKeymatchTest(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allow_exact_keyword_match) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the controller input which exactly matches the keyword provider we
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // created in ResetControllerWithKeywordAndSearchProviders().  The default
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // match should thus be a search-other-engine match iff
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |allow_exact_keyword_match| is true.  Regardless, the match should
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be from SearchProvider.  (It provides all verbatim search matches,
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // keyword or not.)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller_->Start(AutocompleteInput(
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16("k test"), base::string16::npos, base::string16(),
4576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GURL(), metrics::OmniboxEventProto::INVALID_SPEC, true, false,
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      allow_exact_keyword_match, false,
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ChromeAutocompleteSchemeClassifier(&profile_)));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(controller_->done());
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(AutocompleteProvider::TYPE_SEARCH,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      controller_->result().default_match()->provider->type());
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(allow_exact_keyword_match ?
46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      AutocompleteMatchType::SEARCH_OTHER_ENGINE :
46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      controller_->result().default_match()->type);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AutocompleteProviderTest::CopyResults() {
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  result_.CopyFrom(controller_->result());
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GURL AutocompleteProviderTest::GetDestinationURL(
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    AutocompleteMatch match,
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::TimeDelta query_formulation_time) const {
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  controller_->UpdateMatchDestinationURLWithQueryFormulationTime(
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      query_formulation_time, &match);
478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return match.destination_url;
479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutocompleteProviderTest::Observe(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (controller_->done()) {
486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CopyResults();
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the default selection is set properly when updating results.
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, Query) {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProvider* provider1 = NULL;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProvider* provider2 = NULL;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetControllerWithTestProviders(false, &provider1, &provider2);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the default match gets set to the highest relevance match.  The
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // highest relevance matches should come from the second provider.
500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kResultsPerProvider * 2, result_.size());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(result_.end(), result_.default_match());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(provider2, result_.default_match()->provider);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests assisted query stats.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, AssistedQueryStats) {
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetControllerWithTestProviders(false, NULL, NULL);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(kResultsPerProvider * 2, result_.size());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, check the results from the second provider, as they should not have
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // assisted query stats set.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kResultsPerProvider; ++i) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result_.match_at(i)->search_terms_args->assisted_query_stats.empty());
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first provider has a test keyword, so AQS should be non-empty.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = kResultsPerProvider; i < kResultsPerProvider * 2; ++i) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result_.match_at(i)->search_terms_args->assisted_query_stats.empty());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, RemoveDuplicates) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProvider* provider1 = NULL;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProvider* provider2 = NULL;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetControllerWithTestProviders(true, &provider1, &provider2);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure all the first provider's results were eliminated by the second
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provider's.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kResultsPerProvider, result_.size());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (AutocompleteResult::const_iterator i(result_.begin());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != result_.end(); ++i)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(provider2, i->provider);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, AllowExactKeywordMatch) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetControllerWithKeywordAndSearchProviders();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunExactKeymatchTest(true);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunExactKeymatchTest(false);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Ensures matches from (only) the default search provider respect any extra
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// query params set on the command line.
547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(AutocompleteProviderTest, ExtraQueryParams) {
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ResetControllerWithKeywordAndSearchProviders();
549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      switches::kExtraSearchQueryParams, "a=b");
551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RunExactKeymatchTest(true);
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CopyResults();
553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(2U, result_.size());
554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("http://keyword/test",
555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            result_.match_at(0)->destination_url.possibly_invalid_spec());
556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("http://defaultturl/k%20test?a=b",
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            result_.match_at(1)->destination_url.possibly_invalid_spec());
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that redundant associated keywords are removed.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, RedundantKeywordsIgnoredInResult) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetControllerWithKeywordProvider();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KeywordTestData duplicate_url[] = {
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("fo"), base::string16(), base::string16() },
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(),
5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::ASCIIToUTF16("foo.com") },
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(), base::string16() }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Duplicate url");
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunKeywordTest(base::ASCIIToUTF16("fo"), duplicate_url,
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   ARRAYSIZE_UNSAFE(duplicate_url));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KeywordTestData keyword_match[] = {
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::ASCIIToUTF16("foo.com"),
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::string16() },
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(), base::string16() }
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Duplicate url with keyword match");
5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunKeywordTest(base::ASCIIToUTF16("fo"), keyword_match,
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   ARRAYSIZE_UNSAFE(keyword_match));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KeywordTestData multiple_keyword[] = {
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("fo"), base::string16(), base::string16() },
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(),
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::ASCIIToUTF16("foo.com") },
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(), base::string16() },
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("bar.com"), base::string16(),
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::ASCIIToUTF16("bar.com") },
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Duplicate url with multiple keywords");
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunKeywordTest(base::ASCIIToUTF16("fo"), multiple_keyword,
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   ARRAYSIZE_UNSAFE(multiple_keyword));
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that exact match keywords trump keywords associated with
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the match.
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(AutocompleteProviderTest, ExactMatchKeywords) {
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ResetControllerWithKeywordProvider();
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    KeywordTestData keyword_match[] = {
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(),
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::ASCIIToUTF16("foo.com") }
6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    };
6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE("keyword match as usual");
6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunKeywordTest(base::ASCIIToUTF16("fo"), keyword_match,
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   ARRAYSIZE_UNSAFE(keyword_match));
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The same result set with an input of "f" (versus "fo") should get
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // a different associated keyword because "f" is an exact match for
6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // a keyword and that should trump the keyword normally associated with
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // this match.
6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {
6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    KeywordTestData keyword_match[] = {
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      { base::ASCIIToUTF16("foo.com"), base::string16(),
6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::ASCIIToUTF16("f") }
6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    };
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE("keyword exact match");
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    RunKeywordTest(base::ASCIIToUTF16("f"), keyword_match,
6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   ARRAYSIZE_UNSAFE(keyword_match));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutocompleteProviderTest, UpdateAssistedQueryStats) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetControllerWithTestProviders(false, NULL, NULL);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AssistedQueryStatsTestData test_data[] = {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      //  MSVC doesn't support zero-length arrays, so supply some dummy data.
64390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "" }
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("No matches");
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note: We pass 0 here to ignore the dummy data above.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAssistedQueryStatsTest(test_data, 0);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AssistedQueryStatsTestData test_data[] = {
6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      { AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED, "chrome..69i57" }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("One match");
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAssistedQueryStatsTest(test_data, ARRAYSIZE_UNSAFE(test_data));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AssistedQueryStatsTestData test_data[] = {
66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
6617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "chrome..69i57j69i58j5l2j0l3j69i59" },
66290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::URL_WHAT_YOU_TYPED,
6637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        "chrome..69i57j69i58j5l2j0l3j69i59" },
66490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::NAVSUGGEST,
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "chrome.2.69i57j69i58j5l2j0l3j69i59" },
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::NAVSUGGEST,
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "chrome.3.69i57j69i58j5l2j0l3j69i59" },
66890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::SEARCH_SUGGEST,
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "chrome.4.69i57j69i58j5l2j0l3j69i59" },
67090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::SEARCH_SUGGEST,
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "chrome.5.69i57j69i58j5l2j0l3j69i59" },
67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::SEARCH_SUGGEST,
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "chrome.6.69i57j69i58j5l2j0l3j69i59" },
67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      { AutocompleteMatchType::SEARCH_HISTORY,
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "chrome.7.69i57j69i58j5l2j0l3j69i59" },
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("Multiple matches");
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RunAssistedQueryStatsTest(test_data, ARRAYSIZE_UNSAFE(test_data));
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(AutocompleteProviderTest, GetDestinationURL) {
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetControllerWithKeywordAndSearchProviders();
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For the destination URL to have aqs parameters for query formulation time
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and the field trial triggered bit, many conditions need to be satisfied.
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteMatch match(NULL, 1100, false,
68890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                          AutocompleteMatchType::SEARCH_SUGGEST);
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL url(GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456)));
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(url.path().empty());
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The protocol needs to be https.
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RegisterTemplateURL(base::ASCIIToUTF16(kTestTemplateURLKeyword),
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      "https://aqs/{searchTerms}/{google:assistedQueryStats}");
695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(url.path().empty());
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There needs to be a keyword provider.
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  match.keyword = base::ASCIIToUTF16(kTestTemplateURLKeyword);
700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(url.path().empty());
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // search_terms_args needs to be set.
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  match.search_terms_args.reset(
705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new TemplateURLRef::SearchTermsArgs(base::string16()));
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(url.path().empty());
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // assisted_query_stats needs to have been previously set.
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  match.search_terms_args->assisted_query_stats =
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "chrome.0.69i57j69i58j5l2j0l3j69i59";
712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j0j0&", url.path());
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test field trial triggered bit set.
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller_->search_provider_->field_trial_triggered_in_session_ = true;
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      controller_->search_provider_->field_trial_triggered_in_session());
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j1j0&", url.path());
721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Test page classification set.
7236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  controller_->input_.current_page_classification_ =
7246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      metrics::OmniboxEventProto::OTHER;
725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  controller_->search_provider_->field_trial_triggered_in_session_ = false;
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      controller_->search_provider_->field_trial_triggered_in_session());
728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j0j4&", url.path());
730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Test page classification and field trial triggered set.
732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  controller_->search_provider_->field_trial_triggered_in_session_ = true;
733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(
734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      controller_->search_provider_->field_trial_triggered_in_session());
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  url = GetDestinationURL(match, base::TimeDelta::FromMilliseconds(2456));
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("//aqs=chrome.0.69i57j69i58j5l2j0l3j69i59.2456j1j4&", url.path());
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
738