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
|
// 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/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;
};
struct ServiceFactories {
base::RepeatingCallback<
std::unique_ptr<regional_capabilities::RegionalCapabilitiesService>(
SearchEnginesTestEnvironment& self)>
regional_capabilities_service_factory;
base::RepeatingCallback<std::unique_ptr<SearchEngineChoiceService>(
SearchEnginesTestEnvironment& self)>
search_engine_choice_service_factory;
base::RepeatingCallback<std::unique_ptr<TemplateURLService>(
SearchEnginesTestEnvironment& self)>
template_url_service_factory;
ServiceFactories();
ServiceFactories(const ServiceFactories& other);
ServiceFactories& operator=(const ServiceFactories& other);
~ServiceFactories();
};
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_
|