Upload upstream chromium 85.0.4183.84
[platform/framework/web/chromium-efl.git] / components / search_engines / template_url_service_util_unittest.cc
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
5 #include <stddef.h>
6
7 #include <memory>
8
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"
17
18 namespace {
19
20 std::unique_ptr<TemplateURLData> CreatePrepopulateTemplateURLData(
21     int prepopulate_id,
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);
31 }
32
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(
37     int prepopulate_id,
38     const std::string& keyword,
39     TemplateURLID id,
40     bool is_play_api_turl = false) {
41   std::unique_ptr<TemplateURLData> data =
42       CreatePrepopulateTemplateURLData(prepopulate_id, keyword);
43   data->id = id;
44   data->created_from_play_api = is_play_api_turl;
45   return std::make_unique<TemplateURL>(*data);
46 }
47
48 }  // namespace
49
50 TEST(TemplateURLServiceUtilTest, RemoveDuplicatePrepopulateIDs) {
51   std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls;
52   TemplateURLService::OwnedTemplateURLVector local_turls;
53
54   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "winner4"));
55   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(2, "xxx"));
56   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(3, "yyy"));
57
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
61   // prepopulate IDs.
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();
66
67   // Keyword match set - Prefer the one that matches the keyword of the
68   // prepopulate ID.
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));
72
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();
80
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));
86
87   RemoveDuplicatePrepopulateIDs(nullptr, prepopulated_turls, default_turl,
88                                 &local_turls, SearchTermsData(), nullptr);
89
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));
96   }
97 }
98
99 // Tests correct interaction of Play API search engine during prepopulated list
100 // update.
101 TEST(TemplateURLServiceUtilTest, MergeEnginesFromPrepopulateData_PlayAPI) {
102   std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls;
103   TemplateURLService::OwnedTemplateURLVector local_turls;
104
105   // Start with single search engine created from Play API data.
106   local_turls.push_back(CreatePrepopulateTemplateURL(0, "play", 1, true));
107
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,
114                                   nullptr, nullptr);
115   ASSERT_EQ(local_turls.size(), 1U);
116   // Merged search engine should have both Play API flag and valid
117   // prepopulate_id.
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());
121
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,
127                                   nullptr, nullptr);
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"));
131
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,
136                                   nullptr, nullptr);
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);
140 }