blob: e27ab4e628ecd383279c7d5fa3a5b4e594b8ad95 [file] [log] [blame] [edit]
/*
* Copyright 2022 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "api/field_trials.h"
#include "absl/strings/str_cat.h"
#include "rtc_base/containers/flat_set.h"
#include "test/gmock.h"
#include "test/gtest.h"
namespace webrtc {
namespace {
using ::testing::AllOf;
using ::testing::HasSubstr;
using ::testing::IsNull;
using ::testing::Not;
using ::testing::NotNull;
TEST(FieldTrialsTest, EmptyStringHasNoEffect) {
FieldTrials f("");
f.RegisterKeysForTesting({"MyCoolTrial"});
EXPECT_FALSE(f.IsEnabled("MyCoolTrial"));
EXPECT_FALSE(f.IsDisabled("MyCoolTrial"));
}
TEST(FieldTrialsTest, EnabledDisabledMustBeFirstInValue) {
FieldTrials f(
"MyCoolTrial/EnabledFoo/"
"MyUncoolTrial/DisabledBar/"
"AnotherTrial/BazEnabled/");
f.RegisterKeysForTesting({"MyCoolTrial", "MyUncoolTrial", "AnotherTrial"});
EXPECT_TRUE(f.IsEnabled("MyCoolTrial"));
EXPECT_TRUE(f.IsDisabled("MyUncoolTrial"));
EXPECT_FALSE(f.IsEnabled("AnotherTrial"));
}
TEST(FieldTrialsTest, FieldTrialsSupportSimultaneousInstances) {
FieldTrials f1("SomeString/Enabled/");
FieldTrials f2("SomeOtherString/Enabled/");
f1.RegisterKeysForTesting({"SomeString", "SomeOtherString"});
f2.RegisterKeysForTesting({"SomeString", "SomeOtherString"});
EXPECT_TRUE(f1.IsEnabled("SomeString"));
EXPECT_FALSE(f1.IsEnabled("SomeOtherString"));
EXPECT_FALSE(f2.IsEnabled("SomeString"));
EXPECT_TRUE(f2.IsEnabled("SomeOtherString"));
}
TEST(FieldTrialsTest, CreateAcceptsValidInputs) {
EXPECT_THAT(FieldTrials::Create(""), NotNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/"), NotNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Video/Disabled/"), NotNull());
// Duplicate trials with the same value is fine
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Audio/Enabled/"), NotNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/B/C/Audio/Enabled/"),
NotNull());
}
TEST(FieldTrialsTest, CreateRejectsBadInputs) {
// Bad delimiters
EXPECT_THAT(FieldTrials::Create("Audio/EnabledVideo/Disabled/"), IsNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled//Video/Disabled/"), IsNull());
EXPECT_THAT(FieldTrials::Create("/Audio/Enabled/Video/Disabled/"), IsNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Video/Disabled"), IsNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Video/Disabled/garbage"),
IsNull());
// Empty trial or group
EXPECT_THAT(FieldTrials::Create("Audio//"), IsNull());
EXPECT_THAT(FieldTrials::Create("/Enabled/"), IsNull());
EXPECT_THAT(FieldTrials::Create("//"), IsNull());
EXPECT_THAT(FieldTrials::Create("//Enabled"), IsNull());
// Duplicate trials with different values is not fine
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Audio/Disabled/"), IsNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/B/C/Audio/Disabled/"),
IsNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Audio/Disabled/"), IsNull());
EXPECT_THAT(FieldTrials::Create("Audio/Enabled/B/C/Audio/Disabled/"),
IsNull());
}
TEST(FieldTrialsTest, StringfiyMentionsKeysAndValues) {
// Exact format of the stringification is undefined.
EXPECT_THAT(absl::StrCat(FieldTrials("Audio/Enabled/Video/Value/")),
AllOf(HasSubstr("Audio"), HasSubstr("Enabled"),
HasSubstr("Video"), HasSubstr("Value")));
}
TEST(FieldTrialsTest, MergeCombinesFieldTrials) {
FieldTrials f("Video/Value1/");
FieldTrials other("Audio/Value2/");
f.Merge(other);
f.RegisterKeysForTesting({"Audio", "Video"});
EXPECT_EQ(f.Lookup("Video"), "Value1");
EXPECT_EQ(f.Lookup("Audio"), "Value2");
}
TEST(FieldTrialsTest, MergeGivesPrecedenceToOther) {
FieldTrials f("Audio/Disabled/Video/Enabled/");
FieldTrials other("Audio/Enabled/");
f.Merge(other);
f.RegisterKeysForTesting({"Audio"});
EXPECT_EQ(f.Lookup("Audio"), "Enabled");
}
TEST(FieldTrialsTest, MergeDoesntChangeTrialAbsentInOther) {
FieldTrials f("Audio/Enabled/Video/Enabled/");
FieldTrials other("Audio/Enabled/");
f.Merge(other);
f.RegisterKeysForTesting({"Video"});
EXPECT_EQ(f.Lookup("Video"), "Enabled");
}
TEST(FieldTrialsTest, SetUpdatesTrial) {
FieldTrials f("Audio/Enabled/Video/Enabled/");
f.Set("Audio", "Disabled");
f.RegisterKeysForTesting({"Audio"});
EXPECT_EQ(f.Lookup("Audio"), "Disabled");
}
TEST(FieldTrialsTest, SettingEmptyValueRemovesFieldTrial) {
FieldTrials f("Audio/Enabled/Video/Enabled/");
f.Set("Audio", "");
f.RegisterKeysForTesting({"Audio"});
EXPECT_EQ(f.Lookup("Audio"), "");
EXPECT_THAT(absl::StrCat(f), Not(HasSubstr("Audio")));
// Absent field trials shouldn't override previous value during merge.
FieldTrials f2("Audio/Disabled/");
f2.Merge(f);
f2.RegisterKeysForTesting({"Audio"});
EXPECT_EQ(f2.Lookup("Audio"), "Disabled");
}
} // namespace
} // namespace webrtc