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