1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// 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/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`.
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();
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;
[[nodiscard]] std::unique_ptr<TemplateURLService> ReleaseTemplateURLService();
private:
// 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<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_
|