1 // Copyright 2017 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
5 #include "base/metrics/field_trial_params.h"
6
7 #include "base/feature_list.h"
8 #include "base/metrics/field_trial.h"
9 #include "base/metrics/field_trial_param_associator.h"
10 #include "base/strings/string_number_conversions.h"
11
12 namespace base {
13
AssociateFieldTrialParams(const std::string & trial_name,const std::string & group_name,const std::map<std::string,std::string> & params)14 bool AssociateFieldTrialParams(
15 const std::string& trial_name,
16 const std::string& group_name,
17 const std::map<std::string, std::string>& params) {
18 return base::FieldTrialParamAssociator::GetInstance()
19 ->AssociateFieldTrialParams(trial_name, group_name, params);
20 }
21
GetFieldTrialParams(const std::string & trial_name,std::map<std::string,std::string> * params)22 bool GetFieldTrialParams(const std::string& trial_name,
23 std::map<std::string, std::string>* params) {
24 return base::FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(
25 trial_name, params);
26 }
27
GetFieldTrialParamsByFeature(const base::Feature & feature,std::map<std::string,std::string> * params)28 bool GetFieldTrialParamsByFeature(const base::Feature& feature,
29 std::map<std::string, std::string>* params) {
30 if (!base::FeatureList::IsEnabled(feature))
31 return false;
32
33 base::FieldTrial* trial = base::FeatureList::GetFieldTrial(feature);
34 if (!trial)
35 return false;
36
37 return GetFieldTrialParams(trial->trial_name(), params);
38 }
39
GetFieldTrialParamValue(const std::string & trial_name,const std::string & param_name)40 std::string GetFieldTrialParamValue(const std::string& trial_name,
41 const std::string& param_name) {
42 std::map<std::string, std::string> params;
43 if (GetFieldTrialParams(trial_name, ¶ms)) {
44 std::map<std::string, std::string>::iterator it = params.find(param_name);
45 if (it != params.end())
46 return it->second;
47 }
48 return std::string();
49 }
50
GetFieldTrialParamValueByFeature(const base::Feature & feature,const std::string & param_name)51 std::string GetFieldTrialParamValueByFeature(const base::Feature& feature,
52 const std::string& param_name) {
53 if (!base::FeatureList::IsEnabled(feature))
54 return std::string();
55
56 base::FieldTrial* trial = base::FeatureList::GetFieldTrial(feature);
57 if (!trial)
58 return std::string();
59
60 return GetFieldTrialParamValue(trial->trial_name(), param_name);
61 }
62
GetFieldTrialParamByFeatureAsInt(const base::Feature & feature,const std::string & param_name,int default_value)63 int GetFieldTrialParamByFeatureAsInt(const base::Feature& feature,
64 const std::string& param_name,
65 int default_value) {
66 std::string value_as_string =
67 GetFieldTrialParamValueByFeature(feature, param_name);
68 int value_as_int = 0;
69 if (!base::StringToInt(value_as_string, &value_as_int)) {
70 if (!value_as_string.empty()) {
71 DLOG(WARNING) << "Failed to parse field trial param " << param_name
72 << " with string value " << value_as_string
73 << " under feature " << feature.name
74 << " into an int. Falling back to default value of "
75 << default_value;
76 }
77 value_as_int = default_value;
78 }
79 return value_as_int;
80 }
81
GetFieldTrialParamByFeatureAsDouble(const base::Feature & feature,const std::string & param_name,double default_value)82 double GetFieldTrialParamByFeatureAsDouble(const base::Feature& feature,
83 const std::string& param_name,
84 double default_value) {
85 std::string value_as_string =
86 GetFieldTrialParamValueByFeature(feature, param_name);
87 double value_as_double = 0;
88 if (!base::StringToDouble(value_as_string, &value_as_double)) {
89 if (!value_as_string.empty()) {
90 DLOG(WARNING) << "Failed to parse field trial param " << param_name
91 << " with string value " << value_as_string
92 << " under feature " << feature.name
93 << " into a double. Falling back to default value of "
94 << default_value;
95 }
96 value_as_double = default_value;
97 }
98 return value_as_double;
99 }
100
GetFieldTrialParamByFeatureAsBool(const base::Feature & feature,const std::string & param_name,bool default_value)101 bool GetFieldTrialParamByFeatureAsBool(const base::Feature& feature,
102 const std::string& param_name,
103 bool default_value) {
104 std::string value_as_string =
105 GetFieldTrialParamValueByFeature(feature, param_name);
106 if (value_as_string == "true")
107 return true;
108 if (value_as_string == "false")
109 return false;
110
111 if (!value_as_string.empty()) {
112 DLOG(WARNING) << "Failed to parse field trial param " << param_name
113 << " with string value " << value_as_string
114 << " under feature " << feature.name
115 << " into a bool. Falling back to default value of "
116 << default_value;
117 }
118 return default_value;
119 }
120
Get() const121 std::string FeatureParam<std::string>::Get() const {
122 const std::string value = GetFieldTrialParamValueByFeature(*feature, name);
123 return value.empty() ? default_value : value;
124 }
125
Get() const126 double FeatureParam<double>::Get() const {
127 return GetFieldTrialParamByFeatureAsDouble(*feature, name, default_value);
128 }
129
Get() const130 int FeatureParam<int>::Get() const {
131 return GetFieldTrialParamByFeatureAsInt(*feature, name, default_value);
132 }
133
Get() const134 bool FeatureParam<bool>::Get() const {
135 return GetFieldTrialParamByFeatureAsBool(*feature, name, default_value);
136 }
137
LogInvalidEnumValue(const base::Feature & feature,const std::string & param_name,const std::string & value_as_string,int default_value_as_int)138 void LogInvalidEnumValue(const base::Feature& feature,
139 const std::string& param_name,
140 const std::string& value_as_string,
141 int default_value_as_int) {
142 DLOG(WARNING) << "Failed to parse field trial param " << param_name
143 << " with string value " << value_as_string << " under feature "
144 << feature.name
145 << " into an enum. Falling back to default value of "
146 << default_value_as_int;
147 }
148
149 } // namespace base
150