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
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h"
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/search_provider.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h"
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/browser/prefs/pref_service.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url_model.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/test_url_fetcher_factory.h"
163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/common/pref_names.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process_test.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_status.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following environment is configured for these tests:
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The TemplateURL default_t_url_ is set as the default provider.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The TemplateURL keyword_t_url_ is added to the TemplateURLModel. This
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   TemplateURL has a valid suggest and search URL.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The URL created by using the search term term1_ with default_t_url_ is
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   added to history.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . The URL created by using the search term keyword_term_ with keyword_t_url_
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   is added to history.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . test_factory_ is set as the URLFetcher::Factory.
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SearchProviderTest : public TestingBrowserProcessTest,
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           public AutocompleteProvider::ACProviderListener {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SearchProviderTest()
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : default_t_url_(NULL),
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        term1_(UTF8ToUTF16("term1")),
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        keyword_t_url_(NULL),
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        keyword_term_(UTF8ToUTF16("keyword")),
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        io_thread_(BrowserThread::IO),
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        quit_when_done_(false) {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    io_thread_.Start();
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See description above class for what this registers.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown();
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns an AutocompleteMatch in provider_'s set of matches that matches
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |url|. If there is no matching URL, an empty match is returned.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteMatch FindMatchWithDestination(const GURL& url);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ACProviderListener method. If we're waiting for the provider to finish,
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this exits the message loop.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnProviderUpdate(bool updated_matches);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Runs a nested message loop until provider_ is done. The message loop is
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // exited by way of OnProviderUPdate.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RunTillProviderDone();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invokes Start on provider_, then runs all pending tasks.
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void QueryForInput(const string16& text,
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     bool prevent_inline_autocomplete,
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     bool minimal_changes);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Notifies the URLFetcher for the suggest query corresponding to the default
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // search provider that it's done.
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Be sure and wrap calls to this in ASSERT_NO_FATAL_FAILURE.
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void FinishDefaultSuggestQuery();
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See description above class for details of these fields.
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURL* default_t_url_;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const string16 term1_;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL term1_url_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURL* keyword_t_url_;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const string16 keyword_term_;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL keyword_url_;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoopForUI message_loop_;
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread io_thread_;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLFetcher::Factory implementation registered.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestURLFetcherFactory test_factory_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Profile we use.
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile profile_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The provider.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<SearchProvider> provider_;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If true, OnProviderUpdate exits out of the current message loop.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool quit_when_done_;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SearchProviderTest);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::SetUp() {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SearchProvider::set_query_suggest_immediately(true);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We need both the history service and template url model loaded.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_.CreateHistoryService(true, false);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_.CreateTemplateURLModel();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURLModel* turl_model = profile_.GetTemplateURLModel();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reset the default TemplateURL.
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_t_url_ = new TemplateURL();
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_t_url_->SetURL("http://defaultturl/{searchTerms}", 0, 0);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_t_url_->SetSuggestionsURL("http://defaultturl2/{searchTerms}", 0, 0);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  turl_model->Add(default_t_url_);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  turl_model->SetDefaultSearchProvider(default_t_url_);
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TemplateURLID default_provider_id = default_t_url_->id();
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NE(0, default_provider_id);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add url1, with search term term1_.
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryService* history =
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_.GetHistoryService(Profile::EXPLICIT_ACCESS);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  term1_url_ = GURL(default_t_url_->url()->ReplaceSearchTerms(
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *default_t_url_, term1_, 0, string16()));
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history->AddPageWithDetails(term1_url_, string16(), 1, 1,
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              base::Time::Now(), false,
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              history::SOURCE_BROWSED);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history->SetKeywordSearchTermsForURL(term1_url_, default_t_url_->id(),
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       term1_);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create another TemplateURL.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  keyword_t_url_ = new TemplateURL();
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  keyword_t_url_->set_keyword(ASCIIToUTF16("k"));
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  keyword_t_url_->SetURL("http://keyword/{searchTerms}", 0, 0);
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  keyword_t_url_->SetSuggestionsURL("http://suggest_keyword/{searchTerms}", 0,
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    0);
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile_.GetTemplateURLModel()->Add(keyword_t_url_);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NE(0, keyword_t_url_->id());
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a page and search term for keyword_t_url_.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  keyword_url_ = GURL(keyword_t_url_->url()->ReplaceSearchTerms(
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *keyword_t_url_, keyword_term_, 0, string16()));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history->AddPageWithDetails(keyword_url_, string16(), 1, 1,
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              base::Time::Now(), false,
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              history::SOURCE_BROWSED);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  history->SetKeywordSearchTermsForURL(keyword_url_, keyword_t_url_->id(),
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       keyword_term_);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Keywords are updated by the InMemoryHistoryBackend only after the message
148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // has been processed on the history thread. Block until history processes all
149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // requests to ensure the InMemoryDatabase is the state we expect it.
150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile_.BlockUntilHistoryProcessesPendingRequests();
151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  provider_ = new SearchProvider(this, &profile_);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLFetcher::set_factory(&test_factory_);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::OnProviderUpdate(bool updated_matches) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (quit_when_done_ && provider_->done()) {
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    quit_when_done_ = false;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    message_loop_.Quit();
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::RunTillProviderDone() {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (provider_->done())
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  quit_when_done_ = true;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  message_loop_.Run();
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  message_loop_.Run(NULL);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid SearchProviderTest::QueryForInput(const string16& text,
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                       bool prevent_inline_autocomplete,
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                       bool minimal_changes) {
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Start a query.
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteInput input(text, string16(), prevent_inline_autocomplete,
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                          false, true, AutocompleteInput::ALL_MATCHES);
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  provider_->Start(input, minimal_changes);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // RunAllPending so that the task scheduled by SearchProvider to create the
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLFetchers runs.
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  message_loop_.RunAllPending();
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SearchProviderTest::TearDown() {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  message_loop_.RunAllPending();
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLFetcher::set_factory(NULL);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shutdown the provider before the profile.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  provider_ = NULL;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAutocompleteMatch SearchProviderTest::FindMatchWithDestination(
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& url) {
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (ACMatches::const_iterator i = provider_->matches().begin();
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != provider_->matches().end(); ++i) {
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (i->destination_url == url)
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return *i;
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return AutocompleteMatch(NULL, 1, false, AutocompleteMatch::HISTORY_URL);
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenvoid SearchProviderTest::FinishDefaultSuggestQuery() {
2093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID(
2103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      SearchProvider::kDefaultProviderURLFetcherID);
2113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_TRUE(default_fetcher);
2123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Tell the SearchProvider the default suggest query is done.
2143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  default_fetcher->delegate()->OnURLFetchComplete(
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      default_fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(),
2163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      std::string());
2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
2183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests -----------------------------------------------------------------------
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure we query history for the default provider and a URLFetcher is
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// created for the default provider suggest results.
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SearchProviderTest, QueryDefaultProvider) {
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 term = term1_.substr(0, term1_.size() - 1);
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(term, false, false);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the default providers suggest service was queried.
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestURLFetcher* fetcher = test_factory_.GetFetcherByID(
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SearchProvider::kDefaultProviderURLFetcherID);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(fetcher);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And the URL matches what we expected.
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL expected_url = GURL(default_t_url_->suggestions_url()->
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ReplaceSearchTerms(*default_t_url_, term, 0, string16()));
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(fetcher->original_url() == expected_url);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the SearchProvider the suggest query is done.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  fetcher->delegate()->OnURLFetchComplete(
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(),
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::string());
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  fetcher = NULL;
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run till the history results complete.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RunTillProviderDone();
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The SearchProvider is done. Make sure it has a result for the history
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // term term1.
2483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  AutocompleteMatch term1_match = FindMatchWithDestination(term1_url_);
2493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(!term1_match.destination_url.is_empty());
2503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Term1 should have a description.
2513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_FALSE(term1_match.description.empty());
2523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms(
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *default_t_url_, term, 0, string16()));
2553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  AutocompleteMatch what_you_typed_match =
2563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      FindMatchWithDestination(what_you_typed_url);
2573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(!what_you_typed_match.destination_url.is_empty());
2583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(what_you_typed_match.description.empty());
2593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // The match for term1 should be more relevant than the what you typed result.
2613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_GT(term1_match.relevance, what_you_typed_match.relevance);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(SearchProviderTest, HonorPreventInlineAutocomplete) {
2654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  string16 term = term1_.substr(0, term1_.size() - 1);
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(term, true, false);
2674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_FALSE(provider_->matches().empty());
2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  ASSERT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED,
2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            provider_->matches()[0].type);
2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Issues a query that matches the registered keyword and makes sure history
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is queried as well as URLFetchers getting created.
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SearchProviderTest, QueryKeywordProvider) {
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 term = keyword_term_.substr(0, keyword_term_.size() - 1);
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(keyword_t_url_->keyword() + UTF8ToUTF16(" ") + term, false,
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                false);
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the default providers suggest service was queried.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestURLFetcher* default_fetcher = test_factory_.GetFetcherByID(
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SearchProvider::kDefaultProviderURLFetcherID);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(default_fetcher);
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the SearchProvider the default suggest query is done.
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_fetcher->delegate()->OnURLFetchComplete(
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      default_fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(),
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::string());
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  default_fetcher = NULL;
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the keyword providers suggest service was queried.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestURLFetcher* keyword_fetcher = test_factory_.GetFetcherByID(
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SearchProvider::kKeywordProviderURLFetcherID);
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(keyword_fetcher);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And the URL matches what we expected.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL expected_url = GURL(keyword_t_url_->suggestions_url()->
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ReplaceSearchTerms(*keyword_t_url_, term, 0, string16()));
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(keyword_fetcher->original_url() == expected_url);
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tell the SearchProvider the keyword suggest query is done.
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  keyword_fetcher->delegate()->OnURLFetchComplete(
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      keyword_fetcher, GURL(), net::URLRequestStatus(), 200, ResponseCookies(),
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::string());
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  keyword_fetcher = NULL;
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Run till the history results complete.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RunTillProviderDone();
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The SearchProvider is done. Make sure it has a result for the history
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // term keyword.
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteMatch match = FindMatchWithDestination(keyword_url_);
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(!match.destination_url.is_empty());
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The match should have a TemplateURL.
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(match.template_url);
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The fill into edit should contain the keyword.
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(keyword_t_url_->keyword() + char16(' ') + keyword_term_,
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            match.fill_into_edit);
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(SearchProviderTest, DontSendPrivateDataToSuggest) {
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // None of the following input strings should be sent to the suggest server,
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // because they may contain private data.
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char* inputs[] = {
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "username:password",
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "http://username:password",
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "https://username:password",
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "username:password@hostname",
3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "http://username:password@hostname/",
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "file://filename",
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "data://data",
3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "unknownscheme:anything",
3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "http://hostname/?query=q",
3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "http://hostname/path#ref",
3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    "https://hostname/path",
3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < arraysize(inputs); ++i) {
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    QueryForInput(ASCIIToUTF16(inputs[i]), false, false);
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Make sure the default providers suggest service was not queried.
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_TRUE(test_factory_.GetFetcherByID(
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        SearchProvider::kDefaultProviderURLFetcherID) == NULL);
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Run till the history results complete.
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    RunTillProviderDone();
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Make sure FinalizeInstantQuery works.
3513f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenTEST_F(SearchProviderTest, FinalizeInstantQuery) {
3523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  PrefService* service = profile_.GetPrefs();
3533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  service->SetBoolean(prefs::kInstantEnabled, true);
3543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(ASCIIToUTF16("foo"), false, false);
3563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Wait until history and the suggest query complete.
3583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  profile_.BlockUntilHistoryProcessesPendingRequests();
3593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
3603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // When instant is enabled the provider isn't done until it hears from
3623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // instant.
3633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_FALSE(provider_->done());
3643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Tell the provider instant is done.
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"));
3673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // The provider should now be done.
3693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(provider_->done());
3703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // There should be two matches, one for what you typed, the other for
3723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // 'foobar'.
3733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_EQ(2u, provider_->matches().size());
3743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms(
37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *default_t_url_, ASCIIToUTF16("foobar"), 0, string16()));
3763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  AutocompleteMatch instant_match = FindMatchWithDestination(instant_url);
3773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(!instant_match.destination_url.is_empty());
3783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // And the 'foobar' match should have a description.
3803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_FALSE(instant_match.description.empty());
3813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Make sure the what you typed match has no description.
3833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms(
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *default_t_url_, ASCIIToUTF16("foo"), 0, string16()));
3853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  AutocompleteMatch what_you_typed_match =
3863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      FindMatchWithDestination(what_you_typed_url);
3873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(!what_you_typed_match.destination_url.is_empty());
3883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_TRUE(what_you_typed_match.description.empty());
3893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
3903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // The instant search should be more relevant.
3913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_GT(instant_match.relevance, what_you_typed_match.relevance);
3923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}
39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
39472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Make sure that if FinalizeInstantQuery is invoked before suggest results
39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// return, the suggest text from FinalizeInstantQuery is remembered.
39672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(SearchProviderTest, RememberInstantQuery) {
39772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* service = profile_.GetPrefs();
39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  service->SetBoolean(prefs::kInstantEnabled, true);
39972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(ASCIIToUTF16("foo"), false, false);
40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Finalize the instant query immediately.
40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"));
40472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // There should be two matches, one for what you typed, the other for
40672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // 'foobar'.
40772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(2u, provider_->matches().size());
40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms(
40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *default_t_url_, ASCIIToUTF16("foobar"), 0, string16()));
41072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteMatch instant_match = FindMatchWithDestination(instant_url);
41172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(instant_match.destination_url.is_empty());
41272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
41372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Wait until history and the suggest query complete.
41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  profile_.BlockUntilHistoryProcessesPendingRequests();
41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Provider should be done.
41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(provider_->done());
41972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
42072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // There should be two matches, one for what you typed, the other for
42172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // 'foobar'.
42272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(2u, provider_->matches().size());
42372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  instant_match = FindMatchWithDestination(instant_url);
42472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(instant_match.destination_url.is_empty());
42572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
42672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // And the 'foobar' match should have a description.
42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(instant_match.description.empty());
42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Make sure that if trailing whitespace is added to the text supplied to
43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AutocompleteInput the default suggest text is cleared.
43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(SearchProviderTest, DifferingText) {
43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefService* service = profile_.GetPrefs();
43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  service->SetBoolean(prefs::kInstantEnabled, true);
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(ASCIIToUTF16("foo"), false, false);
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Wait until history and the suggest query complete.
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  profile_.BlockUntilHistoryProcessesPendingRequests();
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Finalize the instant query immediately.
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  provider_->FinalizeInstantQuery(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"));
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Query with input that ends up getting trimmed to be the same as was
44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // originally supplied.
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  QueryForInput(ASCIIToUTF16("foo "), false, true);
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // There should only one match, for what you typed.
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1u, provider_->matches().size());
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL instant_url = GURL(default_t_url_->url()->ReplaceSearchTerms(
45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *default_t_url_, ASCIIToUTF16("foo"), 0, string16()));
45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteMatch instant_match = FindMatchWithDestination(instant_url);
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(instant_match.destination_url.is_empty());
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SearchProviderTest, DontAutocompleteURLLikeTerms) {
458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  profile_.CreateAutocompleteClassifier();
459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 term(ASCIIToUTF16("docs.google.com"));
460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  HistoryService* history =
461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      profile_.GetHistoryService(Profile::EXPLICIT_ACCESS);
462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL url = GURL(default_t_url_->url()->ReplaceSearchTerms(
463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *default_t_url_, term, 0, string16()));
464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  history->AddPageWithDetails(
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      url, string16(), 1, 1, base::Time::Now(), false, history::SOURCE_BROWSED);
466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  history->SetKeywordSearchTermsForURL(url, default_t_url_->id(), term);
467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Add the term as a url.
469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  history->AddPageWithDetails(
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      GURL("http://docs.google.com"), string16(), 1, 1, base::Time::Now(),
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      false, history::SOURCE_BROWSED);
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  profile_.BlockUntilHistoryProcessesPendingRequests();
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  QueryForInput(ASCIIToUTF16("docs"), false, false);
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Wait until history and the suggest query complete.
478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  profile_.BlockUntilHistoryProcessesPendingRequests();
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_NO_FATAL_FAILURE(FinishDefaultSuggestQuery());
480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Provider should be done.
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(provider_->done());
483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // There should be two matches, one for what you typed, the other for
485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // 'docs.google.com'. The search term should have a lower priority than the
486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // what you typed match.
487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(2u, provider_->matches().size());
488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutocompleteMatch term_match = FindMatchWithDestination(url);
489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL what_you_typed_url = GURL(default_t_url_->url()->ReplaceSearchTerms(
490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *default_t_url_, ASCIIToUTF16("docs"), 0, string16()));
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutocompleteMatch what_you_typed_match =
492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      FindMatchWithDestination(what_you_typed_url);
493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_GT(what_you_typed_match.relevance, term_match.relevance);
494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
495