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/search_engines/default_search_manager.h" 12 #include "chrome/browser/search_engines/template_url_service.h" 13 #include "chrome/browser/search_engines/template_url_service_factory.h" 14 #include "chrome/browser/search_engines/ui_thread_search_terms_data.h" 15 #include "chrome/browser/webdata/web_data_service_factory.h" 16 #include "chrome/test/base/testing_pref_service_syncable.h" 17 #include "chrome/test/base/testing_profile.h" 18 #include "components/google/core/browser/google_url_tracker.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. 27 class 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 59 TemplateURLServiceTestUtilBase::TemplateURLServiceTestUtilBase() 60 : changed_count_(0) { 61 } 62 63 TemplateURLServiceTestUtilBase::~TemplateURLServiceTestUtilBase() { 64 } 65 66 void 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 75 void TemplateURLServiceTestUtilBase::OnTemplateURLServiceChanged() { 76 changed_count_++; 77 } 78 79 int TemplateURLServiceTestUtilBase::GetObserverCount() { 80 return changed_count_; 81 } 82 83 void TemplateURLServiceTestUtilBase::ResetObserverCount() { 84 changed_count_ = 0; 85 } 86 87 void TemplateURLServiceTestUtilBase::VerifyLoad() { 88 ASSERT_FALSE(model()->loaded()); 89 model()->Load(); 90 base::RunLoop().RunUntilIdle(); 91 EXPECT_EQ(1, GetObserverCount()); 92 ResetObserverCount(); 93 } 94 95 void 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 104 void TemplateURLServiceTestUtilBase::ClearModel() { 105 TemplateURLServiceFactory::GetInstance()->SetTestingFactory( 106 profile(), NULL); 107 } 108 109 void 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 118 base::string16 TemplateURLServiceTestUtilBase::GetAndClearSearchTerm() { 119 return 120 static_cast<TestingTemplateURLService*>(model())->GetAndClearSearchTerm(); 121 } 122 123 void 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 133 void 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 189 void TemplateURLServiceTestUtilBase::RemoveManagedDefaultSearchPreferences() { 190 TestingPrefServiceSyncable* pref_service = profile()->GetTestingPrefService(); 191 pref_service->RemoveManagedPref( 192 DefaultSearchManager::kDefaultSearchProviderDataPrefName); 193 } 194 195 TemplateURLService* TemplateURLServiceTestUtilBase::model() const { 196 return TemplateURLServiceFactory::GetForProfile(profile()); 197 } 198 199 200 // TemplateURLServiceTestUtil ------------------------------------------------- 201 202 TemplateURLServiceTestUtil::TemplateURLServiceTestUtil() 203 : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { 204 } 205 206 TemplateURLServiceTestUtil::~TemplateURLServiceTestUtil() { 207 } 208 209 void 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 221 void 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 230 TestingProfile* TemplateURLServiceTestUtil::profile() const { 231 return profile_.get(); 232 } 233