blob: cb1c733987e13c2001f18480312dcebe7432d4dd [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/search_engines/template_url_service_test_util.h"
#include <memory>
#include "base/command_line.h"
#include "components/country_codes/country_codes.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/os_crypt/async/browser/test_utils.h"
#include "components/search_engines/keyword_table.h"
#include "components/search_engines/search_engine_choice/search_engine_choice_service.h"
#include "components/search_engines/search_engines_switches.h"
#include "components/search_engines/search_terms_data.h"
#include "components/search_engines/template_url_prepopulate_data.h"
#include "components/search_engines/template_url_service.h"
#include "components/search_engines/template_url_service_client.h"
#include "components/webdata/common/web_database_service.h"
void RegisterPrefsForTemplateURLService(
user_prefs::PrefRegistrySyncable* registry) {
TemplateURLService::RegisterProfilePrefs(registry);
TemplateURLPrepopulateData::RegisterProfilePrefs(registry);
DefaultSearchManager::RegisterProfilePrefs(registry);
}
// -- TemplateURLServiceLoadWaiter --------------------------------------------
TemplateURLServiceLoadWaiter::TemplateURLServiceLoadWaiter() = default;
TemplateURLServiceLoadWaiter::~TemplateURLServiceLoadWaiter() = default;
void TemplateURLServiceLoadWaiter::WaitForLoadComplete(
TemplateURLService& template_url_service) {
ASSERT_TRUE(!scoped_template_url_service_observation_.IsObserving());
if (template_url_service.loaded()) {
return;
}
scoped_template_url_service_observation_.Observe(&template_url_service);
run_loop_.Run();
}
void TemplateURLServiceLoadWaiter::OnTemplateURLServiceChanged() {
UpdateStatus();
}
void TemplateURLServiceLoadWaiter::OnTemplateURLServiceShuttingDown() {
// Added for correctness. Not needed for the classic use cases where we wait
// for the service to finish loading after creation. But in case a test runs
// into some issue or a service is destroyed, this is intended to not keep
// blocking and risk hiding the underlying issue.
UpdateStatus(/*force_quit=*/true);
}
void TemplateURLServiceLoadWaiter::UpdateStatus(bool force_quit) {
ASSERT_TRUE(scoped_template_url_service_observation_.IsObserving());
if (force_quit ||
scoped_template_url_service_observation_.GetSource()->loaded()) {
scoped_template_url_service_observation_.Reset();
run_loop_.Quit();
}
}
// -- TemplateURLServiceUnitTestBase ------------------------------------------
TemplateURLServiceUnitTestBase::TemplateURLServiceUnitTestBase() = default;
TemplateURLServiceUnitTestBase::~TemplateURLServiceUnitTestBase() = default;
void TemplateURLServiceUnitTestBase::SetUp() {
RegisterPrefsForTemplateURLService(pref_service_.registry());
local_state_.registry()->RegisterBooleanPref(
metrics::prefs::kMetricsReportingEnabled, true);
// Bypass the country checks.
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switches::kSearchEngineChoiceCountry,
switches::kDefaultListCountryOverride);
search_engine_choice_service_ =
std::make_unique<search_engines::SearchEngineChoiceService>(
pref_service_, &local_state_, country_codes::kCountryIDUnknown);
template_url_service_ = CreateService();
}
std::unique_ptr<TemplateURLService>
TemplateURLServiceUnitTestBase::CreateService() {
return std::make_unique<TemplateURLService>(
pref_service_, *search_engine_choice_service_,
std::make_unique<SearchTermsData>(), nullptr /* KeywordWebDataService */,
nullptr /* TemplateURLServiceClient */, base::RepeatingClosure()
#if BUILDFLAG(IS_CHROMEOS_LACROS)
,
false
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
);
}
// -- LoadedTemplateURLServiceUnitTestBase ------------------------------------
LoadedTemplateURLServiceUnitTestBase::LoadedTemplateURLServiceUnitTestBase()
: os_crypt_(os_crypt_async::GetTestOSCryptAsyncForTesting()) {}
LoadedTemplateURLServiceUnitTestBase::~LoadedTemplateURLServiceUnitTestBase() =
default;
std::unique_ptr<TemplateURLService>
LoadedTemplateURLServiceUnitTestBase::CreateService() {
CHECK(!database_);
CHECK(!keyword_data_service_);
auto task_runner = task_environment.GetMainThreadTaskRunner();
database_ = base::MakeRefCounted<WebDatabaseService>(
base::FilePath(WebDatabase::kInMemoryPath),
/*ui_task_runner=*/task_runner,
/*db_task_runner=*/task_runner);
database_->AddTable(std::make_unique<KeywordTable>());
database_->LoadDatabase(os_crypt_.get());
keyword_data_service_ =
base::MakeRefCounted<KeywordWebDataService>(database_, task_runner);
keyword_data_service_->Init(base::DoNothing());
auto template_url_service = std::make_unique<TemplateURLService>(
pref_service(), search_engine_choice_service(),
std::make_unique<SearchTermsData>(), keyword_data_service_,
nullptr /* TemplateURLServiceClient */, base::RepeatingClosure()
#if BUILDFLAG(IS_CHROMEOS_LACROS)
,
false
#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
);
return template_url_service;
}
void LoadedTemplateURLServiceUnitTestBase::SetUp() {
TemplateURLServiceUnitTestBase::SetUp();
ASSERT_FALSE(template_url_service().loaded());
template_url_service().Load();
template_url_service_load_waiter_.WaitForLoadComplete(template_url_service());
ASSERT_EQ(GetKeywordTemplateURLs().size(),
TemplateURLPrepopulateData::GetDefaultPrepopulatedEngines().size());
}
void LoadedTemplateURLServiceUnitTestBase::TearDown() {
template_url_service().Shutdown();
keyword_data_service_->ShutdownOnUISequence();
database_->ShutdownDatabase();
}
// Same as `TemplateURLService::GetTemplateURLs()`, but removes the starter
// pack entries.
TemplateURLService::TemplateURLVector
LoadedTemplateURLServiceUnitTestBase::GetKeywordTemplateURLs() {
TemplateURLService::TemplateURLVector turls =
template_url_service().GetTemplateURLs();
turls.erase(base::ranges::remove_if(turls,
[](const TemplateURL* turl) {
return turl->starter_pack_id() != 0;
}),
turls.end());
return turls;
}
// Returns `TemplateURLService::GetTemplateURLs()`, filtering to only entries
// that have `keyword` as their keyword. In general it should return a single
// elements, but in some cases there may be more.
TemplateURLService::TemplateURLVector
LoadedTemplateURLServiceUnitTestBase::GetTemplateURLsMatchingKeyword(
std::u16string keyword) {
TemplateURLService::TemplateURLVector matching_turls;
for (const auto& turl : template_url_service().GetTemplateURLs()) {
if (turl->keyword() == keyword) {
matching_turls.push_back(turl);
}
}
return matching_turls;
}