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

Unified Diff: webrtc/modules/pacing/packet_router_unittest.cc

Issue 2973363002: Explicitly inform PacketRouter which RTP-RTCP modules are REMB-candidates (Closed)
Patch Set: Unit-tests added. Created 3 years, 5 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/pacing/packet_router_unittest.cc
diff --git a/webrtc/modules/pacing/packet_router_unittest.cc b/webrtc/modules/pacing/packet_router_unittest.cc
index e7f08ca9b5b51684e898a34ab611bcf9519dac3d..f9943cee015c4bcd59f4773fc7b2acb48051534f 100644
--- a/webrtc/modules/pacing/packet_router_unittest.cc
+++ b/webrtc/modules/pacing/packet_router_unittest.cc
@@ -23,25 +23,99 @@
using ::testing::_;
using ::testing::AnyNumber;
using ::testing::Field;
+using ::testing::Invoke;
using ::testing::NiceMock;
using ::testing::Return;
namespace webrtc {
+// TODO(eladalon): Restructure and/or replace the existing monolithic tests
+// (only some of the test are monolithic) according to the new
+// guidelines - small tests for one thing at a time.
+// (I'm not removing any tests during CL, so as to demonstrate no regressions.)
+
+void ExpectSetREMBStatusAndSetRembAccordingly(MockRtpRtcp* mock_rtp_rtcp,
+ bool remb_state) {
+ EXPECT_CALL(*mock_rtp_rtcp, SetREMBStatus(remb_state))
+ .Times(1)
+ .WillOnce(Invoke([mock_rtp_rtcp](bool state) {
+ ON_CALL(*mock_rtp_rtcp, REMB()).WillByDefault(Return(state));
+ }));
+}
+
+// Same as the Expect* version, but without the expectation. Note that this
+// does not mix well with Expect*.
+void OnSetREMBStatusAndSetRembAccordingly(MockRtpRtcp* mock_rtp_rtcp) {
+ ON_CALL(*mock_rtp_rtcp, SetREMBStatus(_))
+ .WillByDefault(Invoke([mock_rtp_rtcp](bool state) {
+ ON_CALL(*mock_rtp_rtcp, REMB()).WillByDefault(Return(state));
+ }));
+}
+
class PacketRouterTest : public ::testing::Test {
public:
PacketRouterTest() : packet_router_(new PacketRouter()) {}
protected:
- static const int kProbeMinProbes = 5;
- static const int kProbeMinBytes = 1000;
+ static constexpr int kProbeMinProbes = 5;
+ static constexpr int kProbeMinBytes = 1000;
const std::unique_ptr<PacketRouter> packet_router_;
};
+TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPacket) {
+ PacketRouter packet_router;
+
+ constexpr uint16_t ssrc = 1234;
+ constexpr uint16_t sequence_number = 17;
+ constexpr uint64_t timestamp = 7890;
+ constexpr bool retransmission = false;
+ const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
+
+ // TODO(eladalon): !!! Discuss with reviewers - it's interesting that this
+ // returns true even when no modules are found that match the SSRC.
+ EXPECT_TRUE(packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
+ retransmission, paced_info));
+}
+
+TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
+ PacketRouter packet_router;
+
+ constexpr size_t bytes = 300;
+ const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
+
+ EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
+}
+
+TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
+ PacketRouter packet_router;
+
+ const std::vector<uint32_t> ssrcs = {1, 2, 3};
+ constexpr uint32_t bitrate_bps = 10000;
+
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
+}
+
+TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
+ PacketRouter packet_router;
+
+ const std::vector<uint32_t> ssrcs = {1, 2, 3};
+ constexpr uint32_t bitrate_bps = 10000;
+
+ EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
+}
+
+TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
+ PacketRouter packet_router;
+
+ rtcp::TransportFeedback feedback;
+
+ EXPECT_FALSE(packet_router_->SendTransportFeedback(&feedback));
+}
+
TEST_F(PacketRouterTest, TimeToSendPacket) {
NiceMock<MockRtpRtcp> rtp_1;
NiceMock<MockRtpRtcp> rtp_2;
- packet_router_->AddSendRtpModule(&rtp_1);
- packet_router_->AddSendRtpModule(&rtp_2);
+ packet_router_->AddSendRtpModule(&rtp_1, false);
+ packet_router_->AddSendRtpModule(&rtp_2, false);
const uint16_t kSsrc1 = 1234;
uint16_t sequence_number = 17;
@@ -125,8 +199,8 @@ TEST_F(PacketRouterTest, TimeToSendPadding) {
// rtp_2 will be prioritized for padding.
EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
- packet_router_->AddSendRtpModule(&rtp_1);
- packet_router_->AddSendRtpModule(&rtp_2);
+ packet_router_->AddSendRtpModule(&rtp_1, false);
+ packet_router_->AddSendRtpModule(&rtp_2, false);
// Default configuration, sending padding on all modules sending media,
// ordered by priority (based on rtx mode).
@@ -210,7 +284,7 @@ TEST_F(PacketRouterTest, TimeToSendPadding) {
TEST_F(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
NiceMock<MockRtpRtcp> rtp;
- packet_router_->AddSendRtpModule(&rtp);
+ packet_router_->AddSendRtpModule(&rtp, false);
static const uint16_t kSsrc = 1234;
EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
@@ -246,8 +320,8 @@ TEST_F(PacketRouterTest, AllocateSequenceNumbers) {
TEST_F(PacketRouterTest, SendTransportFeedback) {
NiceMock<MockRtpRtcp> rtp_1;
NiceMock<MockRtpRtcp> rtp_2;
- packet_router_->AddSendRtpModule(&rtp_1);
- packet_router_->AddReceiveRtpModule(&rtp_2);
+ packet_router_->AddSendRtpModule(&rtp_1, false);
+ packet_router_->AddReceiveRtpModule(&rtp_2, false);
rtcp::TransportFeedback feedback;
EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
@@ -258,19 +332,71 @@ TEST_F(PacketRouterTest, SendTransportFeedback) {
packet_router_->RemoveReceiveRtpModule(&rtp_2);
}
+#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
+TEST_F(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
+ PacketRouter packet_router;
+
+ NiceMock<MockRtpRtcp> module;
+ OnSetREMBStatusAndSetRembAccordingly(&module);
+
+ constexpr bool remb_candidate = false; // Value irrelevant.
+ packet_router.AddSendRtpModule(&module, remb_candidate);
+ EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
+
+ // Test tear-down
+ packet_router.RemoveSendRtpModule(&module);
+}
+
+TEST_F(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
+ PacketRouter packet_router;
+
+ NiceMock<MockRtpRtcp> module;
+ OnSetREMBStatusAndSetRembAccordingly(&module);
+
+ constexpr bool remb_candidate = false; // Value irrelevant.
+ packet_router.AddReceiveRtpModule(&module, remb_candidate);
+ EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
+
+ // Test tear-down
+ packet_router.RemoveReceiveRtpModule(&module);
+}
+
+TEST_F(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
+ PacketRouter packet_router;
+
+ NiceMock<MockRtpRtcp> module;
+ OnSetREMBStatusAndSetRembAccordingly(&module);
+
+ EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
+}
+
+TEST_F(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
+ PacketRouter packet_router;
+
+ NiceMock<MockRtpRtcp> module;
+ OnSetREMBStatusAndSetRembAccordingly(&module);
+
+ EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
+}
+#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
+
+// TODO(eladalon): Remove this test; it should be covered by:
+// 1. SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst
+// 2. SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst
+// 3. LowerEstimateToSendRemb
+// (Not removing in this CL to prove it doesn't break this test.)
TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) {
rtc::ScopedFakeClock clock;
NiceMock<MockRtpRtcp> rtp_recv;
NiceMock<MockRtpRtcp> rtp_send;
PacketRouter packet_router;
- EXPECT_CALL(rtp_recv, SetREMBStatus(true)).Times(1);
- packet_router.AddReceiveRtpModule(&rtp_recv);
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp_recv, true);
+ packet_router.AddReceiveRtpModule(&rtp_recv, true);
const uint32_t bitrate_estimate = 456;
const std::vector<uint32_t> ssrcs = {1234};
- ON_CALL(rtp_recv, REMB()).WillByDefault(Return(true));
packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
// Call OnReceiveBitrateChanged twice to get a first estimate.
@@ -279,20 +405,19 @@ TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) {
packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
// Add a send module, which should be preferred over the receive module.
- EXPECT_CALL(rtp_recv, SetREMBStatus(false)).Times(1);
- EXPECT_CALL(rtp_send, SetREMBStatus(true)).Times(1);
- packet_router.AddSendRtpModule(&rtp_send);
- ON_CALL(rtp_recv, REMB()).WillByDefault(Return(false));
- ON_CALL(rtp_send, REMB()).WillByDefault(Return(true));
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp_recv, false);
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp_send, true);
+ packet_router.AddSendRtpModule(&rtp_send, true);
// Lower bitrate to send another REMB packet.
EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
- EXPECT_CALL(rtp_send, SetREMBStatus(false)).Times(1);
- EXPECT_CALL(rtp_recv, SetREMBStatus(true)).Times(1);
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp_send, false);
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp_recv, true);
packet_router.RemoveSendRtpModule(&rtp_send);
- EXPECT_CALL(rtp_recv, SetREMBStatus(false)).Times(1);
+
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp_recv, false);
packet_router.RemoveReceiveRtpModule(&rtp_recv);
}
@@ -301,13 +426,12 @@ TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
NiceMock<MockRtpRtcp> rtp;
PacketRouter packet_router;
- EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1);
- packet_router.AddSendRtpModule(&rtp);
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp, true);
+ packet_router.AddSendRtpModule(&rtp, true);
uint32_t bitrate_estimate = 456;
const std::vector<uint32_t> ssrcs = {1234};
- ON_CALL(rtp, REMB()).WillByDefault(Return(true));
packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
// Call OnReceiveBitrateChanged twice to get a first estimate.
@@ -321,7 +445,7 @@ TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
- EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1);
+ ExpectSetREMBStatusAndSetRembAccordingly(&rtp, false);
packet_router.RemoveSendRtpModule(&rtp);
}
@@ -329,7 +453,7 @@ TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
rtc::ScopedFakeClock clock;
NiceMock<MockRtpRtcp> rtp;
PacketRouter packet_router;
- packet_router.AddSendRtpModule(&rtp);
+ packet_router.AddSendRtpModule(&rtp, true);
uint32_t bitrate_estimate[] = {456, 789};
std::vector<uint32_t> ssrcs = {1234, 5678};
@@ -355,7 +479,7 @@ TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
rtc::ScopedFakeClock clock;
NiceMock<MockRtpRtcp> rtp;
PacketRouter packet_router;
- packet_router.AddSendRtpModule(&rtp);
+ packet_router.AddSendRtpModule(&rtp, true);
uint32_t bitrate_estimate = 456;
std::vector<uint32_t> ssrcs = {1234, 5678};
@@ -385,8 +509,8 @@ TEST(PacketRouterRembTest, ChangeSendRtpModule) {
NiceMock<MockRtpRtcp> rtp_send;
NiceMock<MockRtpRtcp> rtp_recv;
PacketRouter packet_router;
- packet_router.AddSendRtpModule(&rtp_send);
- packet_router.AddReceiveRtpModule(&rtp_recv);
+ packet_router.AddSendRtpModule(&rtp_send, true);
+ packet_router.AddReceiveRtpModule(&rtp_recv, true);
uint32_t bitrate_estimate = 456;
std::vector<uint32_t> ssrcs = {1234, 5678};
@@ -423,7 +547,7 @@ TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
rtc::ScopedFakeClock clock;
NiceMock<MockRtpRtcp> rtp;
PacketRouter packet_router;
- packet_router.AddSendRtpModule(&rtp);
+ packet_router.AddSendRtpModule(&rtp, true);
uint32_t bitrate_estimate = 456;
const std::vector<uint32_t> ssrcs = {1234};
@@ -455,7 +579,7 @@ TEST(PacketRouterRembTest, NoSendingRtpModule) {
PacketRouter packet_router;
EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1);
- packet_router.AddReceiveRtpModule(&rtp);
+ packet_router.AddReceiveRtpModule(&rtp, true);
uint32_t bitrate_estimate = 456;
const std::vector<uint32_t> ssrcs = {1234};
@@ -476,4 +600,185 @@ TEST(PacketRouterRembTest, NoSendingRtpModule) {
packet_router.RemoveReceiveRtpModule(&rtp);
}
+TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> module;
+
+ constexpr bool remb_candidate = false;
+ ON_CALL(module, REMB()).WillByDefault(Return(false));
+ EXPECT_CALL(module, SetREMBStatus(_)).Times(0);
+ packet_router.AddSendRtpModule(&module, remb_candidate);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(module, SetREMBData(_, _)).Times(0);
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ packet_router.RemoveSendRtpModule(&module);
+}
+
+TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> module;
+
+ ExpectSetREMBStatusAndSetRembAccordingly(&module, true);
+ constexpr bool remb_candidate = true;
+ packet_router.AddSendRtpModule(&module, remb_candidate);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ ExpectSetREMBStatusAndSetRembAccordingly(&module, false);
+ packet_router.RemoveSendRtpModule(&module);
+}
+
+TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> module;
+
+ ON_CALL(module, REMB()).WillByDefault(Return(false));
+ EXPECT_CALL(module, SetREMBStatus(_)).Times(0);
+ constexpr bool remb_candidate = false;
+ packet_router.AddReceiveRtpModule(&module, remb_candidate);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(module, SetREMBData(_, _)).Times(0);
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ packet_router.RemoveReceiveRtpModule(&module);
+}
+
+TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> module;
+
+ ExpectSetREMBStatusAndSetRembAccordingly(&module, true);
+ constexpr bool remb_candidate = true;
+ packet_router.AddReceiveRtpModule(&module, remb_candidate);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ ExpectSetREMBStatusAndSetRembAccordingly(&module, false);
+ packet_router.RemoveReceiveRtpModule(&module);
+}
+
+TEST(PacketRouterRembTest,
+ SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> send_module;
+ NiceMock<MockRtpRtcp> receive_module;
+
+ constexpr bool remb_candidate = true;
+
+ // Send module added - activated.
+ ExpectSetREMBStatusAndSetRembAccordingly(&send_module, true);
+ packet_router.AddSendRtpModule(&send_module, remb_candidate);
+
+ // Receive module added - the send module remains the active one.
+ ON_CALL(receive_module, REMB()).WillByDefault(Return(false));
+ EXPECT_CALL(receive_module, SetREMBStatus(true)).Times(0);
+ packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
+ EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0);
+
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ packet_router.RemoveReceiveRtpModule(&receive_module);
+ ExpectSetREMBStatusAndSetRembAccordingly(&send_module, false);
+ packet_router.RemoveSendRtpModule(&send_module);
+}
+
+TEST(PacketRouterRembTest,
+ SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> send_module;
+ NiceMock<MockRtpRtcp> receive_module;
+
+ constexpr bool remb_candidate = true;
+
+ // Receive module added - activated.
+ ExpectSetREMBStatusAndSetRembAccordingly(&receive_module, true);
+ packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
+
+ // Send module added - replaces receive module as active.
+ ExpectSetREMBStatusAndSetRembAccordingly(&receive_module, false);
+ ExpectSetREMBStatusAndSetRembAccordingly(&send_module, true);
+ packet_router.AddSendRtpModule(&send_module, remb_candidate);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
+ EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0);
+
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ packet_router.RemoveReceiveRtpModule(&receive_module);
+ ExpectSetREMBStatusAndSetRembAccordingly(&send_module, false);
+ packet_router.RemoveSendRtpModule(&send_module);
+}
+
+TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
+ rtc::ScopedFakeClock clock;
+ PacketRouter packet_router;
+ NiceMock<MockRtpRtcp> send_module;
+ NiceMock<MockRtpRtcp> receive_module;
+
+ constexpr bool remb_candidate = true;
+
+ // Send module added - activated.
+ ExpectSetREMBStatusAndSetRembAccordingly(&send_module, true);
+ packet_router.AddSendRtpModule(&send_module, remb_candidate);
+
+ // Receive module added - the send module remains the active one.
+ ON_CALL(receive_module, REMB()).WillByDefault(Return(false));
+ EXPECT_CALL(receive_module, SetREMBStatus(true)).Times(0);
+ packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
+
+ // Send module removed - receive module becomes active.
+ ExpectSetREMBStatusAndSetRembAccordingly(&send_module, false);
+ ExpectSetREMBStatusAndSetRembAccordingly(&receive_module, true);
+ packet_router.RemoveSendRtpModule(&send_module);
+
+ constexpr uint32_t bitrate_estimate = 456;
+ const std::vector<uint32_t> ssrcs = {1234};
+ EXPECT_CALL(send_module, SetREMBData(_, _)).Times(0);
+ EXPECT_CALL(receive_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
+
+ clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
+ packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
+
+ // Test tear-down
+ ExpectSetREMBStatusAndSetRembAccordingly(&receive_module, false);
+ packet_router.RemoveReceiveRtpModule(&receive_module);
+}
+
+// TODO(eladalon): Tests for a module which is both receive as well as send?
+
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698