File: search_engines_test_environment.h

package info (click to toggle)
chromium 140.0.7339.185-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,193,740 kB
  • sloc: cpp: 35,093,945; ansic: 7,161,670; javascript: 4,199,694; python: 1,441,797; asm: 949,904; xml: 747,515; pascal: 187,748; perl: 88,691; sh: 88,248; objc: 79,953; sql: 52,714; cs: 44,599; fortran: 24,137; makefile: 22,114; tcl: 15,277; php: 13,980; yacc: 9,000; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (135 lines) | stat: -rw-r--r-- 5,312 bytes parent folder | download | duplicates (4)
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_