blob: 172662684d514001ea0664d366abfb5a3c6d8720 [file] [log] [blame]
// 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", nullptr /* suggest_url */, nullptr /* image_url */,
nullptr /* new_tab_url */, nullptr /* contextual_search_url */,
nullptr /* logo_url */, nullptr /* doodle_url */,
nullptr /* search_url_post_params */,
nullptr /* suggest_url_post_params */,
nullptr /* image_url_post_params */, nullptr /* 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);
}