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.
9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h"
12 #include "components/search_engines/search_terms_data.h"
13 #include "components/search_engines/template_url.h"
14 #include "components/search_engines/template_url_service.h"
15 #include "components/search_engines/util.h"
16 #include "testing/gtest/include/gtest/gtest.h"
20 std::unique_ptr<TemplateURLData> CreatePrepopulateTemplateURLData(
22 const std::string& keyword) {
23 return std::make_unique<TemplateURLData>(
24 base::ASCIIToUTF16("Search engine name"), base::ASCIIToUTF16(keyword),
25 "https://search.url", "" /* suggest_url */, "" /* image_url */,
26 "" /* new_tab_url */, "" /* contextual_search_url */, "" /* logo_url */,
27 "" /* doodle_url */, "" /* search_url_post_params */,
28 "" /* suggest_url_post_params */, "" /* image_url_post_params */,
29 "" /* favicon_url */, "UTF-8",
30 base::ListValue() /* alternate_urls_list */, prepopulate_id);
33 // Creates a TemplateURL with default values except for the prepopulate ID,
34 // keyword and TemplateURLID. Only use this in tests if your tests do not
35 // care about other fields.
36 std::unique_ptr<TemplateURL> CreatePrepopulateTemplateURL(
38 const std::string& keyword,
40 bool is_play_api_turl = false) {
41 std::unique_ptr<TemplateURLData> data =
42 CreatePrepopulateTemplateURLData(prepopulate_id, keyword);
44 data->created_from_play_api = is_play_api_turl;
45 return std::make_unique<TemplateURL>(*data);
50 TEST(TemplateURLServiceUtilTest, RemoveDuplicatePrepopulateIDs) {
51 std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls;
52 TemplateURLService::OwnedTemplateURLVector local_turls;
54 prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "winner4"));
55 prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(2, "xxx"));
56 prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(3, "yyy"));
58 // Create a sets of different TURLs grouped by prepopulate ID. Each group
59 // will test a different heuristic of RemoveDuplicatePrepopulateIDs.
60 // Ignored set - These should be left alone as they do not have valid
62 local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner1", 4));
63 local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner2", 5));
64 local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner3", 6));
65 size_t num_non_prepopulated_urls = local_turls.size();
67 // Keyword match set - Prefer the one that matches the keyword of the
69 local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser1", 7));
70 local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser2", 8));
71 local_turls.push_back(CreatePrepopulateTemplateURL(1, "winner4", 9));
73 // Default set - Prefer the default search engine over all other criteria.
74 // The last one is the default. It will be passed as the
75 // default_search_provider parameter to RemoveDuplicatePrepopulateIDs.
76 local_turls.push_back(CreatePrepopulateTemplateURL(2, "loser3", 10));
77 local_turls.push_back(CreatePrepopulateTemplateURL(2, "xxx", 11));
78 local_turls.push_back(CreatePrepopulateTemplateURL(2, "winner5", 12));
79 TemplateURL* default_turl = local_turls.back().get();
81 // ID set - Prefer the lowest TemplateURLID if the keywords don't match and if
82 // none are the default.
83 local_turls.push_back(CreatePrepopulateTemplateURL(3, "winner6", 13));
84 local_turls.push_back(CreatePrepopulateTemplateURL(3, "loser5", 14));
85 local_turls.push_back(CreatePrepopulateTemplateURL(3, "loser6", 15));
87 RemoveDuplicatePrepopulateIDs(nullptr, prepopulated_turls, default_turl,
88 &local_turls, SearchTermsData(), nullptr);
90 // Verify that the expected local TURLs survived the process.
91 EXPECT_EQ(local_turls.size(),
92 prepopulated_turls.size() + num_non_prepopulated_urls);
93 for (const auto& turl : local_turls) {
94 EXPECT_TRUE(base::StartsWith(turl->keyword(), base::ASCIIToUTF16("winner"),
95 base::CompareCase::SENSITIVE));
99 // Tests correct interaction of Play API search engine during prepopulated list
101 TEST(TemplateURLServiceUtilTest, MergeEnginesFromPrepopulateData_PlayAPI) {
102 std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls;
103 TemplateURLService::OwnedTemplateURLVector local_turls;
105 // Start with single search engine created from Play API data.
106 local_turls.push_back(CreatePrepopulateTemplateURL(0, "play", 1, true));
108 // Test that prepopulated search engine with matching keyword is merged with
109 // Play API search engine. Search URL should come from Play API search engine.
110 const std::string prepopulated_search_url = "http://prepopulated.url";
111 prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "play"));
112 prepopulated_turls.back()->SetURL(prepopulated_search_url);
113 MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls,
115 ASSERT_EQ(local_turls.size(), 1U);
116 // Merged search engine should have both Play API flag and valid
118 EXPECT_TRUE(local_turls[0]->created_from_play_api());
119 EXPECT_EQ(1, local_turls[0]->prepopulate_id());
120 EXPECT_NE(prepopulated_search_url, local_turls[0]->url());
122 // Test that merging prepopulated search engine with matching prepopulate_id
123 // preserves keyword of Play API search engine.
124 prepopulated_turls.clear();
125 prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "play2"));
126 MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls,
128 ASSERT_EQ(local_turls.size(), 1U);
129 EXPECT_TRUE(local_turls[0]->created_from_play_api());
130 EXPECT_EQ(local_turls[0]->keyword(), base::ASCIIToUTF16("play"));
132 // Test that removing search engine from prepopulated list doesn't delete Play
133 // API search engine record.
134 prepopulated_turls.clear();
135 MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls,
137 ASSERT_EQ(local_turls.size(), 1U);
138 EXPECT_TRUE(local_turls[0]->created_from_play_api());
139 EXPECT_EQ(local_turls[0]->prepopulate_id(), 0);