Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Unified Diff: webrtc/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc

Issue 2349113002: Adding reordering logic in audio network adaptor. (Closed)
Patch Set: On Henrik's comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698