blob: 11b4eab2f37313a7a8b3738cb8204e4edb14496f [file] [log] [blame]
[email protected]e33e7112014-04-29 15:09:001// Copyright 2014 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
avif57136c12015-12-25 23:27:455#include <stddef.h>
6
[email protected]e33e7112014-04-29 15:09:007#include "base/files/scoped_temp_dir.h"
avif57136c12015-12-25 23:27:458#include "base/macros.h"
[email protected]95d064c2014-05-06 07:12:499#include "base/memory/scoped_ptr.h"
[email protected]e33e7112014-04-29 15:09:0010#include "base/strings/string_split.h"
11#include "base/strings/string_util.h"
12#include "base/strings/utf_string_conversions.h"
13#include "base/time/time.h"
[email protected]f0c8c4992014-05-15 17:37:2614#include "components/pref_registry/pref_registry_syncable.h"
[email protected]b35490f2014-06-19 07:00:0115#include "components/pref_registry/testing_pref_service_syncable.h"
[email protected]0915b352014-06-25 19:58:1416#include "components/search_engines/default_search_manager.h"
[email protected]0bdc44d2014-06-25 16:23:0317#include "components/search_engines/search_engines_pref_names.h"
[email protected]fa817b12014-06-11 06:25:2518#include "components/search_engines/template_url_data.h"
[email protected]0915b352014-06-25 19:58:1419#include "components/search_engines/template_url_prepopulate_data.h"
[email protected]e33e7112014-04-29 15:09:0020#include "testing/gtest/include/gtest/gtest.h"
21
22namespace {
[email protected]95d064c2014-05-06 07:12:4923// A dictionary to hold all data related to the Default Search Engine.
24// Eventually, this should replace all the data stored in the
25// default_search_provider.* prefs.
26const char kDefaultSearchProviderData[] =
27 "default_search_provider_data.template_url_data";
[email protected]e33e7112014-04-29 15:09:0028
[email protected]95d064c2014-05-06 07:12:4929// Checks that the two TemplateURLs are similar. Does not check the id, the
[email protected]e33e7112014-04-29 15:09:0030// date_created or the last_modified time. Neither pointer should be NULL.
31void ExpectSimilar(const TemplateURLData* expected,
32 const TemplateURLData* actual) {
33 ASSERT_TRUE(expected != NULL);
34 ASSERT_TRUE(actual != NULL);
35
mpearson3c6d7af2015-05-13 23:59:5336 EXPECT_EQ(expected->short_name(), actual->short_name());
[email protected]e33e7112014-04-29 15:09:0037 EXPECT_EQ(expected->keyword(), actual->keyword());
38 EXPECT_EQ(expected->url(), actual->url());
39 EXPECT_EQ(expected->suggestions_url, actual->suggestions_url);
40 EXPECT_EQ(expected->favicon_url, actual->favicon_url);
41 EXPECT_EQ(expected->alternate_urls, actual->alternate_urls);
42 EXPECT_EQ(expected->show_in_default_list, actual->show_in_default_list);
43 EXPECT_EQ(expected->safe_for_autoreplace, actual->safe_for_autoreplace);
44 EXPECT_EQ(expected->input_encodings, actual->input_encodings);
45 EXPECT_EQ(expected->search_terms_replacement_key,
46 actual->search_terms_replacement_key);
47}
48
[email protected]95d064c2014-05-06 07:12:4949// TODO(caitkp): TemplateURLData-ify this.
[email protected]b35490f2014-06-19 07:00:0150void SetOverrides(user_prefs::TestingPrefServiceSyncable* prefs, bool update) {
[email protected]95d064c2014-05-06 07:12:4951 prefs->SetUserPref(prefs::kSearchProviderOverridesVersion,
[email protected]b6ccb5a2014-07-16 22:43:4952 new base::FundamentalValue(1));
[email protected]95d064c2014-05-06 07:12:4953 base::ListValue* overrides = new base::ListValue;
54 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
55
56 entry->SetString("name", update ? "new_foo" : "foo");
57 entry->SetString("keyword", update ? "new_fook" : "fook");
58 entry->SetString("search_url", "http://foo.com/s?q={searchTerms}");
59 entry->SetString("favicon_url", "http://foi.com/favicon.ico");
60 entry->SetString("encoding", "UTF-8");
61 entry->SetInteger("id", 1001);
62 entry->SetString("suggest_url", "http://foo.com/suggest?q={searchTerms}");
63 entry->SetString("instant_url", "http://foo.com/instant?q={searchTerms}");
64 base::ListValue* alternate_urls = new base::ListValue;
65 alternate_urls->AppendString("http://foo.com/alternate?q={searchTerms}");
66 entry->Set("alternate_urls", alternate_urls);
67 entry->SetString("search_terms_replacement_key", "espv");
68 overrides->Append(entry->DeepCopy());
69
70 entry.reset(new base::DictionaryValue);
71 entry->SetInteger("id", 1002);
72 entry->SetString("name", update ? "new_bar" : "bar");
73 entry->SetString("keyword", update ? "new_bark" : "bark");
74 entry->SetString("encoding", std::string());
75 overrides->Append(entry->DeepCopy());
76 entry->SetInteger("id", 1003);
77 entry->SetString("name", "baz");
78 entry->SetString("keyword", "bazk");
79 entry->SetString("encoding", "UTF-8");
80 overrides->Append(entry->DeepCopy());
81 prefs->SetUserPref(prefs::kSearchProviderOverrides, overrides);
82}
83
[email protected]b35490f2014-06-19 07:00:0184void SetPolicy(user_prefs::TestingPrefServiceSyncable* prefs,
[email protected]95d064c2014-05-06 07:12:4985 bool enabled,
86 TemplateURLData* data) {
87 if (enabled) {
88 EXPECT_FALSE(data->keyword().empty());
89 EXPECT_FALSE(data->url().empty());
90 }
91 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
mpearson3c6d7af2015-05-13 23:59:5392 entry->SetString(DefaultSearchManager::kShortName, data->short_name());
[email protected]95d064c2014-05-06 07:12:4993 entry->SetString(DefaultSearchManager::kKeyword, data->keyword());
94 entry->SetString(DefaultSearchManager::kURL, data->url());
95 entry->SetString(DefaultSearchManager::kFaviconURL, data->favicon_url.spec());
96 entry->SetString(DefaultSearchManager::kSuggestionsURL,
97 data->suggestions_url);
98 entry->SetBoolean(DefaultSearchManager::kSafeForAutoReplace,
99 data->safe_for_autoreplace);
100 scoped_ptr<base::ListValue> alternate_urls(new base::ListValue);
101 for (std::vector<std::string>::const_iterator it =
102 data->alternate_urls.begin();
103 it != data->alternate_urls.end();
104 ++it) {
105 alternate_urls->AppendString(*it);
106 }
107 entry->Set(DefaultSearchManager::kAlternateURLs, alternate_urls.release());
108
109 scoped_ptr<base::ListValue> encodings(new base::ListValue);
110 for (std::vector<std::string>::const_iterator it =
111 data->input_encodings.begin();
112 it != data->input_encodings.end();
113 ++it) {
114 encodings->AppendString(*it);
115 }
116 entry->Set(DefaultSearchManager::kInputEncodings, encodings.release());
117
118 entry->SetString(DefaultSearchManager::kSearchTermsReplacementKey,
119 data->search_terms_replacement_key);
120 entry->SetBoolean(DefaultSearchManager::kDisabledByPolicy, !enabled);
121 prefs->SetManagedPref(kDefaultSearchProviderData, entry.release());
122}
123
ki.stfu939799a42015-09-28 04:41:20124scoped_ptr<TemplateURLData> GenerateDummyTemplateURLData(
125 const std::string& type) {
[email protected]95d064c2014-05-06 07:12:49126 scoped_ptr<TemplateURLData> data(new TemplateURLData());
mpearson3c6d7af2015-05-13 23:59:53127 data->SetShortName(base::UTF8ToUTF16(std::string(type).append("name")));
[email protected]95d064c2014-05-06 07:12:49128 data->SetKeyword(base::UTF8ToUTF16(std::string(type).append("key")));
129 data->SetURL(std::string("http://").append(type).append("foo/{searchTerms}"));
130 data->suggestions_url = std::string("http://").append(type).append("sugg");
131 data->alternate_urls.push_back(
132 std::string("http://").append(type).append("foo/alt"));
133 data->favicon_url = GURL("http://icon1");
134 data->safe_for_autoreplace = true;
135 data->show_in_default_list = true;
brettw8be197d12015-07-23 23:23:31136 data->input_encodings = base::SplitString(
137 "UTF-8;UTF-16", ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]95d064c2014-05-06 07:12:49138 data->date_created = base::Time();
139 data->last_modified = base::Time();
dcheng51ace48a2015-12-26 22:45:17140 return data;
[email protected]95d064c2014-05-06 07:12:49141}
142
[email protected]e33e7112014-04-29 15:09:00143} // namespace
144
145class DefaultSearchManagerTest : public testing::Test {
146 public:
147 DefaultSearchManagerTest() {};
148
dcheng30a1b1542014-10-29 21:27:50149 void SetUp() override {
[email protected]b35490f2014-06-19 07:00:01150 pref_service_.reset(new user_prefs::TestingPrefServiceSyncable);
[email protected]e33e7112014-04-29 15:09:00151 DefaultSearchManager::RegisterProfilePrefs(pref_service_->registry());
[email protected]95d064c2014-05-06 07:12:49152 TemplateURLPrepopulateData::RegisterProfilePrefs(pref_service_->registry());
[email protected]e33e7112014-04-29 15:09:00153 }
154
[email protected]b35490f2014-06-19 07:00:01155 user_prefs::TestingPrefServiceSyncable* pref_service() {
156 return pref_service_.get();
157 }
[email protected]e33e7112014-04-29 15:09:00158
159 private:
[email protected]b35490f2014-06-19 07:00:01160 scoped_ptr<user_prefs::TestingPrefServiceSyncable> pref_service_;
[email protected]e33e7112014-04-29 15:09:00161
162 DISALLOW_COPY_AND_ASSIGN(DefaultSearchManagerTest);
163};
164
165// Test that a TemplateURLData object is properly written and read from Prefs.
166TEST_F(DefaultSearchManagerTest, ReadAndWritePref) {
[email protected]95d064c2014-05-06 07:12:49167 DefaultSearchManager manager(pref_service(),
168 DefaultSearchManager::ObserverCallback());
[email protected]e33e7112014-04-29 15:09:00169 TemplateURLData data;
mpearson3c6d7af2015-05-13 23:59:53170 data.SetShortName(base::UTF8ToUTF16("name1"));
[email protected]e33e7112014-04-29 15:09:00171 data.SetKeyword(base::UTF8ToUTF16("key1"));
172 data.SetURL("http://foo1/{searchTerms}");
173 data.suggestions_url = "http://sugg1";
174 data.alternate_urls.push_back("http://foo1/alt");
175 data.favicon_url = GURL("http://icon1");
176 data.safe_for_autoreplace = true;
177 data.show_in_default_list = true;
brettw8be197d12015-07-23 23:23:31178 data.input_encodings = base::SplitString(
179 "UTF-8;UTF-16", ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]e33e7112014-04-29 15:09:00180 data.date_created = base::Time();
181 data.last_modified = base::Time();
182
183 manager.SetUserSelectedDefaultSearchEngine(data);
[email protected]95d064c2014-05-06 07:12:49184 TemplateURLData* read_data = manager.GetDefaultSearchEngine(NULL);
185 ExpectSimilar(&data, read_data);
[email protected]e33e7112014-04-29 15:09:00186}
187
[email protected]95d064c2014-05-06 07:12:49188// Test DefaultSearchmanager handles user-selected DSEs correctly.
189TEST_F(DefaultSearchManagerTest, DefaultSearchSetByUserPref) {
190 size_t default_search_index = 0;
191 DefaultSearchManager manager(pref_service(),
192 DefaultSearchManager::ObserverCallback());
193 ScopedVector<TemplateURLData> prepopulated_urls =
194 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service(),
195 &default_search_index);
196 DefaultSearchManager::Source source = DefaultSearchManager::FROM_POLICY;
197 // If no user pref is set, we should use the pre-populated values.
198 ExpectSimilar(prepopulated_urls[default_search_index],
199 manager.GetDefaultSearchEngine(&source));
200 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
201
202 // Setting a user pref overrides the pre-populated values.
203 scoped_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user");
204 manager.SetUserSelectedDefaultSearchEngine(*data.get());
205
206 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
207 EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
208
209 // Updating the user pref (externally to this instance of
210 // DefaultSearchManager) triggers an update.
211 scoped_ptr<TemplateURLData> new_data = GenerateDummyTemplateURLData("user2");
212 DefaultSearchManager other_manager(pref_service(),
213 DefaultSearchManager::ObserverCallback());
214 other_manager.SetUserSelectedDefaultSearchEngine(*new_data.get());
215
216 ExpectSimilar(new_data.get(), manager.GetDefaultSearchEngine(&source));
217 EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
218
219 // Clearing the user pref should cause the default search to revert to the
220 // prepopulated vlaues.
221 manager.ClearUserSelectedDefaultSearchEngine();
222 ExpectSimilar(prepopulated_urls[default_search_index],
223 manager.GetDefaultSearchEngine(&source));
224 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
225}
226
227// Test that DefaultSearch manager detects changes to kSearchProviderOverrides.
228TEST_F(DefaultSearchManagerTest, DefaultSearchSetByOverrides) {
229 SetOverrides(pref_service(), false);
230 size_t default_search_index = 0;
231 DefaultSearchManager manager(pref_service(),
232 DefaultSearchManager::ObserverCallback());
233 ScopedVector<TemplateURLData> prepopulated_urls =
234 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service(),
235 &default_search_index);
236
237 DefaultSearchManager::Source source = DefaultSearchManager::FROM_POLICY;
238 TemplateURLData first_default(*manager.GetDefaultSearchEngine(&source));
239 ExpectSimilar(prepopulated_urls[default_search_index], &first_default);
240 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
241
242 // Update the overrides:
243 SetOverrides(pref_service(), true);
244 prepopulated_urls = TemplateURLPrepopulateData::GetPrepopulatedEngines(
245 pref_service(), &default_search_index);
246
247 // Make sure DefaultSearchManager updated:
248 ExpectSimilar(prepopulated_urls[default_search_index],
249 manager.GetDefaultSearchEngine(&source));
250 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
mpearson3c6d7af2015-05-13 23:59:53251 EXPECT_NE(manager.GetDefaultSearchEngine(NULL)->short_name(),
252 first_default.short_name());
[email protected]95d064c2014-05-06 07:12:49253 EXPECT_NE(manager.GetDefaultSearchEngine(NULL)->keyword(),
254 first_default.keyword());
255}
256
257// Test DefaultSearchManager handles policy-enforced DSEs correctly.
258TEST_F(DefaultSearchManagerTest, DefaultSearchSetByPolicy) {
259 DefaultSearchManager manager(pref_service(),
260 DefaultSearchManager::ObserverCallback());
261 scoped_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user");
262 manager.SetUserSelectedDefaultSearchEngine(*data.get());
263
264 DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK;
265 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
266 EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
267
268 scoped_ptr<TemplateURLData> policy_data =
269 GenerateDummyTemplateURLData("policy");
270 SetPolicy(pref_service(), true, policy_data.get());
271
272 ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source));
273 EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source);
274
275 TemplateURLData null_policy_data;
276 SetPolicy(pref_service(), false, &null_policy_data);
277 EXPECT_EQ(NULL, manager.GetDefaultSearchEngine(&source));
278 EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source);
279
280 pref_service()->RemoveManagedPref(kDefaultSearchProviderData);
281 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
282 EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
283}
284
285// Test DefaultSearchManager handles extension-controlled DSEs correctly.
286TEST_F(DefaultSearchManagerTest, DefaultSearchSetByExtension) {
287 DefaultSearchManager manager(pref_service(),
288 DefaultSearchManager::ObserverCallback());
289 scoped_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user");
290 manager.SetUserSelectedDefaultSearchEngine(*data);
291
292 DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK;
293 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
294 EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
295
296 // Extension trumps prefs:
297 scoped_ptr<TemplateURLData> extension_data_1 =
298 GenerateDummyTemplateURLData("ext1");
299 manager.SetExtensionControlledDefaultSearchEngine(*extension_data_1);
300
301 ExpectSimilar(extension_data_1.get(),
302 manager.GetDefaultSearchEngine(&source));
303 EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source);
304
305 // Policy trumps extension:
306 scoped_ptr<TemplateURLData> policy_data =
307 GenerateDummyTemplateURLData("policy");
308 SetPolicy(pref_service(), true, policy_data.get());
309
310 ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source));
311 EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source);
312 pref_service()->RemoveManagedPref(kDefaultSearchProviderData);
313
314 // Extensions trump each other:
315 scoped_ptr<TemplateURLData> extension_data_2 =
316 GenerateDummyTemplateURLData("ext2");
317 scoped_ptr<TemplateURLData> extension_data_3 =
318 GenerateDummyTemplateURLData("ext3");
319 manager.SetExtensionControlledDefaultSearchEngine(*extension_data_2);
320 manager.SetExtensionControlledDefaultSearchEngine(*extension_data_3);
321
322 ExpectSimilar(extension_data_3.get(),
323 manager.GetDefaultSearchEngine(&source));
324 EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source);
325
326 manager.ClearExtensionControlledDefaultSearchEngine();
327
328 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
329 EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
[email protected]e33e7112014-04-29 15:09:00330}