variations_params_manager.cc 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/variations/variations_params_manager.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/base_switches.h"
  8. #include "base/feature_list.h"
  9. #include "base/metrics/field_trial.h"
  10. #include "base/test/scoped_feature_list.h"
  11. #include "components/variations/field_trial_config/field_trial_util.h"
  12. #include "components/variations/variations_associated_data.h"
  13. #include "components/variations/variations_switches.h"
  14. namespace variations {
  15. namespace testing {
  16. namespace {
  17. // The fixed testing group created in the provided trail when setting up params.
  18. const char kGroupTesting[] = "Testing";
  19. base::FieldTrial* CreateFieldTrialWithParams(
  20. const std::string& trial_name,
  21. const std::map<std::string, std::string>& param_values) {
  22. AssociateVariationParams(trial_name, kGroupTesting, param_values);
  23. return base::FieldTrialList::CreateFieldTrial(trial_name, kGroupTesting);
  24. }
  25. } // namespace
  26. VariationParamsManager::VariationParamsManager()
  27. : scoped_feature_list_(new base::test::ScopedFeatureList()) {
  28. scoped_feature_list_->InitWithEmptyFeatureAndFieldTrialLists();
  29. }
  30. VariationParamsManager::VariationParamsManager(
  31. const std::string& trial_name,
  32. const std::map<std::string, std::string>& param_values)
  33. : VariationParamsManager() {
  34. SetVariationParams(trial_name, param_values);
  35. }
  36. VariationParamsManager::VariationParamsManager(
  37. const std::string& trial_name,
  38. const std::map<std::string, std::string>& param_values,
  39. const std::set<std::string>& associated_features)
  40. : VariationParamsManager() {
  41. SetVariationParamsWithFeatureAssociations(trial_name, param_values,
  42. associated_features);
  43. }
  44. VariationParamsManager::~VariationParamsManager() {
  45. ClearAllVariationIDs();
  46. ClearAllVariationParams();
  47. }
  48. void VariationParamsManager::SetVariationParams(
  49. const std::string& trial_name,
  50. const std::map<std::string, std::string>& param_values) {
  51. CreateFieldTrialWithParams(trial_name, param_values);
  52. }
  53. void VariationParamsManager::SetVariationParamsWithFeatureAssociations(
  54. const std::string& trial_name,
  55. const std::map<std::string, std::string>& param_values,
  56. const std::set<std::string>& associated_features) {
  57. scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>();
  58. base::FieldTrial* field_trial =
  59. CreateFieldTrialWithParams(trial_name, param_values);
  60. std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
  61. for (const std::string& feature_name : associated_features) {
  62. feature_list->RegisterFieldTrialOverride(
  63. feature_name,
  64. base::FeatureList::OverrideState::OVERRIDE_ENABLE_FEATURE,
  65. field_trial);
  66. }
  67. scoped_feature_list_->InitWithFeatureList(std::move(feature_list));
  68. }
  69. void VariationParamsManager::ClearAllVariationIDs() {
  70. testing::ClearAllVariationIDs();
  71. }
  72. void VariationParamsManager::ClearAllVariationParams() {
  73. testing::ClearAllVariationParams();
  74. // When the scoped feature list is destroyed, it puts back the original
  75. // feature list that was there when InitWithFeatureList() was called.
  76. scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>();
  77. scoped_feature_list_->InitWithEmptyFeatureAndFieldTrialLists();
  78. }
  79. // static
  80. void VariationParamsManager::AppendVariationParams(
  81. const std::string& trial_name,
  82. const std::string& trial_group_name,
  83. const std::map<std::string, std::string>& param_values,
  84. base::CommandLine* command_line) {
  85. // Register the trial group.
  86. command_line->AppendSwitchASCII(
  87. ::switches::kForceFieldTrials,
  88. EscapeValue(trial_name) + "/" + EscapeValue(trial_group_name));
  89. // Associate |param_values| with the trial group.
  90. std::string params_arg =
  91. EscapeValue(trial_name) + "." + EscapeValue(trial_group_name) + ":";
  92. bool first = true;
  93. for (const auto& param : param_values) {
  94. // Separate each |param|.
  95. if (!first)
  96. params_arg += "/";
  97. first = false;
  98. // Append each |param|.
  99. const std::string& name = param.first;
  100. const std::string& value = param.second;
  101. params_arg += EscapeValue(name) + "/" + EscapeValue(value);
  102. }
  103. command_line->AppendSwitchASCII(variations::switches::kForceFieldTrialParams,
  104. params_arg);
  105. }
  106. } // namespace testing
  107. } // namespace variations