From d69998aa5c4f781aa08efed3bafe0a4e25f38338 Mon Sep 17 00:00:00 2001 From: Sebastian Jansson Date: Thu, 20 Dec 2018 12:25:19 +0100 Subject: [PATCH] Adds support for empty key fields in field trial parser. Bug: webrtc:9346 Change-Id: I16e068340d3d48b983270af0c481ed538632e148 Reviewed-on: https://webrtc-review.googlesource.com/c/115241 Reviewed-by: Christoffer Rodbro Commit-Queue: Sebastian Jansson Cr-Commit-Position: refs/heads/master@{#26070} --- rtc_base/experiments/field_trial_parser.cc | 13 ++++++++++++- rtc_base/experiments/field_trial_parser.h | 2 +- rtc_base/experiments/field_trial_parser_unittest.cc | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/rtc_base/experiments/field_trial_parser.cc b/rtc_base/experiments/field_trial_parser.cc index 936487cb01..f823b48e53 100644 --- a/rtc_base/experiments/field_trial_parser.cc +++ b/rtc_base/experiments/field_trial_parser.cc @@ -41,9 +41,15 @@ void ParseFieldTrial( std::initializer_list fields, std::string trial_string) { std::map field_map; + FieldTrialParameterInterface* keyless_field = nullptr; for (FieldTrialParameterInterface* field : fields) { field->MarkAsUsed(); - field_map[field->Key()] = field; + if (field->Key().empty()) { + RTC_DCHECK(!keyless_field); + keyless_field = field; + } else { + field_map[field->Key()] = field; + } } size_t i = 0; while (i < trial_string.length()) { @@ -62,6 +68,11 @@ void ParseFieldTrial( RTC_LOG(LS_WARNING) << "Failed to read field with key: '" << key << "' in trial: \"" << trial_string << "\""; } + } else if (!opt_value && keyless_field && !key.empty()) { + if (!keyless_field->Parse(key)) { + RTC_LOG(LS_WARNING) << "Failed to read empty key field with value '" + << key << "' in trial: \"" << trial_string << "\""; + } } else { RTC_LOG(LS_INFO) << "No field with key: '" << key << "' (found in trial: \"" << trial_string << "\")"; diff --git a/rtc_base/experiments/field_trial_parser.h b/rtc_base/experiments/field_trial_parser.h index 8bdd9b5d8e..0330f1970a 100644 --- a/rtc_base/experiments/field_trial_parser.h +++ b/rtc_base/experiments/field_trial_parser.h @@ -55,7 +55,7 @@ class FieldTrialParameterInterface { }; // ParseFieldTrial function parses the given string and fills the given fields -// with extrated values if available. +// with extracted values if available. void ParseFieldTrial( std::initializer_list fields, std::string raw_string); diff --git a/rtc_base/experiments/field_trial_parser_unittest.cc b/rtc_base/experiments/field_trial_parser_unittest.cc index 0d067f5a49..806b895e5f 100644 --- a/rtc_base/experiments/field_trial_parser_unittest.cc +++ b/rtc_base/experiments/field_trial_parser_unittest.cc @@ -112,6 +112,14 @@ TEST(FieldTrialParserTest, IgnoresOutOfRange) { EXPECT_EQ(low.Get(), 20); EXPECT_EQ(high.Get(), 20); } +TEST(FieldTrialParserTest, ReadsValuesFromFieldWithoutKey) { + FieldTrialFlag enabled("Enabled"); + FieldTrialParameter req("", 10); + ParseFieldTrial({&enabled, &req}, "Enabled,20"); + EXPECT_EQ(req.Get(), 20); + ParseFieldTrial({&req}, "30"); + EXPECT_EQ(req.Get(), 30); +} TEST(FieldTrialParserTest, ParsesOptionalParameters) { FieldTrialOptional max_count("c", absl::nullopt); ParseFieldTrial({&max_count}, "");