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