template_url_service_test_util.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/search_engines/template_url_service_test_util.h" 6 7#include "base/bind.h" 8#include "base/run_loop.h" 9#include "base/strings/string_split.h" 10#include "base/threading/thread.h" 11#include "chrome/browser/google/google_url_tracker.h" 12#include "chrome/browser/search_engines/default_search_manager.h" 13#include "chrome/browser/search_engines/search_terms_data.h" 14#include "chrome/browser/search_engines/template_url_service.h" 15#include "chrome/browser/search_engines/template_url_service_factory.h" 16#include "chrome/browser/webdata/web_data_service_factory.h" 17#include "chrome/test/base/testing_pref_service_syncable.h" 18#include "chrome/test/base/testing_profile.h" 19#include "testing/gtest/include/gtest/gtest.h" 20 21#if defined(OS_CHROMEOS) 22#include "chrome/browser/google/google_brand_chromeos.h" 23#endif 24 25// Trivial subclass of TemplateURLService that records the last invocation of 26// SetKeywordSearchTermsForURL. 27class TestingTemplateURLService : public TemplateURLService { 28 public: 29 static KeyedService* Build(content::BrowserContext* profile) { 30 return new TestingTemplateURLService(static_cast<Profile*>(profile)); 31 } 32 33 explicit TestingTemplateURLService(Profile* profile) 34 : TemplateURLService(profile) { 35 } 36 37 base::string16 GetAndClearSearchTerm() { 38 base::string16 search_term; 39 search_term.swap(search_term_); 40 return search_term; 41 } 42 43 protected: 44 virtual void SetKeywordSearchTermsForURL( 45 const TemplateURL* t_url, 46 const GURL& url, 47 const base::string16& term) OVERRIDE { 48 search_term_ = term; 49 } 50 51 private: 52 base::string16 search_term_; 53 54 DISALLOW_COPY_AND_ASSIGN(TestingTemplateURLService); 55}; 56 57// TemplateURLServiceTestUtilBase --------------------------------------------- 58 59TemplateURLServiceTestUtilBase::TemplateURLServiceTestUtilBase() 60 : changed_count_(0) { 61} 62 63TemplateURLServiceTestUtilBase::~TemplateURLServiceTestUtilBase() { 64} 65 66void TemplateURLServiceTestUtilBase::CreateTemplateUrlService() { 67 profile()->CreateWebDataService(); 68 69 TemplateURLService* service = static_cast<TemplateURLService*>( 70 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 71 profile(), TestingTemplateURLService::Build)); 72 service->AddObserver(this); 73} 74 75void TemplateURLServiceTestUtilBase::OnTemplateURLServiceChanged() { 76 changed_count_++; 77} 78 79int TemplateURLServiceTestUtilBase::GetObserverCount() { 80 return changed_count_; 81} 82 83void TemplateURLServiceTestUtilBase::ResetObserverCount() { 84 changed_count_ = 0; 85} 86 87void TemplateURLServiceTestUtilBase::VerifyLoad() { 88 ASSERT_FALSE(model()->loaded()); 89 model()->Load(); 90 base::RunLoop().RunUntilIdle(); 91 EXPECT_EQ(1, GetObserverCount()); 92 ResetObserverCount(); 93} 94 95void TemplateURLServiceTestUtilBase::ChangeModelToLoadState() { 96 model()->ChangeToLoadedState(); 97 // Initialize the web data service so that the database gets updated with 98 // any changes made. 99 100 model()->service_ = WebDataService::FromBrowserContext(profile()); 101 base::RunLoop().RunUntilIdle(); 102} 103 104void TemplateURLServiceTestUtilBase::ClearModel() { 105 TemplateURLServiceFactory::GetInstance()->SetTestingFactory( 106 profile(), NULL); 107} 108 109void TemplateURLServiceTestUtilBase::ResetModel(bool verify_load) { 110 TemplateURLServiceFactory::GetInstance()->SetTestingFactoryAndUse( 111 profile(), TestingTemplateURLService::Build); 112 model()->AddObserver(this); 113 changed_count_ = 0; 114 if (verify_load) 115 VerifyLoad(); 116} 117 118base::string16 TemplateURLServiceTestUtilBase::GetAndClearSearchTerm() { 119 return 120 static_cast<TestingTemplateURLService*>(model())->GetAndClearSearchTerm(); 121} 122 123void TemplateURLServiceTestUtilBase::SetGoogleBaseURL( 124 const GURL& base_url) const { 125 DCHECK(base_url.is_valid()); 126 UIThreadSearchTermsData data(profile()); 127 GURL old_url = GURL(data.GoogleBaseURLValue()); 128 UIThreadSearchTermsData::SetGoogleBaseURL(base_url.spec()); 129 TemplateURLServiceFactory::GetForProfile(profile()) 130 ->OnGoogleURLUpdated(old_url, base_url); 131} 132 133void TemplateURLServiceTestUtilBase::SetManagedDefaultSearchPreferences( 134 bool enabled, 135 const std::string& name, 136 const std::string& keyword, 137 const std::string& search_url, 138 const std::string& suggest_url, 139 const std::string& icon_url, 140 const std::string& encodings, 141 const std::string& alternate_url, 142 const std::string& search_terms_replacement_key) { 143 TestingPrefServiceSyncable* pref_service = profile()->GetTestingPrefService(); 144 scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue); 145 if (!enabled) { 146 value->SetBoolean(DefaultSearchManager::kDisabledByPolicy, true); 147 pref_service->SetManagedPref( 148 DefaultSearchManager::kDefaultSearchProviderDataPrefName, 149 value.release()); 150 return; 151 } 152 153 EXPECT_FALSE(keyword.empty()); 154 EXPECT_FALSE(search_url.empty()); 155 value->Set(DefaultSearchManager::kShortName, 156 base::Value::CreateStringValue(name)); 157 value->Set(DefaultSearchManager::kKeyword, 158 base::Value::CreateStringValue(keyword)); 159 value->Set(DefaultSearchManager::kURL, 160 base::Value::CreateStringValue(search_url)); 161 value->Set(DefaultSearchManager::kSuggestionsURL, 162 base::Value::CreateStringValue(suggest_url)); 163 value->Set(DefaultSearchManager::kFaviconURL, 164 base::Value::CreateStringValue(icon_url)); 165 value->Set(DefaultSearchManager::kSearchTermsReplacementKey, 166 base::Value::CreateStringValue(search_terms_replacement_key)); 167 168 std::vector<std::string> encodings_items; 169 base::SplitString(encodings, ';', &encodings_items); 170 scoped_ptr<base::ListValue> encodings_list(new base::ListValue); 171 for (std::vector<std::string>::const_iterator it = encodings_items.begin(); 172 it != encodings_items.end(); 173 ++it) { 174 encodings_list->AppendString(*it); 175 } 176 value->Set(DefaultSearchManager::kInputEncodings, encodings_list.release()); 177 178 scoped_ptr<base::ListValue> alternate_url_list(new base::ListValue()); 179 if (!alternate_url.empty()) 180 alternate_url_list->Append(base::Value::CreateStringValue(alternate_url)); 181 value->Set(DefaultSearchManager::kAlternateURLs, 182 alternate_url_list.release()); 183 184 pref_service->SetManagedPref( 185 DefaultSearchManager::kDefaultSearchProviderDataPrefName, 186 value.release()); 187} 188 189void TemplateURLServiceTestUtilBase::RemoveManagedDefaultSearchPreferences() { 190 TestingPrefServiceSyncable* pref_service = profile()->GetTestingPrefService(); 191 pref_service->RemoveManagedPref( 192 DefaultSearchManager::kDefaultSearchProviderDataPrefName); 193} 194 195TemplateURLService* TemplateURLServiceTestUtilBase::model() const { 196 return TemplateURLServiceFactory::GetForProfile(profile()); 197} 198 199 200// TemplateURLServiceTestUtil ------------------------------------------------- 201 202TemplateURLServiceTestUtil::TemplateURLServiceTestUtil() 203 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { 204} 205 206TemplateURLServiceTestUtil::~TemplateURLServiceTestUtil() { 207} 208 209void TemplateURLServiceTestUtil::SetUp() { 210 // Make unique temp directory. 211 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 212 profile_.reset(new TestingProfile(temp_dir_.path())); 213 214 TemplateURLServiceTestUtilBase::CreateTemplateUrlService(); 215 216#if defined(OS_CHROMEOS) 217 google_brand::chromeos::ClearBrandForCurrentSession(); 218#endif 219} 220 221void TemplateURLServiceTestUtil::TearDown() { 222 profile_.reset(); 223 224 UIThreadSearchTermsData::SetGoogleBaseURL(std::string()); 225 226 // Flush the message loop to make application verifiers happy. 227 base::RunLoop().RunUntilIdle(); 228} 229 230TestingProfile* TemplateURLServiceTestUtil::profile() const { 231 return profile_.get(); 232} 233