| /* |
| * 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/congestion_controller_experiment.h" |
| #include "rtc_base/gunit.h" |
| #include "test/field_trial.h" |
| |
| namespace webrtc { |
| namespace { |
| void ExpectEquals(CongestionControllerExperiment::BbrExperimentConfig a, |
| CongestionControllerExperiment::BbrExperimentConfig b) { |
| EXPECT_EQ(a.exit_startup_on_loss, b.exit_startup_on_loss); |
| EXPECT_EQ(a.exit_startup_rtt_threshold_ms, b.exit_startup_rtt_threshold_ms); |
| EXPECT_EQ(a.fully_drain_queue, b.fully_drain_queue); |
| EXPECT_EQ(a.initial_conservation_in_startup, |
| b.initial_conservation_in_startup); |
| EXPECT_EQ(a.num_startup_rtts, b.num_startup_rtts); |
| EXPECT_EQ(a.probe_rtt_based_on_bdp, b.probe_rtt_based_on_bdp); |
| EXPECT_EQ(a.probe_rtt_disabled_if_app_limited, |
| b.probe_rtt_disabled_if_app_limited); |
| EXPECT_EQ(a.probe_rtt_skipped_if_similar_rtt, |
| b.probe_rtt_skipped_if_similar_rtt); |
| EXPECT_EQ(a.rate_based_recovery, b.rate_based_recovery); |
| EXPECT_EQ(a.rate_based_startup, b.rate_based_startup); |
| EXPECT_EQ(a.slower_startup, b.slower_startup); |
| EXPECT_EQ(a.encoder_rate_gain, b.encoder_rate_gain); |
| EXPECT_EQ(a.encoder_rate_gain_in_probe_rtt, b.encoder_rate_gain_in_probe_rtt); |
| EXPECT_EQ(a.max_ack_height_window_multiplier, |
| b.max_ack_height_window_multiplier); |
| EXPECT_EQ(a.max_aggregation_bytes_multiplier, |
| b.max_aggregation_bytes_multiplier); |
| EXPECT_EQ(a.probe_bw_pacing_gain_offset, b.probe_bw_pacing_gain_offset); |
| EXPECT_EQ(a.probe_rtt_congestion_window_gain, |
| b.probe_rtt_congestion_window_gain); |
| } |
| } // namespace |
| |
| TEST(CongestionControllerExperimentTest, BbrDisabledByDefault) { |
| webrtc::test::ScopedFieldTrials field_trials(""); |
| EXPECT_FALSE(CongestionControllerExperiment::BbrControllerEnabled()); |
| } |
| |
| TEST(CongestionControllerExperimentTest, BbrEnabledByFieldTrial) { |
| webrtc::test::ScopedFieldTrials field_trials( |
| "WebRTC-BweCongestionController/Enabled,BBR/"); |
| EXPECT_TRUE(CongestionControllerExperiment::BbrControllerEnabled()); |
| } |
| |
| TEST(CongestionControllerExperimentTest, BbrBadParametersFails) { |
| webrtc::test::ScopedFieldTrials field_trials( |
| "WebRTC-BweCongestionController/Enabled,BBR," |
| "garbage,here/"); |
| EXPECT_FALSE(CongestionControllerExperiment::GetBbrExperimentConfig()); |
| } |
| |
| TEST(CongestionControllerExperimentTest, BbrZeroParametersParsed) { |
| CongestionControllerExperiment::BbrExperimentConfig truth = { |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
| webrtc::test::ScopedFieldTrials field_trials( |
| "WebRTC-BweCongestionController/Enabled,BBR," |
| "0,0,0,0,0,0,0,0,0,0,0," |
| "0,0,0,0,0,0/"); |
| auto config = CongestionControllerExperiment::GetBbrExperimentConfig(); |
| EXPECT_TRUE(config); |
| if (config) |
| ExpectEquals(truth, *config); |
| } |
| |
| TEST(CongestionControllerExperimentTest, BbrNonZeroParametersParsed) { |
| CongestionControllerExperiment::BbrExperimentConfig truth = { |
| 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25}; |
| |
| webrtc::test::ScopedFieldTrials field_trials( |
| "WebRTC-BweCongestionController/Enabled,BBR," |
| "1,1,1,1,1,1,1,1,1,1,1," |
| "0.25,0.25,0.25,0.25,0.25,0.25/"); |
| auto config = CongestionControllerExperiment::GetBbrExperimentConfig(); |
| EXPECT_TRUE(config); |
| if (config) |
| ExpectEquals(truth, *config); |
| } |
| } // namespace webrtc |