xref: /aosp_15_r20/external/libchrome/base/metrics/field_trial_params.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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, &params)) {
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