172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h"
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/autocomplete/keyword_provider.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/autocomplete/search_provider.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/search_engines/template_url.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/search_engines/template_url_model.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process_test.h"
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/test/testing_profile.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic std::ostream& operator<<(std::ostream& os,
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                const AutocompleteResult::const_iterator& it) {
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return os << static_cast<const AutocompleteMatch*>(&(*it));
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t num_results_per_provider = 3;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Autocomplete provider that provides known results. Note that this is
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// refcounted so that it can also be a task on the message loop.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestProvider : public AutocompleteProvider {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestProvider(int relevance, const string16& prefix)
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : AutocompleteProvider(NULL, NULL, ""),
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        relevance_(relevance),
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        prefix_(prefix) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Start(const AutocompleteInput& input,
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bool minimal_changes);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_listener(ACProviderListener* listener) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    listener_ = listener;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~TestProvider() {}
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Run();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddResults(int start_at, int num);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int relevance_;
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16 prefix_;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestProvider::Start(const AutocompleteInput& input,
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         bool minimal_changes) {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minimal_changes)
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  matches_.clear();
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate one result synchronously, the rest later.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddResults(0, 1);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (input.matches_requested() == AutocompleteInput::ALL_MATCHES) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    done_ = false;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        this, &TestProvider::Run));
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestProvider::Run() {
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_GT(num_results_per_provider, 0U);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddResults(1, num_results_per_provider);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  done_ = true;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(listener_);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  listener_->OnProviderUpdate(true);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TestProvider::AddResults(int start_at, int num) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = start_at; i < num; i++) {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AutocompleteMatch match(this, relevance_ - i, false,
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            AutocompleteMatch::URL_WHAT_YOU_TYPED);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    match.fill_into_edit = prefix_ + UTF8ToUTF16(base::IntToString(i));
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    match.destination_url = GURL(UTF16ToUTF8(match.fill_into_edit));
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    match.contents = match.fill_into_edit;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    match.contents_class.push_back(
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ACMatchClassification(0, ACMatchClassification::NONE));
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    match.description = match.fill_into_edit;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    match.description_class.push_back(
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ACMatchClassification(0, ACMatchClassification::NONE));
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    matches_.push_back(match);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteProviderTest : public testing::Test,
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 public NotificationObserver {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ResetControllerWithTestProviders(bool same_destinations);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Runs a query on the input "a", and makes sure both providers' input is
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // properly collected.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RunTest();
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ResetControllerWithTestProvidersWithKeywordAndSearchProviders();
1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void RunExactKeymatchTest(bool allow_exact_keyword_match);
1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These providers are owned by the controller once it's created.
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ACProviders providers_;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteResult result_;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ScopedTestingBrowserProcess browser_process_;
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoopForUI message_loop_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<AutocompleteController> controller_;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
1334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TestingProfile profile_;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid AutocompleteProviderTest::ResetControllerWithTestProviders(
1374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    bool same_destinations) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Forget about any existing providers.  The controller owns them and will
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Release() them below, when we delete it during the call to reset().
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providers_.clear();
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Construct two new providers, with either the same or different prefixes.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestProvider* providerA = new TestProvider(num_results_per_provider,
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                             ASCIIToUTF16("http://a"));
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providerA->AddRef();
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providers_.push_back(providerA);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestProvider* providerB = new TestProvider(num_results_per_provider * 2,
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      same_destinations ? ASCIIToUTF16("http://a") : ASCIIToUTF16("http://b"));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providerB->AddRef();
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providers_.push_back(providerB);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reset the controller to contain our new providers.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteController* controller = new AutocompleteController(providers_);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller_.reset(controller);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providerA->set_listener(controller);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  providerB->set_listener(controller);
1584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The providers don't complete synchronously, so listen for "result updated"
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // notifications.
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  registrar_.Add(this, NotificationType::AUTOCOMPLETE_CONTROLLER_RESULT_READY,
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                 NotificationService::AllSources());
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid AutocompleteProviderTest::
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ResetControllerWithTestProvidersWithKeywordAndSearchProviders() {
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  profile_.CreateTemplateURLModel();
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Reset the default TemplateURL.
1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TemplateURL* default_t_url = new TemplateURL();
1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  default_t_url->SetURL("http://defaultturl/{searchTerms}", 0, 0);
1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TemplateURLModel* turl_model = profile_.GetTemplateURLModel();
1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  turl_model->Add(default_t_url);
1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  turl_model->SetDefaultSearchProvider(default_t_url);
1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TemplateURLID default_provider_id = default_t_url->id();
1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_NE(0, default_provider_id);
1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Create another TemplateURL for KeywordProvider.
1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  TemplateURL* keyword_t_url = new TemplateURL();
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  keyword_t_url->set_short_name(ASCIIToUTF16("k"));
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  keyword_t_url->set_keyword(ASCIIToUTF16("k"));
1824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  keyword_t_url->SetURL("http://keyword/{searchTerms}", 0, 0);
1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  profile_.GetTemplateURLModel()->Add(keyword_t_url);
1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_NE(0, keyword_t_url->id());
1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Forget about any existing providers.  The controller owns them and will
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Release() them below, when we delete it during the call to reset().
1884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  providers_.clear();
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Create both a keyword and search provider, and add them in that order.
1914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // (Order is important; see comments in RunExactKeymatchTest().)
1924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  AutocompleteProvider* keyword_provider = new KeywordProvider(NULL,
1934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                                                &profile_);
1944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  keyword_provider->AddRef();
1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  providers_.push_back(keyword_provider);
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  AutocompleteProvider* search_provider = new SearchProvider(NULL, &profile_);
1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  search_provider->AddRef();
1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  providers_.push_back(search_provider);
1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  AutocompleteController* controller = new AutocompleteController(providers_);
2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  controller_.reset(controller);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutocompleteProviderTest::RunTest() {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result_.Reset();
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  controller_->Start(ASCIIToUTF16("a"), string16(), true, false, true,
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     AutocompleteInput::ALL_MATCHES);
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The message loop will terminate when all autocomplete input has been
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // collected.
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->Run();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid AutocompleteProviderTest::RunExactKeymatchTest(
2154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    bool allow_exact_keyword_match) {
2164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Send the controller input which exactly matches the keyword provider we
2174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // created in ResetControllerWithKeywordAndSearchProviders().  The default
2184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // match should thus be a keyword match iff |allow_exact_keyword_match| is
2194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // true.
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  controller_->Start(ASCIIToUTF16("k test"), string16(), true, false,
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     allow_exact_keyword_match,
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     AutocompleteInput::SYNCHRONOUS_MATCHES);
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_TRUE(controller_->done());
2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // ResetControllerWithKeywordAndSearchProviders() adds the keyword provider
2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // first, then the search provider.  So if the default match is a keyword
2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // match, it will come from provider 0, otherwise from provider 1.
2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(providers_[allow_exact_keyword_match ? 0 : 1],
2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      controller_->result().default_match()->provider);
2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AutocompleteProviderTest::Observe(NotificationType type,
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const NotificationSource& source,
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const NotificationDetails& details) {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (controller_->done()) {
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    result_.CopyFrom(controller_->result());
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->Quit();
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the default selection is set properly when updating results.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(AutocompleteProviderTest, Query) {
2424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ResetControllerWithTestProviders(false);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RunTest();
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the default match gets set to the highest relevance match.  The
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // highest relevance matches should come from the second provider.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(num_results_per_provider * 2, result_.size());  // two providers
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NE(result_.end(), result_.default_match());
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(providers_[1], result_.default_match()->provider);
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(AutocompleteProviderTest, RemoveDuplicates) {
2534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ResetControllerWithTestProviders(true);
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RunTest();
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure all the first provider's results were eliminated by the second
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // provider's.
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(num_results_per_provider, result_.size());
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (AutocompleteResult::const_iterator i(result_.begin());
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != result_.end(); ++i)
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(providers_[1], i->provider);
2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(AutocompleteProviderTest, AllowExactKeywordMatch) {
2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ResetControllerWithTestProvidersWithKeywordAndSearchProviders();
2664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  RunExactKeymatchTest(true);
2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  RunExactKeymatchTest(false);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef TestingBrowserProcessTest AutocompleteTest;
271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
272dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(AutocompleteTest, InputType) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct test_data {
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16 input;
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const AutocompleteInput::Type type;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } input_cases[] = {
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16(""), AutocompleteInput::INVALID },
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("?"), AutocompleteInput::FORCED_QUERY },
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("?foo"), AutocompleteInput::FORCED_QUERY },
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("?foo bar"), AutocompleteInput::FORCED_QUERY },
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("?http://foo.com/bar"), AutocompleteInput::FORCED_QUERY },
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo"), AutocompleteInput::UNKNOWN },
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo.c"), AutocompleteInput::UNKNOWN },
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo.com"), AutocompleteInput::URL },
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("-.com"), AutocompleteInput::UNKNOWN },
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo/bar"), AutocompleteInput::URL },
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo;bar"), AutocompleteInput::QUERY },
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo/bar baz"), AutocompleteInput::UNKNOWN },
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo bar.com"), AutocompleteInput::QUERY },
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo bar"), AutocompleteInput::QUERY },
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo+bar"), AutocompleteInput::QUERY },
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo+bar.com"), AutocompleteInput::UNKNOWN },
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("\"foo:bar\""), AutocompleteInput::QUERY },
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("link:foo.com"), AutocompleteInput::UNKNOWN },
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo:81"), AutocompleteInput::URL },
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("www.foo.com:81"), AutocompleteInput::URL },
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("localhost:8080"), AutocompleteInput::URL },
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo.com:123456"), AutocompleteInput::QUERY },
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo.com:abc"), AutocompleteInput::QUERY },
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("1.2.3.4:abc"), AutocompleteInput::QUERY },
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user@foo.com"), AutocompleteInput::UNKNOWN },
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@"), AutocompleteInput::UNKNOWN },
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@!foo.com"), AutocompleteInput::UNKNOWN },
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@foo"), AutocompleteInput::URL },
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@foo.c"), AutocompleteInput::URL },
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@foo.com"), AutocompleteInput::URL },
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@foo.com:81"), AutocompleteInput::URL },
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@foo:81"), AutocompleteInput::URL },
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("1.2"), AutocompleteInput::UNKNOWN },
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("1.2/45"), AutocompleteInput::UNKNOWN },
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("1.2:45"), AutocompleteInput::UNKNOWN },
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user@1.2:45"), AutocompleteInput::UNKNOWN },
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("user:pass@1.2:45"), AutocompleteInput::URL },
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("ps/2 games"), AutocompleteInput::UNKNOWN },
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("en.wikipedia.org/wiki/James Bond"),
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        AutocompleteInput::URL },
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // In Chrome itself, mailto: will get handled by ShellExecute, but in
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // unittest mode, we don't have the data loaded in the external protocol
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // handler to know this.
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // { ASCIIToUTF16("mailto:abuse@foo.com"), AutocompleteInput::URL },
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:http://www.foo.com/"), AutocompleteInput::URL },
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("javascript:alert(\"Hey there!\");"),
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        AutocompleteInput::URL },
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("C:\\Program Files"), AutocompleteInput::URL },
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("\\\\Server\\Folder\\File"), AutocompleteInput::URL },
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_WIN)
32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http:foo"), AutocompleteInput::URL },
32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo"), AutocompleteInput::URL },
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo.c"), AutocompleteInput::URL },
33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo.com"), AutocompleteInput::URL },
33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo_bar.com"), AutocompleteInput::URL },
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo/bar baz"), AutocompleteInput::URL },
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://-.com"), AutocompleteInput::UNKNOWN },
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://_foo_.com"), AutocompleteInput::UNKNOWN },
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo.com:abc"), AutocompleteInput::QUERY },
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo.com:123456"), AutocompleteInput::QUERY },
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://1.2.3.4:abc"), AutocompleteInput::QUERY },
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http:user@foo.com"), AutocompleteInput::URL },
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://user@foo.com"), AutocompleteInput::URL },
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http:user:pass@foo.com"), AutocompleteInput::URL },
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://user:pass@foo.com"), AutocompleteInput::URL },
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://1.2"), AutocompleteInput::URL },
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://1.2/45"), AutocompleteInput::URL },
34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http:ps/2 games"), AutocompleteInput::URL },
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://ps/2 games"), AutocompleteInput::URL },
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("https://foo.com"), AutocompleteInput::URL },
34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("127.0.0.1"), AutocompleteInput::URL },
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("127.0.1"), AutocompleteInput::UNKNOWN },
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("127.0.1/"), AutocompleteInput::UNKNOWN },
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("browser.tabs.closeButtons"), AutocompleteInput::UNKNOWN },
35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { WideToUTF16(L"\u6d4b\u8bd5"), AutocompleteInput::UNKNOWN },
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("[2001:]"), AutocompleteInput::QUERY },  // Not a valid IP
35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("[2001:dB8::1]"), AutocompleteInput::URL },
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("192.168.0.256"),
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        AutocompleteInput::QUERY },  // Invalid IPv4 literal.
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("[foo.com]"),
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        AutocompleteInput::QUERY },  // Invalid IPv6 literal.
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    SCOPED_TRACE(input_cases[i].input);
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    AutocompleteInput input(input_cases[i].input, string16(), true, false,
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            true, AutocompleteInput::ALL_MATCHES);
36521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_EQ(input_cases[i].type, input.type());
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(AutocompleteTest, InputTypeWithDesiredTLD) {
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct test_data {
37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16 input;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const AutocompleteInput::Type type;
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } input_cases[] = {
37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("401k"), AutocompleteInput::REQUESTED_URL },
37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("999999999999999"), AutocompleteInput::REQUESTED_URL },
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    AutocompleteInput input(input_cases[i].input, ASCIIToUTF16("com"), true,
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            false, true, AutocompleteInput::ALL_MATCHES);
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input_cases[i].type, input.type()) << "Input: " <<
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        input_cases[i].input;
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests for a regression where certain input in the omnibox caused us to
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// crash. As long as the test completes without crashing, we're fine.
388dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(AutocompleteTest, InputCrash) {
38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteInput input(WideToUTF16(L"\uff65@s"), string16(), true, false,
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          true, AutocompleteInput::ALL_MATCHES);
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test comparing matches relevance.
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AutocompleteMatch, MoreRelevant) {
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct RelevantCases {
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int r1;
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int r2;
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool expected_result;
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } cases[] = {
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {  10,   0, true  },
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {  10,  -5, true  },
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {  -5,  10, false },
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {   0,  10, false },
40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { -10,  -5, false  },
40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    {  -5, -10, true },
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteMatch m1(NULL, 0, false, AutocompleteMatch::URL_WHAT_YOU_TYPED);
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteMatch m2(NULL, 0, false, AutocompleteMatch::URL_WHAT_YOU_TYPED);
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    m1.relevance = cases[i].r1;
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    m2.relevance = cases[i].r2;
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(cases[i].expected_result,
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              AutocompleteMatch::MoreRelevant(m1, m2));
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AutocompleteInput, ParseForEmphasizeComponent) {
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  using url_parse::Component;
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Component kInvalidComponent(0, -1);
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct test_data {
42372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const string16 input;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const Component scheme;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const Component host;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } input_cases[] = {
42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16(""), kInvalidComponent, kInvalidComponent },
42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("?"), kInvalidComponent, kInvalidComponent },
42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("?http://foo.com/bar"), kInvalidComponent,
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        kInvalidComponent },
43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("foo/bar baz"), kInvalidComponent, Component(0, 3) },
43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("http://foo/bar baz"), Component(0, 4), Component(7, 3) },
43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("link:foo.com"), Component(0, 4), kInvalidComponent },
43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("www.foo.com:81"), kInvalidComponent, Component(0, 11) },
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { WideToUTF16(L"\u6d4b\u8bd5"), kInvalidComponent, Component(0, 2) },
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:http://www.foo.com/"), Component(12, 4),
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        Component(19, 11) },
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:https://example.com/"),
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Component(12, 5), Component(20, 11) },
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:www.foo.com"), kInvalidComponent,
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        Component(12, 11) },
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:"), Component(0, 11), kInvalidComponent },
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:garbage"), kInvalidComponent,
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        Component(12, 7) },
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:http://http://foo"), Component(12, 4),
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        Component(19, 4) },
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ASCIIToUTF16("view-source:view-source:http://example.com/"),
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        Component(12, 11), kInvalidComponent }
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ScopedTestingBrowserProcess browser_process;
452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input_cases); ++i) {
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Component scheme, host;
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AutocompleteInput::ParseForEmphasizeComponents(input_cases[i].input,
45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                   string16(),
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                   &scheme,
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                   &host);
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    AutocompleteInput input(input_cases[i].input, string16(), true, false,
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            true, AutocompleteInput::ALL_MATCHES);
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input_cases[i].scheme.begin, scheme.begin) << "Input: " <<
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        input_cases[i].input;
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input_cases[i].scheme.len, scheme.len) << "Input: " <<
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        input_cases[i].input;
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input_cases[i].host.begin, host.begin) << "Input: " <<
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        input_cases[i].input;
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input_cases[i].host.len, host.len) << "Input: " <<
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        input_cases[i].input;
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
473