blob: 5f0188e5576015d2b06940d117ccb3a017c9cd20 [file] [log] [blame]
Jonas Oreland128c4dc2022-03-30 07:57:48 +02001/*
2 * Copyright 2022 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
11#include "api/field_trials.h"
12
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020013#include <memory>
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020014#include <utility>
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020015
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020016#include "absl/strings/string_view.h"
Jonas Oreland128c4dc2022-03-30 07:57:48 +020017#include "api/transport/field_trial_based_config.h"
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020018#include "rtc_base/containers/flat_set.h"
Jonas Oreland128c4dc2022-03-30 07:57:48 +020019#include "system_wrappers/include/field_trial.h"
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020020#include "test/gmock.h"
Jonas Oreland128c4dc2022-03-30 07:57:48 +020021#include "test/gtest.h"
22
23#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
24#include "test/testsupport/rtc_expect_death.h"
25#endif // GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
26
27namespace webrtc {
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020028namespace {
Jonas Oreland128c4dc2022-03-30 07:57:48 +020029
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020030using ::testing::NotNull;
Emil Lundmark61deb0b2022-08-09 16:11:21 +020031using ::webrtc::field_trial::InitFieldTrialsFromString;
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020032using ::webrtc::field_trial::ScopedGlobalFieldTrialsForTesting;
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020033
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020034TEST(FieldTrialsTest, EmptyStringHasNoEffect) {
35 ScopedGlobalFieldTrialsForTesting g({"MyCoolTrial"});
Jonas Oreland128c4dc2022-03-30 07:57:48 +020036 FieldTrials f("");
37 EXPECT_FALSE(f.IsEnabled("MyCoolTrial"));
38 EXPECT_FALSE(f.IsDisabled("MyCoolTrial"));
39}
40
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020041TEST(FieldTrialsTest, EnabledDisabledMustBeFirstInValue) {
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020042 FieldTrials f(
43 "MyCoolTrial/EnabledFoo/"
44 "MyUncoolTrial/DisabledBar/"
45 "AnotherTrial/BazEnabled/");
Jonas Oreland128c4dc2022-03-30 07:57:48 +020046 EXPECT_TRUE(f.IsEnabled("MyCoolTrial"));
47 EXPECT_TRUE(f.IsDisabled("MyUncoolTrial"));
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020048 EXPECT_FALSE(f.IsEnabled("AnotherTrial"));
Jonas Oreland128c4dc2022-03-30 07:57:48 +020049}
50
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020051TEST(FieldTrialsTest, FieldTrialsDoesNotReadGlobalString) {
52 ScopedGlobalFieldTrialsForTesting g({"MyCoolTrial", "MyUncoolTrial"});
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020053 static constexpr char s[] = "MyCoolTrial/Enabled/MyUncoolTrial/Disabled/";
Emil Lundmark61deb0b2022-08-09 16:11:21 +020054 InitFieldTrialsFromString(s);
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020055 FieldTrials f("");
56 EXPECT_FALSE(f.IsEnabled("MyCoolTrial"));
57 EXPECT_FALSE(f.IsDisabled("MyUncoolTrial"));
Jonas Oreland128c4dc2022-03-30 07:57:48 +020058}
59
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020060TEST(FieldTrialsTest, FieldTrialsWritesGlobalString) {
61 ScopedGlobalFieldTrialsForTesting g({"MyCoolTrial", "MyUncoolTrial"});
Jonas Oreland128c4dc2022-03-30 07:57:48 +020062 FieldTrials f("MyCoolTrial/Enabled/MyUncoolTrial/Disabled/");
63 EXPECT_TRUE(webrtc::field_trial::IsEnabled("MyCoolTrial"));
64 EXPECT_TRUE(webrtc::field_trial::IsDisabled("MyUncoolTrial"));
65}
66
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020067TEST(FieldTrialsTest, FieldTrialsRestoresGlobalStringAfterDestruction) {
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020068 static constexpr char s[] = "SomeString/Enabled/";
Emil Lundmark61deb0b2022-08-09 16:11:21 +020069 InitFieldTrialsFromString(s);
Jonas Oreland128c4dc2022-03-30 07:57:48 +020070 {
71 FieldTrials f("SomeOtherString/Enabled/");
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020072 EXPECT_STREQ(webrtc::field_trial::GetFieldTrialString(),
73 "SomeOtherString/Enabled/");
Jonas Oreland128c4dc2022-03-30 07:57:48 +020074 }
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020075 EXPECT_STREQ(webrtc::field_trial::GetFieldTrialString(), s);
Jonas Oreland128c4dc2022-03-30 07:57:48 +020076}
77
78#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020079TEST(FieldTrialsTest, FieldTrialsDoesNotSupportSimultaneousInstances) {
Jonas Oreland128c4dc2022-03-30 07:57:48 +020080 FieldTrials f("SomeString/Enabled/");
81 RTC_EXPECT_DEATH(FieldTrials("SomeOtherString/Enabled/").Lookup("Whatever"),
82 "Only one instance");
83}
84#endif // GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
85
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020086TEST(FieldTrialsTest, FieldTrialsSupportsSeparateInstances) {
Jonas Oreland128c4dc2022-03-30 07:57:48 +020087 { FieldTrials f("SomeString/Enabled/"); }
88 { FieldTrials f("SomeOtherString/Enabled/"); }
89}
90
Emil Lundmark6bf20cc2022-09-21 15:20:22 +020091TEST(FieldTrialsTest, NonGlobalFieldTrialsInstanceDoesNotModifyGlobalString) {
92 ScopedGlobalFieldTrialsForTesting g({"SomeString"});
Emil Lundmark5fbe42a2022-06-30 16:50:55 +020093 std::unique_ptr<FieldTrials> f =
94 FieldTrials::CreateNoGlobal("SomeString/Enabled/");
95 ASSERT_THAT(f, NotNull());
96 EXPECT_TRUE(f->IsEnabled("SomeString"));
97 EXPECT_FALSE(webrtc::field_trial::IsEnabled("SomeString"));
Jonas Orelandf096e742022-05-31 11:15:19 +020098}
99
Emil Lundmark6bf20cc2022-09-21 15:20:22 +0200100TEST(FieldTrialsTest, NonGlobalFieldTrialsSupportSimultaneousInstances) {
Emil Lundmark5fbe42a2022-06-30 16:50:55 +0200101 std::unique_ptr<FieldTrials> f1 =
102 FieldTrials::CreateNoGlobal("SomeString/Enabled/");
103 std::unique_ptr<FieldTrials> f2 =
104 FieldTrials::CreateNoGlobal("SomeOtherString/Enabled/");
105 ASSERT_THAT(f1, NotNull());
106 ASSERT_THAT(f2, NotNull());
Jonas Orelandf096e742022-05-31 11:15:19 +0200107
108 EXPECT_TRUE(f1->IsEnabled("SomeString"));
109 EXPECT_FALSE(f1->IsEnabled("SomeOtherString"));
110
111 EXPECT_FALSE(f2->IsEnabled("SomeString"));
112 EXPECT_TRUE(f2->IsEnabled("SomeOtherString"));
113}
114
Emil Lundmark6bf20cc2022-09-21 15:20:22 +0200115TEST(FieldTrialsTest, GlobalAndNonGlobalFieldTrialsAreDisjoint) {
116 ScopedGlobalFieldTrialsForTesting g({"SomeString", "SomeOtherString"});
Emil Lundmark5fbe42a2022-06-30 16:50:55 +0200117 FieldTrials f1("SomeString/Enabled/");
118 std::unique_ptr<FieldTrials> f2 =
119 FieldTrials::CreateNoGlobal("SomeOtherString/Enabled/");
120 ASSERT_THAT(f2, NotNull());
Jonas Orelandf096e742022-05-31 11:15:19 +0200121
Emil Lundmark5fbe42a2022-06-30 16:50:55 +0200122 EXPECT_TRUE(f1.IsEnabled("SomeString"));
123 EXPECT_FALSE(f1.IsEnabled("SomeOtherString"));
Jonas Orelandf096e742022-05-31 11:15:19 +0200124
Emil Lundmark5fbe42a2022-06-30 16:50:55 +0200125 EXPECT_FALSE(f2->IsEnabled("SomeString"));
126 EXPECT_TRUE(f2->IsEnabled("SomeOtherString"));
Jonas Orelandf096e742022-05-31 11:15:19 +0200127}
128
Emil Lundmark6bf20cc2022-09-21 15:20:22 +0200129TEST(FieldTrialsTest, FieldTrialBasedConfigReadsGlobalString) {
130 ScopedGlobalFieldTrialsForTesting g({"MyCoolTrial", "MyUncoolTrial"});
Emil Lundmark5fbe42a2022-06-30 16:50:55 +0200131 static constexpr char s[] = "MyCoolTrial/Enabled/MyUncoolTrial/Disabled/";
Emil Lundmark61deb0b2022-08-09 16:11:21 +0200132 InitFieldTrialsFromString(s);
Emil Lundmark5fbe42a2022-06-30 16:50:55 +0200133 FieldTrialBasedConfig f;
134 EXPECT_TRUE(f.IsEnabled("MyCoolTrial"));
135 EXPECT_TRUE(f.IsDisabled("MyUncoolTrial"));
136}
137
138} // namespace
Jonas Oreland128c4dc2022-03-30 07:57:48 +0200139} // namespace webrtc