blob: c83a98187450585acae911f46cd52081876b1dda [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/search_engines_test_environment.h"
#include <utility>
#include "base/test/bind.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/regional_capabilities/regional_capabilities_service.h"
#include "components/regional_capabilities/regional_capabilities_test_utils.h"
#include "components/search_engines/search_engine_choice/search_engine_choice_service.h"
#include "components/search_engines/search_engines_pref_names.h"
#include "components/search_engines/search_engines_test_util.h"
#include "components/search_engines/template_url_prepopulate_data_resolver.h"
#include "components/search_engines/template_url_service.h"
#include "components/search_engines/template_url_service_test_util.h"
namespace search_engines {
namespace {
SearchEnginesTestEnvironment::ServiceFactories CreateDefaultFactories(
const SearchEnginesTestEnvironment::Deps& deps) {
SearchEnginesTestEnvironment::ServiceFactories default_factories;
default_factories.regional_capabilities_service_factory =
base::BindRepeating([](SearchEnginesTestEnvironment& environment) {
return regional_capabilities::CreateServiceWithFakeClient(
environment.pref_service());
});
default_factories.search_engine_choice_service_factory =
base::BindRepeating([](SearchEnginesTestEnvironment& environment) {
return std::make_unique<SearchEngineChoiceService>(
std::make_unique<FakeSearchEngineChoiceServiceClient>(),
environment.pref_service(), &environment.local_state(),
environment.regional_capabilities_service(),
environment.prepopulate_data_resolver());
});
default_factories.template_url_service_factory = base::BindLambdaForTesting(
[deps](SearchEnginesTestEnvironment& environment) {
return std::make_unique<TemplateURLService>(
environment.pref_service(),
environment.search_engine_choice_service(),
environment.prepopulate_data_resolver(),
deps.template_url_service_initializer);
});
return default_factories;
}
} // namespace
SearchEnginesTestEnvironment::ServiceFactories::ServiceFactories() = default;
SearchEnginesTestEnvironment::ServiceFactories::ServiceFactories(
const ServiceFactories& other) = default;
SearchEnginesTestEnvironment::ServiceFactories&
SearchEnginesTestEnvironment::ServiceFactories::operator=(
const ServiceFactories& other) = default;
SearchEnginesTestEnvironment::ServiceFactories::~ServiceFactories() = default;
SearchEnginesTestEnvironment::SearchEnginesTestEnvironment(
const Deps& deps,
const ServiceFactories& lazy_factories)
: service_factories_overrides_(lazy_factories),
default_factories_(CreateDefaultFactories(deps)) {
local_state_ = deps.local_state;
pref_service_ = deps.pref_service;
if (!pref_service_) {
owned_pref_service_ =
std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
pref_service_ = owned_pref_service_.get();
RegisterPrefsForTemplateURLService(pref_service_->registry());
}
if (!local_state_) {
owned_local_state_ = std::make_unique<TestingPrefServiceSimple>();
local_state_ = owned_local_state_.get();
local_state_->registry()->RegisterBooleanPref(
metrics::prefs::kMetricsReportingEnabled, true);
SearchEngineChoiceService::RegisterLocalStatePrefs(
local_state_->registry());
}
}
SearchEnginesTestEnvironment::~SearchEnginesTestEnvironment() = default;
void SearchEnginesTestEnvironment::Shutdown() {
if (template_url_service_) {
template_url_service_->Shutdown();
}
}
sync_preferences::TestingPrefServiceSyncable&
SearchEnginesTestEnvironment::pref_service() {
return *pref_service_;
}
sync_preferences::TestingPrefServiceSyncable&
SearchEnginesTestEnvironment::pref_service() const {
return *pref_service_;
}
TestingPrefServiceSimple& SearchEnginesTestEnvironment::local_state() {
return *local_state_;
}
regional_capabilities::RegionalCapabilitiesService&
SearchEnginesTestEnvironment::regional_capabilities_service() {
if (!regional_capabilities_service_) {
regional_capabilities_service_ =
service_factories_overrides_.regional_capabilities_service_factory
? service_factories_overrides_.regional_capabilities_service_factory
.Run(*this)
: default_factories_.regional_capabilities_service_factory.Run(
*this);
}
return *regional_capabilities_service_;
}
TemplateURLPrepopulateData::Resolver&
SearchEnginesTestEnvironment::prepopulate_data_resolver() {
if (!prepopulate_data_resolver_) {
prepopulate_data_resolver_ =
std::make_unique<TemplateURLPrepopulateData::Resolver>(
pref_service(), regional_capabilities_service());
}
return *prepopulate_data_resolver_;
}
SearchEngineChoiceService&
SearchEnginesTestEnvironment::search_engine_choice_service() {
if (!search_engine_choice_service_) {
search_engine_choice_service_ =
service_factories_overrides_.search_engine_choice_service_factory
? service_factories_overrides_.search_engine_choice_service_factory
.Run(*this)
: default_factories_.search_engine_choice_service_factory.Run(
*this);
}
return *search_engine_choice_service_;
}
TemplateURLService* SearchEnginesTestEnvironment::template_url_service() {
if (!template_url_service_ && !released_template_url_service_) {
template_url_service_ =
service_factories_overrides_.template_url_service_factory
? service_factories_overrides_.template_url_service_factory.Run(
*this)
: default_factories_.template_url_service_factory.Run(*this);
}
return template_url_service_.get();
}
const TemplateURLService* SearchEnginesTestEnvironment::template_url_service()
const {
return template_url_service_.get();
}
std::unique_ptr<TemplateURLService>
SearchEnginesTestEnvironment::ReleaseTemplateURLService() {
// Lazily create the service, which should fail if a previous instance has
// already been released.
CHECK(template_url_service());
released_template_url_service_ = true;
return std::move(template_url_service_);
}
} // namespace search_engines