Index: webrtc/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc |
diff --git a/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc b/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc |
index 53a2c2ccbdd11dcad148467cdd944998c339ba2e..a6c8436847c2df0528586744e1dc3ab98ea2d847 100644 |
--- a/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc |
+++ b/webrtc/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
#include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h" |
#include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller.h" |
+#include "webrtc/system_wrappers/include/clock.h" |
namespace webrtc { |
@@ -20,16 +21,32 @@ using ::testing::NiceMock; |
namespace { |
-constexpr size_t kNumControllers = 3; |
+constexpr size_t kNumControllers = 4; |
+constexpr int kChracteristicBandwithBps[2] = {15000, 0}; |
+constexpr float kChracteristicPacketLossFraction[2] = {0.2f, 0.0f}; |
+constexpr int kMinReorderingTimeMs = 200; |
+constexpr int kFactor = 100; |
+constexpr float kMinReorderingSquareDistance = 1.0f / kFactor / kFactor; |
+ |
+// |kMinUplinkBandwidthBps| and |kMaxUplinkBandwidthBps| are copied from |
+// controller_manager.cc |
+constexpr int kMinUplinkBandwidthBps = 0; |
+constexpr int kMaxUplinkBandwidthBps = 120000; |
+constexpr int kMinBandwithChangeBps = |
+ (kMaxUplinkBandwidthBps - kMinUplinkBandwidthBps) / kFactor; |
+ |
+constexpr int64_t kClockInitialTime = 123456789; |
struct ControllerManagerStates { |
std::unique_ptr<ControllerManager> controller_manager; |
std::vector<MockController*> mock_controllers; |
+ std::unique_ptr<SimulatedClock> simulated_clock; |
}; |
ControllerManagerStates CreateControllerManager() { |
ControllerManagerStates states; |
std::vector<std::unique_ptr<Controller>> controllers; |
+ std::map<const Controller*, std::pair<int, float>> chracteristic_points; |
for (size_t i = 0; i < kNumControllers; ++i) { |
auto controller = |
std::unique_ptr<MockController>(new NiceMock<MockController>()); |
@@ -37,16 +54,53 @@ ControllerManagerStates CreateControllerManager() { |
states.mock_controllers.push_back(controller.get()); |
controllers.push_back(std::move(controller)); |
} |
+ |
+ // Assign characteristic points to the last two controllers. |
+ chracteristic_points[states.mock_controllers[kNumControllers - 2]] = |
+ std::make_pair(kChracteristicBandwithBps[0], |
+ kChracteristicPacketLossFraction[0]); |
+ chracteristic_points[states.mock_controllers[kNumControllers - 1]] = |
+ std::make_pair(kChracteristicBandwithBps[1], |
+ kChracteristicPacketLossFraction[1]); |
+ |
+ states.simulated_clock.reset(new SimulatedClock(kClockInitialTime)); |
states.controller_manager.reset(new ControllerManagerImpl( |
- ControllerManagerImpl::Config(), std::move(controllers))); |
+ ControllerManagerImpl::Config(kMinReorderingTimeMs, |
+ kMinReorderingSquareDistance, |
+ states.simulated_clock.get()), |
+ std::move(controllers), chracteristic_points)); |
return states; |
} |
+// |expected_order| contains the expected indices of all controllers in the |
+// vector of controllers returned by GetSortedControllers(). A negative index |
+// means that we do not care about its exact place, but we do check that it |
+// exists in the vector. |
+void CheckControllersOrder( |
+ ControllerManagerStates* states, |
+ const rtc::Optional<int>& uplink_bandwidth_bps, |
+ const rtc::Optional<float>& uplink_packet_loss_fraction, |
+ const std::vector<int>& expected_order) { |
+ RTC_DCHECK_EQ(kNumControllers, expected_order.size()); |
+ Controller::NetworkMetrics metrics; |
+ metrics.uplink_bandwidth_bps = uplink_bandwidth_bps; |
+ metrics.uplink_packet_loss_fraction = uplink_packet_loss_fraction; |
+ auto check = states->controller_manager->GetSortedControllers(metrics); |
+ EXPECT_EQ(states->mock_controllers.size(), check.size()); |
+ for (size_t i = 0; i < states->mock_controllers.size(); ++i) { |
+ if (expected_order[i] >= 0) { |
+ EXPECT_EQ(states->mock_controllers[i], check[expected_order[i]]); |
+ } else { |
+ EXPECT_NE(check.end(), std::find(check.begin(), check.end(), |
+ states->mock_controllers[i])); |
+ } |
+ } |
+} |
+ |
} // namespace |
TEST(ControllerManagerTest, GetControllersReturnAllControllers) { |
auto states = CreateControllerManager(); |
- |
auto check = states.controller_manager->GetControllers(); |
// Verify that controllers in |check| are one-to-one mapped to those in |
// |mock_controllers_|. |
@@ -59,14 +113,81 @@ TEST(ControllerManagerTest, GetControllersReturnAllControllers) { |
TEST(ControllerManagerTest, ControllersInDefaultOrderOnEmptyNetworkMetrics) { |
auto states = CreateControllerManager(); |
- |
// |network_metrics| are empty, and the controllers are supposed to follow the |
// default order. |
- Controller::NetworkMetrics network_metrics; |
- auto check = states.controller_manager->GetSortedControllers(network_metrics); |
- EXPECT_EQ(states.mock_controllers.size(), check.size()); |
- for (size_t i = 0; i < states.mock_controllers.size(); ++i) |
- EXPECT_EQ(states.mock_controllers[i], check[i]); |
+ CheckControllersOrder(&states, rtc::Optional<int>(), rtc::Optional<float>(), |
+ {0, 1, 2, 3}); |
+} |
+ |
+TEST(ControllerManagerTest, ControllersWithoutCharPointAtEndAndInDefaultOrder) { |
+ auto states = CreateControllerManager(); |
+ CheckControllersOrder(&states, rtc::Optional<int>(0), |
+ rtc::Optional<float>(0.0), |
+ {kNumControllers - 2, kNumControllers - 1, -1, -1}); |
+} |
+ |
+TEST(ControllerManagerTest, ControllersWithCharPointDependOnNetworkMetrics) { |
+ auto states = CreateControllerManager(); |
+ CheckControllersOrder( |
+ &states, rtc::Optional<int>(kChracteristicBandwithBps[1]), |
+ rtc::Optional<float>(kChracteristicPacketLossFraction[1]), |
+ {kNumControllers - 2, kNumControllers - 1, 1, 0}); |
+} |
+ |
+TEST(ControllerManagerTest, DoNotReorderBeforeMinReordingTime) { |
+ auto states = CreateControllerManager(); |
+ CheckControllersOrder( |
+ &states, rtc::Optional<int>(kChracteristicBandwithBps[0]), |
+ rtc::Optional<float>(kChracteristicPacketLossFraction[0]), |
+ {kNumControllers - 2, kNumControllers - 1, 0, 1}); |
+ states.simulated_clock->AdvanceTimeMilliseconds(kMinReorderingTimeMs - 1); |
+ // Move uplink bandwidth and packet loss fraction to the other controller's |
+ // characteristic point, which would cause controller manager to reorder the |
+ // controllers if time had reached min reordering time. |
+ CheckControllersOrder( |
+ &states, rtc::Optional<int>(kChracteristicBandwithBps[1]), |
+ rtc::Optional<float>(kChracteristicPacketLossFraction[1]), |
+ {kNumControllers - 2, kNumControllers - 1, 0, 1}); |
+} |
+ |
+TEST(ControllerManagerTest, ReorderBeyondMinReordingTimeAndMinDistance) { |
+ auto states = CreateControllerManager(); |
+ constexpr int kBandwidthBps = |
+ (kChracteristicBandwithBps[0] + kChracteristicBandwithBps[1]) / 2; |
+ constexpr float kPacketLossFraction = (kChracteristicPacketLossFraction[0] + |
+ kChracteristicPacketLossFraction[1]) / |
+ 2.0f; |
+ // Set network metrics to be in the middle between the characteristic points |
+ // of two controllers. |
+ CheckControllersOrder(&states, rtc::Optional<int>(kBandwidthBps), |
+ rtc::Optional<float>(kPacketLossFraction), |
+ {kNumControllers - 2, kNumControllers - 1, 0, 1}); |
+ states.simulated_clock->AdvanceTimeMilliseconds(kMinReorderingTimeMs); |
+ // Then let network metrics move a little towards the other controller. |
+ CheckControllersOrder( |
+ &states, rtc::Optional<int>(kBandwidthBps - kMinBandwithChangeBps - 1), |
+ rtc::Optional<float>(kPacketLossFraction), |
+ {kNumControllers - 2, kNumControllers - 1, 1, 0}); |
+} |
+ |
+TEST(ControllerManagerTest, DoNotReorderIfNetworkMetricsChangeTooSmall) { |
+ auto states = CreateControllerManager(); |
+ constexpr int kBandwidthBps = |
+ (kChracteristicBandwithBps[0] + kChracteristicBandwithBps[1]) / 2; |
+ constexpr float kPacketLossFraction = (kChracteristicPacketLossFraction[0] + |
+ kChracteristicPacketLossFraction[1]) / |
+ 2.0f; |
+ // Set network metrics to be in the middle between the characteristic points |
+ // of two controllers. |
+ CheckControllersOrder(&states, rtc::Optional<int>(kBandwidthBps), |
+ rtc::Optional<float>(kPacketLossFraction), |
+ {kNumControllers - 2, kNumControllers - 1, 0, 1}); |
+ states.simulated_clock->AdvanceTimeMilliseconds(kMinReorderingTimeMs); |
+ // Then let network metrics move a little towards the other controller. |
+ CheckControllersOrder( |
+ &states, rtc::Optional<int>(kBandwidthBps - kMinBandwithChangeBps + 1), |
+ rtc::Optional<float>(kPacketLossFraction), |
+ {kNumControllers - 2, kNumControllers - 1, 0, 1}); |
} |
} // namespace webrtc |