// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_TEST_SCOPED_FEATURE_LIST_H_ #define BASE_TEST_SCOPED_FEATURE_LIST_H_ #include <memory> #include <string> #include <vector> #include "base/containers/flat_map.h" #include "base/feature_list.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" #include "base/metrics/field_trial.h" #include "base/metrics/field_trial_params.h" #include "base/types/pass_key.h" #include "third_party/abseil-cpp/absl/base/attributes.h" namespace base::test { // A reference to a base::Feature and field trial params that should be force // enabled and overwritten for test purposes. struct FeatureRefAndParams { … }; // A lightweight wrapper for a reference to a base::Feature. Allows lists of // features to be enabled/disabled to be easily passed without actually copying // the underlying base::Feature. Actual C++ references do not work well for this // purpose, as vectors of references are disallowed. class FeatureRef { … }; // ScopedFeatureList resets the global FeatureList instance to a new instance // and restores the original instance upon destruction. Whether the existing // FeatureList state is kept or discarded depends on the `Init` method called. // When using the non-deprecated APIs, a corresponding FieldTrialList is also // created. // // Note: Re-using the same object is allowed. To reset the feature list and // initialize it anew, call `Reset` and then one of the `Init` methods. // // If multiple instances of this class are used in a nested fashion, they // should be destroyed in the opposite order of their Init*() methods being // called. // // ScopedFeatureList needs to be initialized on the main thread (via one of // Init*() methods) before running code that inspects the state of features, // such as in the constructor of the test harness. // // WARNING: To be clear, in multithreaded test environments (such as browser // tests) there may background threads using FeatureList before the test body is // even entered. In these cases it is imperative that ScopedFeatureList be // initialized BEFORE those threads are started, hence the recommendation to do // initialization in the test harness's constructor. class ScopedFeatureList final { … }; } // namespace base::test #endif // BASE_TEST_SCOPED_FEATURE_LIST_H_