/* * Copyright (c) 2016 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 "modules/audio_coding/audio_network_adaptor/channel_controller.h" #include #include "test/gtest.h" namespace webrtc { namespace { constexpr int kNumChannels = 2; constexpr int kChannel1To2BandwidthBps = 31000; constexpr int kChannel2To1BandwidthBps = 29000; constexpr int kMediumBandwidthBps = (kChannel1To2BandwidthBps + kChannel2To1BandwidthBps) / 2; std::unique_ptr CreateChannelController(int init_channels) { std::unique_ptr controller( new ChannelController(ChannelController::Config( kNumChannels, init_channels, kChannel1To2BandwidthBps, kChannel2To1BandwidthBps))); return controller; } void CheckDecision(ChannelController* controller, const absl::optional& uplink_bandwidth_bps, size_t expected_num_channels) { if (uplink_bandwidth_bps) { Controller::NetworkMetrics network_metrics; network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps; controller->UpdateNetworkMetrics(network_metrics); } AudioEncoderRuntimeConfig config; controller->MakeDecision(&config); EXPECT_EQ(expected_num_channels, config.num_channels); } } // namespace TEST(ChannelControllerTest, OutputInitValueWhenUplinkBandwidthUnknown) { constexpr int kInitChannels = 2; auto controller = CreateChannelController(kInitChannels); CheckDecision(controller.get(), absl::nullopt, kInitChannels); } TEST(ChannelControllerTest, SwitchTo2ChannelsOnHighUplinkBandwidth) { constexpr int kInitChannels = 1; auto controller = CreateChannelController(kInitChannels); // Use high bandwidth to check output switch to 2. CheckDecision(controller.get(), kChannel1To2BandwidthBps, 2); } TEST(ChannelControllerTest, SwitchTo1ChannelOnLowUplinkBandwidth) { constexpr int kInitChannels = 2; auto controller = CreateChannelController(kInitChannels); // Use low bandwidth to check output switch to 1. CheckDecision(controller.get(), kChannel2To1BandwidthBps, 1); } TEST(ChannelControllerTest, Maintain1ChannelOnMediumUplinkBandwidth) { constexpr int kInitChannels = 1; auto controller = CreateChannelController(kInitChannels); // Use between-thresholds bandwidth to check output remains at 1. CheckDecision(controller.get(), kMediumBandwidthBps, 1); } TEST(ChannelControllerTest, Maintain2ChannelsOnMediumUplinkBandwidth) { constexpr int kInitChannels = 2; auto controller = CreateChannelController(kInitChannels); // Use between-thresholds bandwidth to check output remains at 2. CheckDecision(controller.get(), kMediumBandwidthBps, 2); } TEST(ChannelControllerTest, CheckBehaviorOnChangingUplinkBandwidth) { constexpr int kInitChannels = 1; auto controller = CreateChannelController(kInitChannels); // Use between-thresholds bandwidth to check output remains at 1. CheckDecision(controller.get(), kMediumBandwidthBps, 1); // Use high bandwidth to check output switch to 2. CheckDecision(controller.get(), kChannel1To2BandwidthBps, 2); // Use between-thresholds bandwidth to check output remains at 2. CheckDecision(controller.get(), kMediumBandwidthBps, 2); // Use low bandwidth to check output switch to 1. CheckDecision(controller.get(), kChannel2To1BandwidthBps, 1); } } // namespace webrtc