| // 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 <utility> |
| |
| #include "base/base_switches.h" |
| #include "base/feature_list.h" |
| #include "base/metrics/field_trial.h" |
| #include "base/test/scoped_feature_list.h" |
| #include "components/variations/field_trial_config/field_trial_util.h" |
| #include "components/variations/variations_associated_data.h" |
| #include "components/variations/variations_switches.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<std::string, std::string>& param_values) { |
| 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<std::string, std::string>& param_values) |
| : VariationParamsManager() { |
| SetVariationParams(trial_name, param_values); |
| } |
| |
| VariationParamsManager::VariationParamsManager( |
| const std::string& trial_name, |
| const std::map<std::string, std::string>& param_values, |
| const std::set<std::string>& 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<std::string, std::string>& param_values) { |
| CreateFieldTrialWithParams(trial_name, param_values); |
| } |
| |
| void VariationParamsManager::SetVariationParamsWithFeatureAssociations( |
| const std::string& trial_name, |
| const std::map<std::string, std::string>& param_values, |
| const std::set<std::string>& associated_features) { |
| base::FieldTrial* field_trial = |
| CreateFieldTrialWithParams(trial_name, param_values); |
| |
| std::unique_ptr<base::FeatureList> 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() { |
| testing::ClearAllVariationIDs(); |
| } |
| |
| void VariationParamsManager::ClearAllVariationParams() { |
| 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_ = std::make_unique<base::FieldTrialList>(nullptr); |
| } |
| |
| // static |
| void VariationParamsManager::AppendVariationParams( |
| const std::string& trial_name, |
| const std::string& trial_group_name, |
| const std::map<std::string, std::string>& param_values, |
| base::CommandLine* command_line) { |
| // Register the trial group. |
| command_line->AppendSwitchASCII( |
| ::switches::kForceFieldTrials, |
| EscapeValue(trial_name) + "/" + EscapeValue(trial_group_name)); |
| |
| // Associate |param_values| with the trial group. |
| std::string params_arg = |
| EscapeValue(trial_name) + "." + EscapeValue(trial_group_name) + ":"; |
| bool first = true; |
| for (const auto& param : param_values) { |
| // Separate each |param|. |
| if (!first) |
| params_arg += "/"; |
| first = false; |
| |
| // Append each |param|. |
| const std::string& name = param.first; |
| const std::string& value = param.second; |
| params_arg += EscapeValue(name) + "/" + EscapeValue(value); |
| } |
| command_line->AppendSwitchASCII(variations::switches::kForceFieldTrialParams, |
| params_arg); |
| } |
| |
| } // namespace testing |
| } // namespace variations |