default_search_manager_unittest.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. // 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. #include "components/search_engines/default_search_manager.h"
  5. #include <stddef.h>
  6. #include <memory>
  7. #include <utility>
  8. #include "base/files/scoped_temp_dir.h"
  9. #include "base/strings/string_split.h"
  10. #include "base/strings/string_util.h"
  11. #include "base/strings/utf_string_conversions.h"
  12. #include "base/time/time.h"
  13. #include "components/pref_registry/pref_registry_syncable.h"
  14. #include "components/search_engines/default_search_manager.h"
  15. #include "components/search_engines/search_engines_pref_names.h"
  16. #include "components/search_engines/search_engines_test_util.h"
  17. #include "components/search_engines/template_url_data.h"
  18. #include "components/search_engines/template_url_data_util.h"
  19. #include "components/search_engines/template_url_prepopulate_data.h"
  20. #include "components/sync_preferences/testing_pref_service_syncable.h"
  21. #include "components/variations/scoped_variations_ids_provider.h"
  22. #include "testing/gtest/include/gtest/gtest.h"
  23. namespace {
  24. // TODO(caitkp): TemplateURLData-ify this.
  25. void SetOverrides(sync_preferences::TestingPrefServiceSyncable* prefs,
  26. bool update) {
  27. prefs->SetUserPref(prefs::kSearchProviderOverridesVersion, base::Value(1));
  28. base::Value::List overrides;
  29. base::Value::Dict entry;
  30. entry.Set("name", update ? "new_foo" : "foo");
  31. entry.Set("keyword", update ? "new_fook" : "fook");
  32. entry.Set("search_url", "http://foo.com/s?q={searchTerms}");
  33. entry.Set("favicon_url", "http://foi.com/favicon.ico");
  34. entry.Set("encoding", "UTF-8");
  35. entry.Set("id", 1001);
  36. entry.Set("suggest_url", "http://foo.com/suggest?q={searchTerms}");
  37. base::Value::List alternate_urls;
  38. alternate_urls.Append("http://foo.com/alternate?q={searchTerms}");
  39. entry.Set("alternate_urls", std::move(alternate_urls));
  40. overrides.Append(std::move(entry));
  41. entry = base::Value::Dict();
  42. entry.Set("id", 1002);
  43. entry.Set("name", update ? "new_bar" : "bar");
  44. entry.Set("keyword", update ? "new_bark" : "bark");
  45. entry.Set("encoding", std::string());
  46. overrides.Append(entry.Clone());
  47. entry.Set("id", 1003);
  48. entry.Set("name", "baz");
  49. entry.Set("keyword", "bazk");
  50. entry.Set("encoding", "UTF-8");
  51. overrides.Append(std::move(entry));
  52. prefs->SetUserPref(prefs::kSearchProviderOverrides,
  53. base::Value(std::move(overrides)));
  54. }
  55. void SetPolicy(sync_preferences::TestingPrefServiceSyncable* prefs,
  56. bool enabled,
  57. TemplateURLData* data,
  58. bool is_mandatory) {
  59. if (enabled) {
  60. EXPECT_FALSE(data->keyword().empty());
  61. EXPECT_FALSE(data->url().empty());
  62. }
  63. std::unique_ptr<base::Value> entry = TemplateURLDataToDictionary(*data);
  64. entry->SetBoolKey(DefaultSearchManager::kDisabledByPolicy, !enabled);
  65. is_mandatory ? prefs->SetManagedPref(
  66. DefaultSearchManager::kDefaultSearchProviderDataPrefName,
  67. std::move(entry))
  68. : prefs->SetRecommendedPref(
  69. DefaultSearchManager::kDefaultSearchProviderDataPrefName,
  70. std::move(entry));
  71. }
  72. } // namespace
  73. class DefaultSearchManagerTest : public testing::Test {
  74. public:
  75. DefaultSearchManagerTest() {}
  76. DefaultSearchManagerTest(const DefaultSearchManagerTest&) = delete;
  77. DefaultSearchManagerTest& operator=(const DefaultSearchManagerTest&) = delete;
  78. void SetUp() override {
  79. pref_service_ =
  80. std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
  81. DefaultSearchManager::RegisterProfilePrefs(pref_service_->registry());
  82. TemplateURLPrepopulateData::RegisterProfilePrefs(pref_service_->registry());
  83. }
  84. sync_preferences::TestingPrefServiceSyncable* pref_service() {
  85. return pref_service_.get();
  86. }
  87. private:
  88. variations::ScopedVariationsIdsProvider scoped_variations_ids_provider_{
  89. variations::VariationsIdsProvider::Mode::kUseSignedInState};
  90. std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
  91. };
  92. // Test that a TemplateURLData object is properly written and read from Prefs.
  93. TEST_F(DefaultSearchManagerTest, ReadAndWritePref) {
  94. DefaultSearchManager manager(pref_service(),
  95. DefaultSearchManager::ObserverCallback());
  96. TemplateURLData data;
  97. data.SetShortName(u"name1");
  98. data.SetKeyword(u"key1");
  99. data.SetURL("http://foo1/{searchTerms}");
  100. data.suggestions_url = "http://sugg1";
  101. data.alternate_urls.push_back("http://foo1/alt");
  102. data.favicon_url = GURL("http://icon1");
  103. data.safe_for_autoreplace = true;
  104. data.input_encodings = base::SplitString(
  105. "UTF-8;UTF-16", ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
  106. data.date_created = base::Time();
  107. data.last_modified = base::Time();
  108. data.last_modified = base::Time();
  109. data.created_from_play_api = true;
  110. manager.SetUserSelectedDefaultSearchEngine(data);
  111. const TemplateURLData* read_data = manager.GetDefaultSearchEngine(nullptr);
  112. ExpectSimilar(&data, read_data);
  113. }
  114. // Test DefaultSearchmanager handles user-selected DSEs correctly.
  115. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByUserPref) {
  116. size_t default_search_index = 0;
  117. DefaultSearchManager manager(pref_service(),
  118. DefaultSearchManager::ObserverCallback());
  119. std::vector<std::unique_ptr<TemplateURLData>> prepopulated_urls =
  120. TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service(),
  121. &default_search_index);
  122. DefaultSearchManager::Source source = DefaultSearchManager::FROM_POLICY;
  123. // If no user pref is set, we should use the pre-populated values.
  124. ExpectSimilar(prepopulated_urls[default_search_index].get(),
  125. manager.GetDefaultSearchEngine(&source));
  126. EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
  127. // Setting a user pref overrides the pre-populated values.
  128. std::unique_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user");
  129. manager.SetUserSelectedDefaultSearchEngine(*data);
  130. ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
  131. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  132. // Updating the user pref (externally to this instance of
  133. // DefaultSearchManager) triggers an update.
  134. std::unique_ptr<TemplateURLData> new_data =
  135. GenerateDummyTemplateURLData("user2");
  136. DefaultSearchManager other_manager(pref_service(),
  137. DefaultSearchManager::ObserverCallback());
  138. other_manager.SetUserSelectedDefaultSearchEngine(*new_data);
  139. ExpectSimilar(new_data.get(), manager.GetDefaultSearchEngine(&source));
  140. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  141. // Clearing the user pref should cause the default search to revert to the
  142. // prepopulated vlaues.
  143. manager.ClearUserSelectedDefaultSearchEngine();
  144. ExpectSimilar(prepopulated_urls[default_search_index].get(),
  145. manager.GetDefaultSearchEngine(&source));
  146. EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
  147. }
  148. // Test that DefaultSearch manager detects changes to kSearchProviderOverrides.
  149. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByOverrides) {
  150. SetOverrides(pref_service(), false);
  151. size_t default_search_index = 0;
  152. DefaultSearchManager manager(pref_service(),
  153. DefaultSearchManager::ObserverCallback());
  154. std::vector<std::unique_ptr<TemplateURLData>> prepopulated_urls =
  155. TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service(),
  156. &default_search_index);
  157. DefaultSearchManager::Source source = DefaultSearchManager::FROM_POLICY;
  158. TemplateURLData first_default(*manager.GetDefaultSearchEngine(&source));
  159. ExpectSimilar(prepopulated_urls[default_search_index].get(), &first_default);
  160. EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
  161. // Update the overrides:
  162. SetOverrides(pref_service(), true);
  163. prepopulated_urls = TemplateURLPrepopulateData::GetPrepopulatedEngines(
  164. pref_service(), &default_search_index);
  165. // Make sure DefaultSearchManager updated:
  166. ExpectSimilar(prepopulated_urls[default_search_index].get(),
  167. manager.GetDefaultSearchEngine(&source));
  168. EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source);
  169. EXPECT_NE(manager.GetDefaultSearchEngine(nullptr)->short_name(),
  170. first_default.short_name());
  171. EXPECT_NE(manager.GetDefaultSearchEngine(nullptr)->keyword(),
  172. first_default.keyword());
  173. }
  174. // Test DefaultSearchManager handles policy-enforced DSEs correctly.
  175. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByEnforcedPolicy) {
  176. DefaultSearchManager manager(pref_service(),
  177. DefaultSearchManager::ObserverCallback());
  178. std::unique_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user");
  179. manager.SetUserSelectedDefaultSearchEngine(*data);
  180. DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK;
  181. ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
  182. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  183. std::unique_ptr<TemplateURLData> policy_data =
  184. GenerateDummyTemplateURLData("policy");
  185. SetPolicy(pref_service(), true, policy_data.get(), /*is_mandatory=*/true);
  186. ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source));
  187. EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source);
  188. TemplateURLData null_policy_data;
  189. SetPolicy(pref_service(), false, &null_policy_data, /*is_mandatory=*/true);
  190. EXPECT_EQ(nullptr, manager.GetDefaultSearchEngine(&source));
  191. EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source);
  192. pref_service()->RemoveManagedPref(
  193. DefaultSearchManager::kDefaultSearchProviderDataPrefName);
  194. ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
  195. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  196. }
  197. // Policy-recommended DSE is handled correctly when no existing DSE is present.
  198. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByRecommendedPolicy) {
  199. DefaultSearchManager manager(pref_service(),
  200. DefaultSearchManager::ObserverCallback());
  201. DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK;
  202. // Set recommended policy DSE with valid data.
  203. std::unique_ptr<TemplateURLData> policy_data =
  204. GenerateDummyTemplateURLData("policy");
  205. SetPolicy(pref_service(), true, policy_data.get(), /*is_mandatory=*/false);
  206. ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source));
  207. EXPECT_EQ(DefaultSearchManager::FROM_POLICY_RECOMMENDED, source);
  208. // Set recommended policy DSE with null data.
  209. TemplateURLData null_policy_data;
  210. SetPolicy(pref_service(), false, &null_policy_data, /*is_mandatory=*/false);
  211. EXPECT_EQ(nullptr, manager.GetDefaultSearchEngine(&source));
  212. EXPECT_EQ(DefaultSearchManager::FROM_POLICY_RECOMMENDED, source);
  213. // Set user-configured DSE.
  214. std::unique_ptr<TemplateURLData> user_data =
  215. GenerateDummyTemplateURLData("user");
  216. manager.SetUserSelectedDefaultSearchEngine(*user_data);
  217. // The user-configured DSE overrides the recommended policy DSE.
  218. ExpectSimilar(user_data.get(), manager.GetDefaultSearchEngine(&source));
  219. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  220. // Remove the recommended policy DSE.
  221. pref_service()->RemoveRecommendedPref(
  222. DefaultSearchManager::kDefaultSearchProviderDataPrefName);
  223. ExpectSimilar(user_data.get(), manager.GetDefaultSearchEngine(&source));
  224. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  225. }
  226. // Policy-recommended DSE does not override existing DSE set by user.
  227. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByUserAndRecommendedPolicy) {
  228. DefaultSearchManager manager(pref_service(),
  229. DefaultSearchManager::ObserverCallback());
  230. // Set user-configured DSE.
  231. std::unique_ptr<TemplateURLData> user_data =
  232. GenerateDummyTemplateURLData("user");
  233. manager.SetUserSelectedDefaultSearchEngine(*user_data);
  234. DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK;
  235. ExpectSimilar(user_data.get(), manager.GetDefaultSearchEngine(&source));
  236. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  237. // Set recommended policy DSE.
  238. std::unique_ptr<TemplateURLData> policy_data =
  239. GenerateDummyTemplateURLData("policy");
  240. SetPolicy(pref_service(), true, policy_data.get(), /*is_mandatory=*/false);
  241. // The recommended policy DSE does not override the existing user DSE.
  242. ExpectSimilar(user_data.get(), manager.GetDefaultSearchEngine(&source));
  243. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  244. // Remove the recommended policy DSE.
  245. pref_service()->RemoveRecommendedPref(
  246. DefaultSearchManager::kDefaultSearchProviderDataPrefName);
  247. ExpectSimilar(user_data.get(), manager.GetDefaultSearchEngine(&source));
  248. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  249. }
  250. // Test DefaultSearchManager handles extension-controlled DSEs correctly.
  251. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByExtension) {
  252. DefaultSearchManager manager(pref_service(),
  253. DefaultSearchManager::ObserverCallback());
  254. std::unique_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user");
  255. manager.SetUserSelectedDefaultSearchEngine(*data);
  256. DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK;
  257. ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
  258. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  259. // Extension trumps prefs:
  260. std::unique_ptr<TemplateURLData> extension_data_1 =
  261. GenerateDummyTemplateURLData("ext1");
  262. SetExtensionDefaultSearchInPrefs(pref_service(), *extension_data_1);
  263. ExpectSimilar(extension_data_1.get(),
  264. manager.GetDefaultSearchEngine(&source));
  265. EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source);
  266. // Policy trumps extension:
  267. std::unique_ptr<TemplateURLData> policy_data =
  268. GenerateDummyTemplateURLData("policy");
  269. SetPolicy(pref_service(), true, policy_data.get(), /*is_mandatory=*/true);
  270. ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source));
  271. EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source);
  272. pref_service()->RemoveManagedPref(
  273. DefaultSearchManager::kDefaultSearchProviderDataPrefName);
  274. // Extensions trump each other:
  275. std::unique_ptr<TemplateURLData> extension_data_2 =
  276. GenerateDummyTemplateURLData("ext2");
  277. std::unique_ptr<TemplateURLData> extension_data_3 =
  278. GenerateDummyTemplateURLData("ext3");
  279. SetExtensionDefaultSearchInPrefs(pref_service(), *extension_data_2);
  280. SetExtensionDefaultSearchInPrefs(pref_service(), *extension_data_3);
  281. ExpectSimilar(extension_data_3.get(),
  282. manager.GetDefaultSearchEngine(&source));
  283. EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source);
  284. RemoveExtensionDefaultSearchFromPrefs(pref_service());
  285. ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source));
  286. EXPECT_EQ(DefaultSearchManager::FROM_USER, source);
  287. }
  288. // Verify that DefaultSearchManager preserves search engine parameters for
  289. // search engine created from Play API data.
  290. TEST_F(DefaultSearchManagerTest, DefaultSearchSetByPlayAPI) {
  291. DefaultSearchManager manager(pref_service(),
  292. DefaultSearchManager::ObserverCallback());
  293. const TemplateURLData* prepopulated_data =
  294. manager.GetDefaultSearchEngine(nullptr);
  295. // The test tries to set DSE to the one with prepopulate_id, matching existing
  296. // prepopulated search engine.
  297. std::unique_ptr<TemplateURLData> data = GenerateDummyTemplateURLData(
  298. base::UTF16ToUTF8(prepopulated_data->keyword()));
  299. data->prepopulate_id = prepopulated_data->prepopulate_id;
  300. data->favicon_url = prepopulated_data->favicon_url;
  301. // If the new search engine was not created form Play API data its parameters
  302. // should be overwritten with prepopulated data.
  303. manager.SetUserSelectedDefaultSearchEngine(*data);
  304. const TemplateURLData* read_data = manager.GetDefaultSearchEngine(nullptr);
  305. ExpectSimilar(prepopulated_data, read_data);
  306. // If the new search engine was created form Play API data its parameters
  307. // should be preserved.
  308. data->created_from_play_api = true;
  309. manager.SetUserSelectedDefaultSearchEngine(*data);
  310. read_data = manager.GetDefaultSearchEngine(nullptr);
  311. ExpectSimilar(data.get(), read_data);
  312. }