blob: de977ec8ba809722030408d6597f57bac14ecbdc [file] [log] [blame]
Sebastian Jansson9eb38862018-06-14 16:47:42 +02001/*
2 * Copyright 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#include "rtc_base/experiments/field_trial_parser.h"
11#include "rtc_base/gunit.h"
12#include "system_wrappers/include/field_trial.h"
13#include "test/field_trial.h"
14
15namespace webrtc {
16namespace {
17const char kDummyExperiment[] = "WebRTC-DummyExperiment";
18
19struct DummyExperiment {
20 FieldTrialFlag enabled = FieldTrialFlag("Enabled");
21 FieldTrialParameter<double> factor = FieldTrialParameter<double>("f", 0.5);
22 FieldTrialParameter<int> retries = FieldTrialParameter<int>("r", 5);
23 FieldTrialParameter<bool> ping = FieldTrialParameter<bool>("p", 0);
24 FieldTrialParameter<std::string> hash =
25 FieldTrialParameter<std::string>("h", "a80");
26
27 explicit DummyExperiment(std::string field_trial) {
28 ParseFieldTrial({&enabled, &factor, &retries, &ping, &hash}, field_trial);
29 }
30 DummyExperiment() {
31 std::string trial_string = field_trial::FindFullName(kDummyExperiment);
32 ParseFieldTrial({&enabled, &factor, &retries, &ping, &hash}, trial_string);
33 }
34};
35
36enum class CustomEnum {
Sebastian Jansson2c74d852018-06-26 10:30:16 +020037 kDefault = 0,
38 kRed = 1,
39 kBlue = 2,
Sebastian Jansson9eb38862018-06-14 16:47:42 +020040};
41} // namespace
42
Sebastian Jansson9eb38862018-06-14 16:47:42 +020043TEST(FieldTrialParserTest, ParsesValidParameters) {
44 DummyExperiment exp("Enabled,f:-1.7,r:2,p:1,h:x7c");
45 EXPECT_TRUE(exp.enabled.Get());
46 EXPECT_EQ(exp.factor.Get(), -1.7);
47 EXPECT_EQ(exp.retries.Get(), 2);
48 EXPECT_EQ(exp.ping.Get(), true);
49 EXPECT_EQ(exp.hash.Get(), "x7c");
50}
51TEST(FieldTrialParserTest, InitializesFromFieldTrial) {
52 test::ScopedFieldTrials field_trials(
53 "WebRTC-OtherExperiment/Disabled/"
54 "WebRTC-DummyExperiment/Enabled,f:-1.7,r:2,p:1,h:x7c/"
55 "WebRTC-AnotherExperiment/Enabled,f:-3.1,otherstuff:beef/");
56 DummyExperiment exp;
57 EXPECT_TRUE(exp.enabled.Get());
58 EXPECT_EQ(exp.factor.Get(), -1.7);
59 EXPECT_EQ(exp.retries.Get(), 2);
60 EXPECT_EQ(exp.ping.Get(), true);
61 EXPECT_EQ(exp.hash.Get(), "x7c");
62}
63TEST(FieldTrialParserTest, UsesDefaults) {
64 DummyExperiment exp("");
65 EXPECT_FALSE(exp.enabled.Get());
66 EXPECT_EQ(exp.factor.Get(), 0.5);
67 EXPECT_EQ(exp.retries.Get(), 5);
68 EXPECT_EQ(exp.ping.Get(), false);
69 EXPECT_EQ(exp.hash.Get(), "a80");
70}
71TEST(FieldTrialParserTest, CanHandleMixedInput) {
72 DummyExperiment exp("p:true,h:,Enabled");
73 EXPECT_TRUE(exp.enabled.Get());
74 EXPECT_EQ(exp.factor.Get(), 0.5);
75 EXPECT_EQ(exp.retries.Get(), 5);
76 EXPECT_EQ(exp.ping.Get(), true);
77 EXPECT_EQ(exp.hash.Get(), "");
78}
Sebastian Janssonec764662018-09-03 11:31:26 +020079TEST(FieldTrialParserTest, ParsesDoubleParameter) {
80 FieldTrialParameter<double> double_param("f", 0.0);
81 ParseFieldTrial({&double_param}, "f:45%");
82 EXPECT_EQ(double_param.Get(), 0.45);
83 ParseFieldTrial({&double_param}, "f:34 %");
84 EXPECT_EQ(double_param.Get(), 0.34);
85 ParseFieldTrial({&double_param}, "f:0.67");
86 EXPECT_EQ(double_param.Get(), 0.67);
87}
Sebastian Jansson9eb38862018-06-14 16:47:42 +020088TEST(FieldTrialParserTest, IgnoresNewKey) {
89 DummyExperiment exp("Disabled,r:-11,foo");
90 EXPECT_FALSE(exp.enabled.Get());
91 EXPECT_EQ(exp.factor.Get(), 0.5);
92 EXPECT_EQ(exp.retries.Get(), -11);
93}
94TEST(FieldTrialParserTest, IgnoresInvalid) {
95 DummyExperiment exp("Enabled,f,p:,r:%,,:foo,h");
96 EXPECT_TRUE(exp.enabled.Get());
97 EXPECT_EQ(exp.factor.Get(), 0.5);
98 EXPECT_EQ(exp.retries.Get(), 5);
99 EXPECT_EQ(exp.ping.Get(), false);
100 EXPECT_EQ(exp.hash.Get(), "a80");
101}
102TEST(FieldTrialParserTest, ParsesOptionalParameters) {
Danil Chapovalov0a1d1892018-06-21 11:48:25 +0200103 FieldTrialOptional<int> max_count("c", absl::nullopt);
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200104 ParseFieldTrial({&max_count}, "");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200105 EXPECT_FALSE(max_count.GetOptional().has_value());
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200106 ParseFieldTrial({&max_count}, "c:10");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200107 EXPECT_EQ(max_count.GetOptional().value(), 10);
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200108 ParseFieldTrial({&max_count}, "c");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200109 EXPECT_FALSE(max_count.GetOptional().has_value());
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200110 ParseFieldTrial({&max_count}, "c:20");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200111 EXPECT_EQ(max_count.GetOptional().value(), 20);
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200112 ParseFieldTrial({&max_count}, "c:");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200113 EXPECT_EQ(max_count.GetOptional().value(), 20);
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200114 FieldTrialOptional<std::string> optional_string("s", std::string("ab"));
115 ParseFieldTrial({&optional_string}, "s:");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200116 EXPECT_EQ(optional_string.GetOptional().value(), "");
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200117 ParseFieldTrial({&optional_string}, "s");
Sebastian Janssonfea46372018-09-03 10:15:13 +0200118 EXPECT_FALSE(optional_string.GetOptional().has_value());
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200119}
120TEST(FieldTrialParserTest, ParsesCustomEnumParameter) {
Sebastian Jansson2c74d852018-06-26 10:30:16 +0200121 FieldTrialEnum<CustomEnum> my_enum("e", CustomEnum::kDefault,
122 {{"default", CustomEnum::kDefault},
123 {"red", CustomEnum::kRed},
124 {"blue", CustomEnum::kBlue}});
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200125 ParseFieldTrial({&my_enum}, "");
126 EXPECT_EQ(my_enum.Get(), CustomEnum::kDefault);
127 ParseFieldTrial({&my_enum}, "e:red");
128 EXPECT_EQ(my_enum.Get(), CustomEnum::kRed);
Sebastian Jansson2c74d852018-06-26 10:30:16 +0200129 ParseFieldTrial({&my_enum}, "e:2");
130 EXPECT_EQ(my_enum.Get(), CustomEnum::kBlue);
131 ParseFieldTrial({&my_enum}, "e:5");
132 EXPECT_EQ(my_enum.Get(), CustomEnum::kBlue);
Sebastian Jansson9eb38862018-06-14 16:47:42 +0200133}
134} // namespace webrtc