template_url_service_util_unittest.cc 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 <stddef.h>
  5. #include <memory>
  6. #include "base/strings/string_util.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "base/values.h"
  9. #include "components/search_engines/search_terms_data.h"
  10. #include "components/search_engines/template_url.h"
  11. #include "components/search_engines/template_url_service.h"
  12. #include "components/search_engines/util.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. namespace {
  15. std::unique_ptr<TemplateURLData> CreatePrepopulateTemplateURLData(
  16. int prepopulate_id,
  17. const std::string& keyword) {
  18. return std::make_unique<TemplateURLData>(
  19. u"Search engine name", base::ASCIIToUTF16(keyword), "https://search.url",
  20. "" /* suggest_url */, "" /* image_url */, "" /* new_tab_url */,
  21. "" /* contextual_search_url */, "" /* logo_url */, "" /* doodle_url */,
  22. "" /* search_url_post_params */, "" /* suggest_url_post_params */,
  23. "" /* image_url_post_params */, "" /* side_search_param */,
  24. "" /* favicon_url */, "UTF-8",
  25. base::ListValue() /* alternate_urls_list */,
  26. false /* preconnect_to_search_url */,
  27. false /* prefetch_likely_navigations */, prepopulate_id);
  28. }
  29. // Creates a TemplateURL with default values except for the prepopulate ID,
  30. // keyword and TemplateURLID. Only use this in tests if your tests do not
  31. // care about other fields.
  32. std::unique_ptr<TemplateURL> CreatePrepopulateTemplateURL(
  33. int prepopulate_id,
  34. const std::string& keyword,
  35. TemplateURLID id,
  36. bool is_play_api_turl = false) {
  37. std::unique_ptr<TemplateURLData> data =
  38. CreatePrepopulateTemplateURLData(prepopulate_id, keyword);
  39. data->id = id;
  40. data->created_from_play_api = is_play_api_turl;
  41. return std::make_unique<TemplateURL>(*data);
  42. }
  43. } // namespace
  44. TEST(TemplateURLServiceUtilTest, RemoveDuplicatePrepopulateIDs) {
  45. std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls;
  46. TemplateURLService::OwnedTemplateURLVector local_turls;
  47. prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "winner4"));
  48. prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(2, "xxx"));
  49. prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(3, "yyy"));
  50. // Create a sets of different TURLs grouped by prepopulate ID. Each group
  51. // will test a different heuristic of RemoveDuplicatePrepopulateIDs.
  52. // Ignored set - These should be left alone as they do not have valid
  53. // prepopulate IDs.
  54. local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner1", 4));
  55. local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner2", 5));
  56. local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner3", 6));
  57. size_t num_non_prepopulated_urls = local_turls.size();
  58. // Keyword match set - Prefer the one that matches the keyword of the
  59. // prepopulate ID.
  60. local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser1", 7));
  61. local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser2", 8));
  62. local_turls.push_back(CreatePrepopulateTemplateURL(1, "winner4", 9));
  63. // Default set - Prefer the default search engine over all other criteria.
  64. // The last one is the default. It will be passed as the
  65. // default_search_provider parameter to RemoveDuplicatePrepopulateIDs.
  66. local_turls.push_back(CreatePrepopulateTemplateURL(2, "loser3", 10));
  67. local_turls.push_back(CreatePrepopulateTemplateURL(2, "xxx", 11));
  68. local_turls.push_back(CreatePrepopulateTemplateURL(2, "winner5", 12));
  69. TemplateURL* default_turl = local_turls.back().get();
  70. // ID set - Prefer the lowest TemplateURLID if the keywords don't match and if
  71. // none are the default.
  72. local_turls.push_back(CreatePrepopulateTemplateURL(3, "winner6", 13));
  73. local_turls.push_back(CreatePrepopulateTemplateURL(3, "loser5", 14));
  74. local_turls.push_back(CreatePrepopulateTemplateURL(3, "loser6", 15));
  75. RemoveDuplicatePrepopulateIDs(nullptr, prepopulated_turls, default_turl,
  76. &local_turls, SearchTermsData(), nullptr);
  77. // Verify that the expected local TURLs survived the process.
  78. EXPECT_EQ(local_turls.size(),
  79. prepopulated_turls.size() + num_non_prepopulated_urls);
  80. for (const auto& turl : local_turls) {
  81. EXPECT_TRUE(base::StartsWith(turl->keyword(), u"winner",
  82. base::CompareCase::SENSITIVE));
  83. }
  84. }
  85. // Tests correct interaction of Play API search engine during prepopulated list
  86. // update.
  87. TEST(TemplateURLServiceUtilTest, MergeEnginesFromPrepopulateData_PlayAPI) {
  88. std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls;
  89. TemplateURLService::OwnedTemplateURLVector local_turls;
  90. // Start with single search engine created from Play API data.
  91. local_turls.push_back(CreatePrepopulateTemplateURL(0, "play", 1, true));
  92. // Test that prepopulated search engine with matching keyword is merged with
  93. // Play API search engine. Search URL should come from Play API search engine.
  94. const std::string prepopulated_search_url = "http://prepopulated.url";
  95. prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "play"));
  96. prepopulated_turls.back()->SetURL(prepopulated_search_url);
  97. MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls,
  98. nullptr, nullptr);
  99. ASSERT_EQ(local_turls.size(), 1U);
  100. // Merged search engine should have both Play API flag and valid
  101. // prepopulate_id.
  102. EXPECT_TRUE(local_turls[0]->created_from_play_api());
  103. EXPECT_EQ(1, local_turls[0]->prepopulate_id());
  104. EXPECT_NE(prepopulated_search_url, local_turls[0]->url());
  105. // Test that merging prepopulated search engine with matching prepopulate_id
  106. // preserves keyword of Play API search engine.
  107. prepopulated_turls.clear();
  108. prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "play2"));
  109. MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls,
  110. nullptr, nullptr);
  111. ASSERT_EQ(local_turls.size(), 1U);
  112. EXPECT_TRUE(local_turls[0]->created_from_play_api());
  113. EXPECT_EQ(local_turls[0]->keyword(), u"play");
  114. // Test that removing search engine from prepopulated list doesn't delete Play
  115. // API search engine record.
  116. prepopulated_turls.clear();
  117. MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls,
  118. nullptr, nullptr);
  119. ASSERT_EQ(local_turls.size(), 1U);
  120. EXPECT_TRUE(local_turls[0]->created_from_play_api());
  121. EXPECT_EQ(local_turls[0]->prepopulate_id(), 0);
  122. }
  123. // Tests that user modified fields are preserved and overwritten appropriately
  124. // in MergeIntoEngineData().
  125. TEST(TemplateURLServiceUtilTest, MergeIntoEngineData) {
  126. std::unique_ptr<TemplateURLData> original_turl_data =
  127. CreatePrepopulateTemplateURLData(1, "google");
  128. std::unique_ptr<TemplateURLData> url_to_update =
  129. CreatePrepopulateTemplateURLData(1, "google");
  130. // Modify the keyword and title for original_turl and set safe_for_autoreplace
  131. // to false to simulate a "user edited" template url.
  132. original_turl_data->SetShortName(u"modified name");
  133. original_turl_data->SetKeyword(u"new keyword");
  134. original_turl_data->safe_for_autoreplace = false;
  135. std::unique_ptr<TemplateURL> original_turl =
  136. std::make_unique<TemplateURL>(*original_turl_data);
  137. // Set `merge_options` to kOverwriteUserEdits. This should NOT preserve the
  138. // modified fields. `url_to_update` should keep the default keyword and name
  139. // values as well as safe_for_autoreplace being true.
  140. MergeIntoEngineData(original_turl.get(), url_to_update.get(),
  141. MergeOptions::kOverwriteUserEdits);
  142. EXPECT_TRUE(url_to_update->safe_for_autoreplace);
  143. EXPECT_EQ(url_to_update->short_name(), u"Search engine name");
  144. EXPECT_EQ(url_to_update->keyword(), u"google");
  145. // Set `merge_options` to kDefault. This should preserve the modified
  146. // keyword and title fields from original_turl and update url_to_update
  147. // accordingly.
  148. MergeIntoEngineData(original_turl.get(), url_to_update.get(),
  149. MergeOptions::kDefault);
  150. EXPECT_FALSE(url_to_update->safe_for_autoreplace);
  151. EXPECT_EQ(url_to_update->short_name(), u"modified name");
  152. EXPECT_EQ(url_to_update->keyword(), u"new keyword");
  153. }