blob: cc178a9c43b73b4c27f402632f3453713605d336 [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.
#ifndef COMPONENTS_SEARCH_ENGINES_SEARCH_ENGINES_TEST_ENVIRONMENT_H_
#define COMPONENTS_SEARCH_ENGINES_SEARCH_ENGINES_TEST_ENVIRONMENT_H_
#include <memory>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_span.h"
#include "components/prefs/testing_pref_service.h"
#include "components/search_engines/search_engine_choice/search_engine_choice_service.h"
#include "components/search_engines/template_url_service.h"
#include "components/signin/public/identity_manager/identity_test_environment.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
namespace regional_capabilities {
class RegionalCapabilitiesService;
}
namespace TemplateURLPrepopulateData {
class Resolver;
}
namespace search_engines {
// Test helper that makes it easier to create a `TemplateURLService` and a
// `SearchEngineChoiceService`. The caller should not worry about the
// dependencies needed to create those classes.
// `pref_service` and `local_state` can be passed by the caller using `Deps`. It
// will be the caller's responsibility to make sure the incoming pref services
// have the needed registrations.
// The creation of the various services involved with `TemplateURLService` can
// be controlled by passing a custom `ServiceFactories`.
//
// NOTE: SearchEnginesTestEnvironment requires that tests have a properly set up
// task environment. If your test doesn't already have one, use a
// base::test::TaskEnvironment instance variable to fulfill this
// requirement.
class SearchEnginesTestEnvironment {
public:
struct Deps {
raw_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service =
nullptr;
raw_ptr<TestingPrefServiceSimple> local_state = nullptr;
base::raw_span<const TemplateURLService::Initializer>
template_url_service_initializer;
};
template <typename T>
using ServiceFactory = base::RepeatingCallback<std::unique_ptr<T>(
SearchEnginesTestEnvironment& self)>;
struct ServiceFactories {
ServiceFactory<regional_capabilities::RegionalCapabilitiesService>
regional_capabilities_service_factory;
ServiceFactory<SearchEngineChoiceService>
search_engine_choice_service_factory;
ServiceFactory<TemplateURLService> template_url_service_factory;
ServiceFactories();
ServiceFactories(const ServiceFactories& other);
ServiceFactories& operator=(const ServiceFactories& other);
~ServiceFactories();
};
static ServiceFactory<SearchEngineChoiceService>
GetSearchEngineChoiceServiceFactory(
bool skip_init = false,
base::RepeatingCallback<
std::unique_ptr<SearchEngineChoiceService::Client>()> client_factory =
base::RepeatingCallback<
std::unique_ptr<SearchEngineChoiceService::Client>()>());
explicit SearchEnginesTestEnvironment(
const Deps& deps = {/*pref_service=*/nullptr,
/*local_state=*/nullptr,
/*template_url_service_initializer=*/{}},
const ServiceFactories& service_factories = ServiceFactories());
SearchEnginesTestEnvironment(const SearchEnginesTestEnvironment&) = delete;
SearchEnginesTestEnvironment& operator=(const SearchEnginesTestEnvironment&) =
delete;
~SearchEnginesTestEnvironment();
void Shutdown();
sync_preferences::TestingPrefServiceSyncable& pref_service();
sync_preferences::TestingPrefServiceSyncable& pref_service() const;
TestingPrefServiceSimple& local_state();
regional_capabilities::RegionalCapabilitiesService&
regional_capabilities_service();
TemplateURLPrepopulateData::Resolver& prepopulate_data_resolver();
policy::ManagementService& management_service();
SearchEngineChoiceService& search_engine_choice_service();
// Guaranteed to be non-null unless `ReleaseTemplateURLService` has been
// called.
TemplateURLService* template_url_service();
// As the services are lazily created, this might unexpectedly return null
// when it's the first access to this service. Call the non-const version of
// the function if forcing the service creation earlier is needed.
const TemplateURLService* template_url_service() const;
signin::IdentityTestEnvironment& identity_test_env() {
return identity_test_env_;
}
[[nodiscard]] std::unique_ptr<TemplateURLService> ReleaseTemplateURLService();
private:
signin::IdentityTestEnvironment identity_test_env_;
// Created when `Deps::local_state` is not provided.
// Don't access it directly, prefer using `local_state_` instead.
std::unique_ptr<TestingPrefServiceSimple> owned_local_state_;
raw_ptr<TestingPrefServiceSimple> local_state_;
// Created when `Deps::pref_service` is not provided.
// Don't access it directly, prefer using `pref_service_` instead.
std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
owned_pref_service_;
raw_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
const ServiceFactories service_factories_overrides_;
const ServiceFactories default_factories_;
// Services below have dependencies between each other, they must be kept
// in order to ensure destruction correctness.
std::unique_ptr<regional_capabilities::RegionalCapabilitiesService>
regional_capabilities_service_;
std::unique_ptr<TemplateURLPrepopulateData::Resolver>
prepopulate_data_resolver_;
std::unique_ptr<policy::ManagementService> management_service_;
std::unique_ptr<SearchEngineChoiceService> search_engine_choice_service_;
std::unique_ptr<TemplateURLService> template_url_service_;
bool released_template_url_service_ = false;
};
} // namespace search_engines
#endif // COMPONENTS_SEARCH_ENGINES_SEARCH_ENGINES_TEST_ENVIRONMENT_H_