diff --git a/rtc_base/experiments/field_trial_parser.cc b/rtc_base/experiments/field_trial_parser.cc index 5565c8648c..a2d7f97bde 100644 --- a/rtc_base/experiments/field_trial_parser.cc +++ b/rtc_base/experiments/field_trial_parser.cc @@ -82,7 +82,10 @@ absl::optional ParseTypedParameter(std::string str) { template <> absl::optional ParseTypedParameter(std::string str) { double value; - if (sscanf(str.c_str(), "%lf", &value) == 1) { + char unit[2]{0, 0}; + if (sscanf(str.c_str(), "%lf%1s", &value, unit) >= 1) { + if (unit[0] == '%') + return value / 100; return value; } else { return absl::nullopt; diff --git a/rtc_base/experiments/field_trial_parser_unittest.cc b/rtc_base/experiments/field_trial_parser_unittest.cc index 954909bce4..de977ec8ba 100644 --- a/rtc_base/experiments/field_trial_parser_unittest.cc +++ b/rtc_base/experiments/field_trial_parser_unittest.cc @@ -76,6 +76,15 @@ TEST(FieldTrialParserTest, CanHandleMixedInput) { EXPECT_EQ(exp.ping.Get(), true); EXPECT_EQ(exp.hash.Get(), ""); } +TEST(FieldTrialParserTest, ParsesDoubleParameter) { + FieldTrialParameter double_param("f", 0.0); + ParseFieldTrial({&double_param}, "f:45%"); + EXPECT_EQ(double_param.Get(), 0.45); + ParseFieldTrial({&double_param}, "f:34 %"); + EXPECT_EQ(double_param.Get(), 0.34); + ParseFieldTrial({&double_param}, "f:0.67"); + EXPECT_EQ(double_param.Get(), 0.67); +} TEST(FieldTrialParserTest, IgnoresNewKey) { DummyExperiment exp("Disabled,r:-11,foo"); EXPECT_FALSE(exp.enabled.Get());