1 /*
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
11 #include "rtc_base/experiments/quality_scaling_experiment.h"
12
13 #include "test/field_trial.h"
14 #include "test/gtest.h"
15
16 namespace webrtc {
17 namespace {
ExpectEqualSettings(QualityScalingExperiment::Settings a,QualityScalingExperiment::Settings b)18 void ExpectEqualSettings(QualityScalingExperiment::Settings a,
19 QualityScalingExperiment::Settings b) {
20 EXPECT_EQ(a.vp8_low, b.vp8_low);
21 EXPECT_EQ(a.vp8_high, b.vp8_high);
22 EXPECT_EQ(a.vp9_low, b.vp9_low);
23 EXPECT_EQ(a.vp9_high, b.vp9_high);
24 EXPECT_EQ(a.h264_low, b.h264_low);
25 EXPECT_EQ(a.h264_high, b.h264_high);
26 EXPECT_EQ(a.generic_low, b.generic_low);
27 EXPECT_EQ(a.generic_high, b.generic_high);
28 EXPECT_EQ(a.alpha_high, b.alpha_high);
29 EXPECT_EQ(a.alpha_low, b.alpha_low);
30 EXPECT_EQ(a.drop, b.drop);
31 }
32
ExpectEqualConfig(QualityScalingExperiment::Config a,QualityScalingExperiment::Config b)33 void ExpectEqualConfig(QualityScalingExperiment::Config a,
34 QualityScalingExperiment::Config b) {
35 EXPECT_EQ(a.alpha_high, b.alpha_high);
36 EXPECT_EQ(a.alpha_low, b.alpha_low);
37 EXPECT_EQ(a.use_all_drop_reasons, b.use_all_drop_reasons);
38 }
39 } // namespace
40
TEST(QualityScalingExperimentTest,DisabledWithoutFieldTrial)41 TEST(QualityScalingExperimentTest, DisabledWithoutFieldTrial) {
42 webrtc::test::ScopedFieldTrials field_trials("");
43 EXPECT_FALSE(QualityScalingExperiment::Enabled());
44 }
45
TEST(QualityScalingExperimentTest,EnabledWithFieldTrial)46 TEST(QualityScalingExperimentTest, EnabledWithFieldTrial) {
47 webrtc::test::ScopedFieldTrials field_trials(
48 "WebRTC-Video-QualityScaling/Enabled/");
49 EXPECT_TRUE(QualityScalingExperiment::Enabled());
50 }
51
TEST(QualityScalingExperimentTest,ParseSettings)52 TEST(QualityScalingExperimentTest, ParseSettings) {
53 const QualityScalingExperiment::Settings kExpected = {1, 2, 3, 4, 5, 6,
54 7, 8, 0.9f, 0.99f, 1};
55 webrtc::test::ScopedFieldTrials field_trials(
56 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.9,0.99,1/");
57 const auto settings = QualityScalingExperiment::ParseSettings();
58 EXPECT_TRUE(settings);
59 ExpectEqualSettings(kExpected, *settings);
60 }
61
TEST(QualityScalingExperimentTest,ParseSettingsFailsWithoutFieldTrial)62 TEST(QualityScalingExperimentTest, ParseSettingsFailsWithoutFieldTrial) {
63 webrtc::test::ScopedFieldTrials field_trials("");
64 EXPECT_FALSE(QualityScalingExperiment::ParseSettings());
65 }
66
TEST(QualityScalingExperimentTest,ParseSettingsFailsWithInvalidFieldTrial)67 TEST(QualityScalingExperimentTest, ParseSettingsFailsWithInvalidFieldTrial) {
68 webrtc::test::ScopedFieldTrials field_trials(
69 "WebRTC-Video-QualityScaling/Enabled-invalid/");
70 EXPECT_FALSE(QualityScalingExperiment::ParseSettings());
71 }
72
TEST(QualityScalingExperimentTest,GetConfig)73 TEST(QualityScalingExperimentTest, GetConfig) {
74 webrtc::test::ScopedFieldTrials field_trials(
75 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.9,0.99,0/");
76 const auto config = QualityScalingExperiment::GetConfig();
77 EXPECT_EQ(0.9f, config.alpha_high);
78 EXPECT_EQ(0.99f, config.alpha_low);
79 EXPECT_FALSE(config.use_all_drop_reasons);
80 }
81
TEST(QualityScalingExperimentTest,GetsDefaultConfigForInvalidFieldTrial)82 TEST(QualityScalingExperimentTest, GetsDefaultConfigForInvalidFieldTrial) {
83 webrtc::test::ScopedFieldTrials field_trials(
84 "WebRTC-Video-QualityScaling/Enabled-invalid/");
85 const auto config = QualityScalingExperiment::GetConfig();
86 ExpectEqualConfig(config, QualityScalingExperiment::Config());
87 }
88
TEST(QualityScalingExperimentTest,GetsDefaultAlphaForInvalidValue)89 TEST(QualityScalingExperimentTest, GetsDefaultAlphaForInvalidValue) {
90 QualityScalingExperiment::Config expected_config;
91 expected_config.use_all_drop_reasons = true;
92 webrtc::test::ScopedFieldTrials field_trials(
93 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.99,0.9,1/");
94 const auto config = QualityScalingExperiment::GetConfig();
95 ExpectEqualConfig(config, expected_config);
96 }
97
TEST(QualityScalingExperimentTest,GetVp8Thresholds)98 TEST(QualityScalingExperimentTest, GetVp8Thresholds) {
99 webrtc::test::ScopedFieldTrials field_trials(
100 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
101 const auto thresholds =
102 QualityScalingExperiment::GetQpThresholds(kVideoCodecVP8);
103 EXPECT_TRUE(thresholds);
104 EXPECT_EQ(1, thresholds->low);
105 EXPECT_EQ(2, thresholds->high);
106 }
107
TEST(QualityScalingExperimentTest,GetThresholdsFailsForInvalidVp8Value)108 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidVp8Value) {
109 webrtc::test::ScopedFieldTrials field_trials(
110 "WebRTC-Video-QualityScaling/Enabled-0,0,3,4,5,6,7,8,0.9,0.99,1/");
111 const auto thresholds =
112 QualityScalingExperiment::GetQpThresholds(kVideoCodecVP8);
113 EXPECT_FALSE(thresholds);
114 }
115
TEST(QualityScalingExperimentTest,GetVp9Thresholds)116 TEST(QualityScalingExperimentTest, GetVp9Thresholds) {
117 webrtc::test::ScopedFieldTrials field_trials(
118 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
119 const auto thresholds =
120 QualityScalingExperiment::GetQpThresholds(kVideoCodecVP9);
121 EXPECT_TRUE(thresholds);
122 EXPECT_EQ(3, thresholds->low);
123 EXPECT_EQ(4, thresholds->high);
124 }
125
TEST(QualityScalingExperimentTest,GetThresholdsFailsForInvalidVp9Value)126 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidVp9Value) {
127 webrtc::test::ScopedFieldTrials field_trials(
128 "WebRTC-Video-QualityScaling/Enabled-1,2,0,0,5,6,7,8,0.9,0.99,1/");
129 const auto thresholds =
130 QualityScalingExperiment::GetQpThresholds(kVideoCodecVP9);
131 EXPECT_FALSE(thresholds);
132 }
133
TEST(QualityScalingExperimentTest,GetH264Thresholds)134 TEST(QualityScalingExperimentTest, GetH264Thresholds) {
135 webrtc::test::ScopedFieldTrials field_trials(
136 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
137 const auto thresholds =
138 QualityScalingExperiment::GetQpThresholds(kVideoCodecH264);
139 EXPECT_TRUE(thresholds);
140 EXPECT_EQ(5, thresholds->low);
141 EXPECT_EQ(6, thresholds->high);
142 }
143
TEST(QualityScalingExperimentTest,GetThresholdsFailsForInvalidH264Value)144 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidH264Value) {
145 webrtc::test::ScopedFieldTrials field_trials(
146 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,0,0,7,8,0.9,0.99,1/");
147 const auto thresholds =
148 QualityScalingExperiment::GetQpThresholds(kVideoCodecH264);
149 EXPECT_FALSE(thresholds);
150 }
151
TEST(QualityScalingExperimentTest,GetGenericThresholds)152 TEST(QualityScalingExperimentTest, GetGenericThresholds) {
153 webrtc::test::ScopedFieldTrials field_trials(
154 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,0,0,7,8,0.9,0.99,1/");
155 const auto thresholds =
156 QualityScalingExperiment::GetQpThresholds(kVideoCodecGeneric);
157 EXPECT_TRUE(thresholds);
158 EXPECT_EQ(7, thresholds->low);
159 EXPECT_EQ(8, thresholds->high);
160 }
161
TEST(QualityScalingExperimentTest,GetThresholdsFailsForInvalidGenericValue)162 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidGenericValue) {
163 webrtc::test::ScopedFieldTrials field_trials(
164 "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
165 const auto thresholds =
166 QualityScalingExperiment::GetQpThresholds(kVideoCodecGeneric);
167 EXPECT_FALSE(thresholds);
168 }
169 } // namespace webrtc
170