1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/autocomplete/zero_suggest_provider.h"
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/metrics/field_trial.h"
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/prefs/pref_service.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/run_loop.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/common/pref_names.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/metrics/proto/omnibox_event.pb.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/omnibox/autocomplete_provider_listener.h"
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/omnibox/omnibox_field_trial.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/variations/entropy_provider.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/variations/variations_associated_data.h"
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ZeroSuggestProviderTest : public testing::Test,
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                public AutocompleteProviderListener {
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ZeroSuggestProviderTest();
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetUp() OVERRIDE;
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TearDown() OVERRIDE;
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // AutocompleteProviderListener:
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void OnProviderUpdate(bool updated_matches) OVERRIDE;
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void ResetFieldTrialList();
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void CreatePersonalizedFieldTrial();
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Set up threads for testing; this needs to be instantiated before
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // |profile_|.
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Needed for OmniboxFieldTrial::ActivateStaticTrials().
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::FieldTrialList> field_trial_list_;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // URLFetcherFactory implementation registered.
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  net::TestURLFetcherFactory test_factory_;
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Profile we use.
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TestingProfile profile_;
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // ZeroSuggestProvider object under test.
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<ZeroSuggestProvider> provider_;
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Default template URL.
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TemplateURL* default_t_url_;
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ZeroSuggestProviderTest::ZeroSuggestProviderTest() {
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ResetFieldTrialList();
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ZeroSuggestProviderTest::SetUp() {
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Make sure that fetchers are automatically ungregistered upon destruction.
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  test_factory_.set_remove_fetcher_on_delete(true);
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse(
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &profile_, &TemplateURLServiceFactory::BuildInstanceFor);
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AutocompleteClassifierFactory::GetInstance()->SetTestingFactoryAndUse(
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      &profile_, &AutocompleteClassifierFactory::BuildInstanceFor);
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TemplateURLService* turl_model =
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      TemplateURLServiceFactory::GetForProfile(&profile_);
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  turl_model->Load();
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TemplateURLData data;
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.short_name = base::ASCIIToUTF16("t");
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.SetURL("https://www.google.com/?q={searchTerms}");
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.suggestions_url = "https://www.google.com/complete/?q={searchTerms}";
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.instant_url = "https://does/not/exist?strk=1";
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  data.search_terms_replacement_key = "strk";
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  default_t_url_ = new TemplateURL(data);
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  turl_model->Add(default_t_url_);
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  turl_model->SetUserSelectedDefaultSearchProvider(default_t_url_);
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  provider_ = ZeroSuggestProvider::Create(this, turl_model, &profile_);
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ZeroSuggestProviderTest::TearDown() {
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Shutdown the provider before the profile.
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  provider_ = NULL;
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ZeroSuggestProviderTest::OnProviderUpdate(bool updated_matches) {
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ZeroSuggestProviderTest::ResetFieldTrialList() {
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Destroy the existing FieldTrialList before creating a new one to avoid
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // a DCHECK.
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  field_trial_list_.reset();
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  field_trial_list_.reset(new base::FieldTrialList(
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      new metrics::SHA1EntropyProvider("foo")));
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  variations::testing::ClearAllVariationParams();
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ZeroSuggestProviderTest::CreatePersonalizedFieldTrial() {
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::map<std::string, std::string> params;
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  params[std::string(OmniboxFieldTrial::kZeroSuggestRule)] = "true";
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  params[std::string(OmniboxFieldTrial::kZeroSuggestVariantRule)] =
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Personalized";
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  variations::AssociateVariationParams(
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A", params);
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::FieldTrialList::CreateFieldTrial(
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OmniboxFieldTrial::kBundledExperimentFieldTrialName, "A");
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
120116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestCachingFirstRun) {
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreatePersonalizedFieldTrial();
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ensure the cache is empty.
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PrefService* prefs = profile_.GetPrefs();
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  prefs->SetString(prefs::kZeroSuggestCachedResults, std::string());
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string url("http://www.cnn.com");
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos,
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::string16(), GURL(url),
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          metrics::OmniboxEventProto::INVALID_SPEC, true, false,
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          true, true,
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ChromeAutocompleteSchemeClassifier(&profile_));
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  provider_->Start(input, false);
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(prefs->GetString(prefs::kZeroSuggestCachedResults).empty());
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(provider_->matches().empty());
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(1);
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(fetcher);
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->set_response_code(200);
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string json_response("[\"\",[\"search1\", \"search2\", \"search3\"],"
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "[],[],{\"google:suggestrelevance\":[602, 601, 600],"
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "\"google:verbatimrelevance\":1300}]");
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->SetResponseString(json_response);
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(4U, provider_->matches().size());  // 3 results + verbatim
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(json_response, prefs->GetString(prefs::kZeroSuggestCachedResults));
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResults) {
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreatePersonalizedFieldTrial();
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string url("http://www.cnn.com");
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos,
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::string16(), GURL(url),
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          metrics::OmniboxEventProto::INVALID_SPEC, true, false,
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          true, true,
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ChromeAutocompleteSchemeClassifier(&profile_));
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Set up the pref to cache the response from the previous run.
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string json_response("[\"\",[\"search1\", \"search2\", \"search3\"],"
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "[],[],{\"google:suggestrelevance\":[602, 601, 600],"
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "\"google:verbatimrelevance\":1300}]");
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PrefService* prefs = profile_.GetPrefs();
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  prefs->SetString(prefs::kZeroSuggestCachedResults, json_response);
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  provider_->Start(input, false);
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect that matches get populated synchronously out of the cache.
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(4U, provider_->matches().size());
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[1].contents);
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[2].contents);
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[3].contents);
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(1);
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(fetcher);
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->set_response_code(200);
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string json_response2("[\"\",[\"search4\", \"search5\", \"search6\"],"
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "[],[],{\"google:suggestrelevance\":[602, 601, 600],"
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "\"google:verbatimrelevance\":1300}]");
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->SetResponseString(json_response2);
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect the same 4 results after the response has been handled.
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(4U, provider_->matches().size());
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[1].contents);
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[2].contents);
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[3].contents);
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect the new results have been stored.
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(json_response2,
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            prefs->GetString(prefs::kZeroSuggestCachedResults));
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestReceivedEmptyResults) {
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CreatePersonalizedFieldTrial();
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string url("http://www.cnn.com");
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AutocompleteInput input(base::ASCIIToUTF16(url), base::string16::npos,
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::string16(), GURL(url),
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          metrics::OmniboxEventProto::INVALID_SPEC, true, false,
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          true, true,
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          ChromeAutocompleteSchemeClassifier(&profile_));
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Set up the pref to cache the response from the previous run.
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string json_response("[\"\",[\"search1\", \"search2\", \"search3\"],"
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "[],[],{\"google:suggestrelevance\":[602, 601, 600],"
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "\"google:verbatimrelevance\":1300}]");
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PrefService* prefs = profile_.GetPrefs();
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  prefs->SetString(prefs::kZeroSuggestCachedResults, json_response);
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  provider_->Start(input, false);
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect that matches get populated synchronously out of the cache.
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_EQ(4U, provider_->matches().size());
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[1].contents);
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[2].contents);
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[3].contents);
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  net::TestURLFetcher* fetcher = test_factory_.GetFetcherByID(1);
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(fetcher);
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->set_response_code(200);
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string empty_response("[\"\",[],[],[],{}]");
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->SetResponseString(empty_response);
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect that the matches have been cleared.
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(provider_->matches().empty());
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Expect the new results have been stored.
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(empty_response,
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            prefs->GetString(prefs::kZeroSuggestCachedResults));
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
242