| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include <stddef.h> | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "base/strings/string_util.h" | 
 | #include "base/strings/utf_string_conversions.h" | 
 | #include "base/values.h" | 
 | #include "components/search_engines/search_terms_data.h" | 
 | #include "components/search_engines/template_url.h" | 
 | #include "components/search_engines/template_url_service.h" | 
 | #include "components/search_engines/util.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace { | 
 |  | 
 | std::unique_ptr<TemplateURLData> CreatePrepopulateTemplateURLData( | 
 |     int prepopulate_id, | 
 |     const std::string& keyword) { | 
 |   return std::make_unique<TemplateURLData>( | 
 |       base::ASCIIToUTF16("Search engine name"), base::ASCIIToUTF16(keyword), | 
 |       "https://search.url", "" /* suggest_url */, "" /* image_url */, | 
 |       "" /* new_tab_url */, "" /* contextual_search_url */, "" /* logo_url */, | 
 |       "" /* doodle_url */, "" /* search_url_post_params */, | 
 |       "" /* suggest_url_post_params */, "" /* image_url_post_params */, | 
 |       "" /* favicon_url */, "UTF-8", | 
 |       base::ListValue() /* alternate_urls_list */, prepopulate_id); | 
 | } | 
 |  | 
 | // Creates a TemplateURL with default values except for the prepopulate ID, | 
 | // keyword and TemplateURLID. Only use this in tests if your tests do not | 
 | // care about other fields. | 
 | std::unique_ptr<TemplateURL> CreatePrepopulateTemplateURL( | 
 |     int prepopulate_id, | 
 |     const std::string& keyword, | 
 |     TemplateURLID id, | 
 |     bool is_play_api_turl = false) { | 
 |   std::unique_ptr<TemplateURLData> data = | 
 |       CreatePrepopulateTemplateURLData(prepopulate_id, keyword); | 
 |   data->id = id; | 
 |   data->created_from_play_api = is_play_api_turl; | 
 |   return std::make_unique<TemplateURL>(*data); | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST(TemplateURLServiceUtilTest, RemoveDuplicatePrepopulateIDs) { | 
 |   std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls; | 
 |   TemplateURLService::OwnedTemplateURLVector local_turls; | 
 |  | 
 |   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "winner4")); | 
 |   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(2, "xxx")); | 
 |   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(3, "yyy")); | 
 |  | 
 |   // Create a sets of different TURLs grouped by prepopulate ID. Each group | 
 |   // will test a different heuristic of RemoveDuplicatePrepopulateIDs. | 
 |   // Ignored set - These should be left alone as they do not have valid | 
 |   // prepopulate IDs. | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner1", 4)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner2", 5)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(0, "winner3", 6)); | 
 |   size_t num_non_prepopulated_urls = local_turls.size(); | 
 |  | 
 |   // Keyword match set - Prefer the one that matches the keyword of the | 
 |   // prepopulate ID. | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser1", 7)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(1, "loser2", 8)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(1, "winner4", 9)); | 
 |  | 
 |   // Default set - Prefer the default search engine over all other criteria. | 
 |   // The last one is the default. It will be passed as the | 
 |   // default_search_provider parameter to RemoveDuplicatePrepopulateIDs. | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(2, "loser3", 10)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(2, "xxx", 11)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(2, "winner5", 12)); | 
 |   TemplateURL* default_turl = local_turls.back().get(); | 
 |  | 
 |   // ID set - Prefer the lowest TemplateURLID if the keywords don't match and if | 
 |   // none are the default. | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(3, "winner6", 13)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(3, "loser5", 14)); | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(3, "loser6", 15)); | 
 |  | 
 |   RemoveDuplicatePrepopulateIDs(nullptr, prepopulated_turls, default_turl, | 
 |                                 &local_turls, SearchTermsData(), nullptr); | 
 |  | 
 |   // Verify that the expected local TURLs survived the process. | 
 |   EXPECT_EQ(local_turls.size(), | 
 |             prepopulated_turls.size() + num_non_prepopulated_urls); | 
 |   for (const auto& turl : local_turls) { | 
 |     EXPECT_TRUE(base::StartsWith(turl->keyword(), base::ASCIIToUTF16("winner"), | 
 |                                  base::CompareCase::SENSITIVE)); | 
 |   } | 
 | } | 
 |  | 
 | // Tests correct interaction of Play API search engine during prepopulated list | 
 | // update. | 
 | TEST(TemplateURLServiceUtilTest, MergeEnginesFromPrepopulateData_PlayAPI) { | 
 |   std::vector<std::unique_ptr<TemplateURLData>> prepopulated_turls; | 
 |   TemplateURLService::OwnedTemplateURLVector local_turls; | 
 |  | 
 |   // Start with single search engine created from Play API data. | 
 |   local_turls.push_back(CreatePrepopulateTemplateURL(0, "play", 1, true)); | 
 |  | 
 |   // Test that prepopulated search engine with matching keyword is merged with | 
 |   // Play API search engine. Search URL should come from Play API search engine. | 
 |   const std::string prepopulated_search_url = "http://prepopulated.url"; | 
 |   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "play")); | 
 |   prepopulated_turls.back()->SetURL(prepopulated_search_url); | 
 |   MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls, | 
 |                                   nullptr, nullptr); | 
 |   ASSERT_EQ(local_turls.size(), 1U); | 
 |   // Merged search engine should have both Play API flag and valid | 
 |   // prepopulate_id. | 
 |   EXPECT_TRUE(local_turls[0]->created_from_play_api()); | 
 |   EXPECT_EQ(1, local_turls[0]->prepopulate_id()); | 
 |   EXPECT_NE(prepopulated_search_url, local_turls[0]->url()); | 
 |  | 
 |   // Test that merging prepopulated search engine with matching prepopulate_id | 
 |   // preserves keyword of Play API search engine. | 
 |   prepopulated_turls.clear(); | 
 |   prepopulated_turls.push_back(CreatePrepopulateTemplateURLData(1, "play2")); | 
 |   MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls, | 
 |                                   nullptr, nullptr); | 
 |   ASSERT_EQ(local_turls.size(), 1U); | 
 |   EXPECT_TRUE(local_turls[0]->created_from_play_api()); | 
 |   EXPECT_EQ(local_turls[0]->keyword(), base::ASCIIToUTF16("play")); | 
 |  | 
 |   // Test that removing search engine from prepopulated list doesn't delete Play | 
 |   // API search engine record. | 
 |   prepopulated_turls.clear(); | 
 |   MergeEnginesFromPrepopulateData(nullptr, &prepopulated_turls, &local_turls, | 
 |                                   nullptr, nullptr); | 
 |   ASSERT_EQ(local_turls.size(), 1U); | 
 |   EXPECT_TRUE(local_turls[0]->created_from_play_api()); | 
 |   EXPECT_EQ(local_turls[0]->prepopulate_id(), 0); | 
 | } |