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