// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/variations/variations_params_manager.h" #include #include "base/feature_list.h" #include "base/memory/ptr_util.h" #include "base/metrics/field_trial.h" #include "base/test/scoped_feature_list.h" #include "components/variations/variations_associated_data.h" namespace variations { namespace testing { namespace { // The fixed testing group created in the provided trail when setting up params. const char kGroupTesting[] = "Testing"; base::FieldTrial* CreateFieldTrialWithParams( const std::string& trial_name, const std::map& param_values) { variations::AssociateVariationParams(trial_name, kGroupTesting, param_values); return base::FieldTrialList::CreateFieldTrial(trial_name, kGroupTesting); } } // namespace VariationParamsManager::VariationParamsManager() : field_trial_list_(new base::FieldTrialList(nullptr)), scoped_feature_list_(new base::test::ScopedFeatureList()) {} VariationParamsManager::VariationParamsManager( const std::string& trial_name, const std::map& param_values) : VariationParamsManager() { SetVariationParams(trial_name, param_values); } VariationParamsManager::VariationParamsManager( const std::string& trial_name, const std::map& param_values, const std::set& associated_features) : VariationParamsManager() { SetVariationParamsWithFeatureAssociations(trial_name, param_values, associated_features); } VariationParamsManager::~VariationParamsManager() { ClearAllVariationIDs(); ClearAllVariationParams(); } void VariationParamsManager::SetVariationParams( const std::string& trial_name, const std::map& param_values) { CreateFieldTrialWithParams(trial_name, param_values); } void VariationParamsManager::SetVariationParamsWithFeatureAssociations( const std::string& trial_name, const std::map& param_values, const std::set& associated_features) { base::FieldTrial* field_trial = CreateFieldTrialWithParams(trial_name, param_values); std::unique_ptr feature_list(new base::FeatureList); for (const std::string& feature_name : associated_features) { feature_list->RegisterFieldTrialOverride( feature_name, base::FeatureList::OverrideState::OVERRIDE_ENABLE_FEATURE, field_trial); } scoped_feature_list_->InitWithFeatureList(std::move(feature_list)); } void VariationParamsManager::ClearAllVariationIDs() { variations::testing::ClearAllVariationIDs(); } void VariationParamsManager::ClearAllVariationParams() { variations::testing::ClearAllVariationParams(); // When the scoped feature list is destroyed, it puts back the original // feature list that was there when InitWithFeatureList() was called. scoped_feature_list_.reset(new base::test::ScopedFeatureList()); // Ensure the destructor is called properly, so it can be freshly recreated. field_trial_list_.reset(); field_trial_list_ = base::MakeUnique(nullptr); } } // namespace testing } // namespace variations