/* * Copyright 2018 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 "rtc_base/experiments/quality_scaling_experiment.h" #include "test/field_trial.h" #include "test/gtest.h" namespace webrtc { namespace { void ExpectEqualSettings(QualityScalingExperiment::Settings a, QualityScalingExperiment::Settings b) { EXPECT_EQ(a.vp8_low, b.vp8_low); EXPECT_EQ(a.vp8_high, b.vp8_high); EXPECT_EQ(a.vp9_low, b.vp9_low); EXPECT_EQ(a.vp9_high, b.vp9_high); EXPECT_EQ(a.h264_low, b.h264_low); EXPECT_EQ(a.h264_high, b.h264_high); EXPECT_EQ(a.generic_low, b.generic_low); EXPECT_EQ(a.generic_high, b.generic_high); EXPECT_EQ(a.alpha_high, b.alpha_high); EXPECT_EQ(a.alpha_low, b.alpha_low); EXPECT_EQ(a.drop, b.drop); } void ExpectEqualConfig(QualityScalingExperiment::Config a, QualityScalingExperiment::Config b) { EXPECT_EQ(a.alpha_high, b.alpha_high); EXPECT_EQ(a.alpha_low, b.alpha_low); EXPECT_EQ(a.use_all_drop_reasons, b.use_all_drop_reasons); } } // namespace #if !defined(WEBRTC_IOS) // TODO(bugs.webrtc.org/12401): investigate why QualityScaler kicks in on iOS. TEST(QualityScalingExperimentTest, DefaultEnabledWithoutFieldTrial) { webrtc::test::ScopedFieldTrials field_trials(""); EXPECT_TRUE(QualityScalingExperiment::Enabled()); } #else TEST(QualityScalingExperimentTest, DefaultDisabledWithoutFieldTrialIOS) { webrtc::test::ScopedFieldTrials field_trials(""); EXPECT_FALSE(QualityScalingExperiment::Enabled()); } #endif TEST(QualityScalingExperimentTest, EnabledWithFieldTrial) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled/"); EXPECT_TRUE(QualityScalingExperiment::Enabled()); } TEST(QualityScalingExperimentTest, ParseSettings) { const QualityScalingExperiment::Settings kExpected = {1, 2, 3, 4, 5, 6, 7, 8, 0.9f, 0.99f, 1}; webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.9,0.99,1/"); const auto settings = QualityScalingExperiment::ParseSettings(); EXPECT_TRUE(settings); ExpectEqualSettings(kExpected, *settings); } #if !defined(WEBRTC_IOS) // TODO(bugs.webrtc.org/12401): investigate why QualityScaler kicks in on iOS. TEST(QualityScalingExperimentTest, ParseSettingsUsesDefaultsWithoutFieldTrial) { webrtc::test::ScopedFieldTrials field_trials(""); // Uses some default hard coded values. EXPECT_TRUE(QualityScalingExperiment::ParseSettings()); } #else TEST(QualityScalingExperimentTest, ParseSettingsFailsWithoutFieldTrial) { webrtc::test::ScopedFieldTrials field_trials(""); EXPECT_FALSE(QualityScalingExperiment::ParseSettings()); } #endif TEST(QualityScalingExperimentTest, ParseSettingsFailsWithInvalidFieldTrial) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-invalid/"); EXPECT_FALSE(QualityScalingExperiment::ParseSettings()); } TEST(QualityScalingExperimentTest, GetConfig) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.9,0.99,0/"); const auto config = QualityScalingExperiment::GetConfig(); EXPECT_EQ(0.9f, config.alpha_high); EXPECT_EQ(0.99f, config.alpha_low); EXPECT_FALSE(config.use_all_drop_reasons); } TEST(QualityScalingExperimentTest, GetsDefaultConfigForInvalidFieldTrial) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-invalid/"); const auto config = QualityScalingExperiment::GetConfig(); ExpectEqualConfig(config, QualityScalingExperiment::Config()); } TEST(QualityScalingExperimentTest, GetsDefaultAlphaForInvalidValue) { QualityScalingExperiment::Config expected_config; expected_config.use_all_drop_reasons = true; webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.99,0.9,1/"); const auto config = QualityScalingExperiment::GetConfig(); ExpectEqualConfig(config, expected_config); } TEST(QualityScalingExperimentTest, GetVp8Thresholds) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecVP8); EXPECT_TRUE(thresholds); EXPECT_EQ(1, thresholds->low); EXPECT_EQ(2, thresholds->high); } TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidVp8Value) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-0,0,3,4,5,6,7,8,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecVP8); EXPECT_FALSE(thresholds); } TEST(QualityScalingExperimentTest, GetVp9Thresholds) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecVP9); EXPECT_TRUE(thresholds); EXPECT_EQ(3, thresholds->low); EXPECT_EQ(4, thresholds->high); } TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidVp9Value) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,0,0,5,6,7,8,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecVP9); EXPECT_FALSE(thresholds); } TEST(QualityScalingExperimentTest, GetH264Thresholds) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecH264); EXPECT_TRUE(thresholds); EXPECT_EQ(5, thresholds->low); EXPECT_EQ(6, thresholds->high); } TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidH264Value) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,0,0,7,8,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecH264); EXPECT_FALSE(thresholds); } TEST(QualityScalingExperimentTest, GetGenericThresholds) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,0,0,7,8,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecGeneric); EXPECT_TRUE(thresholds); EXPECT_EQ(7, thresholds->low); EXPECT_EQ(8, thresholds->high); } TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidGenericValue) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/"); const auto thresholds = QualityScalingExperiment::GetQpThresholds(kVideoCodecGeneric); EXPECT_FALSE(thresholds); } } // namespace webrtc