Refactor mid/rid rtp tests to avoid using egress/transport logic.
This CL makes a number of test use the paced sender callback to verify
the output of RTPSender, instead of re-parsed data from RtpSenderEgres.
Bug: webrtc:11340
Change-Id: I13ccf5a5db4b6df128cf2fa9e8dad443fcd15cdd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220162
Commit-Queue: Erik Språng <sprang@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34126}
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index 0e3ecd4..bd96f63 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -87,10 +87,12 @@
using ::testing::IsEmpty;
using ::testing::NiceMock;
using ::testing::Not;
+using ::testing::Optional;
using ::testing::Pointee;
using ::testing::Property;
using ::testing::Return;
using ::testing::SizeIs;
+using ::testing::StrEq;
using ::testing::StrictMock;
class LoopbackTransportTest : public webrtc::Transport {
@@ -706,64 +708,54 @@
// Test that the MID header extension is included on sent packets when
// configured.
-TEST_P(RtpSenderTestWithoutPacer, MidIncludedOnSentPackets) {
+TEST_P(RtpSenderTest, MidIncludedOnSentPackets) {
const char kMid[] = "mid";
-
EnableMidSending(kMid);
- // Send a couple packets.
+ // Send a couple packets, expect both packets to have the MID set.
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(
+ Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid)))))
+ .Times(2);
SendGenericPacket();
SendGenericPacket();
-
- // Expect both packets to have the MID set.
- ASSERT_EQ(2u, transport_.sent_packets_.size());
- for (const RtpPacketReceived& packet : transport_.sent_packets_) {
- std::string mid;
- ASSERT_TRUE(packet.GetExtension<RtpMid>(&mid));
- EXPECT_EQ(kMid, mid);
- }
}
-TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnSentPackets) {
+TEST_P(RtpSenderTest, RidIncludedOnSentPackets) {
const char kRid[] = "f";
-
EnableRidSending(kRid);
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(Property(
+ &RtpPacketToSend::GetExtension<RtpStreamId>, kRid)))));
SendGenericPacket();
-
- ASSERT_EQ(1u, transport_.sent_packets_.size());
- const RtpPacketReceived& packet = transport_.sent_packets_[0];
- std::string rid;
- ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
- EXPECT_EQ(kRid, rid);
}
-TEST_P(RtpSenderTestWithoutPacer, RidIncludedOnRtxSentPackets) {
+TEST_P(RtpSenderTest, RidIncludedOnRtxSentPackets) {
const char kRid[] = "f";
- const char kNoRid[] = "";
-
EnableRtx();
EnableRidSending(kRid);
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid),
+ Property(&RtpPacketToSend::HasExtension<RepairedRtpStreamId>,
+ false))))))
+ .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender_context_->packet_history_.PutRtpPacket(
+ std::move(packets[0]), clock_->TimeInMilliseconds());
+ });
SendGenericPacket();
- ASSERT_EQ(1u, transport_.sent_packets_.size());
- const RtpPacketReceived& packet = transport_.sent_packets_[0];
- std::string rid;
- ASSERT_TRUE(packet.GetExtension<RtpStreamId>(&rid));
- EXPECT_EQ(kRid, rid);
- rid = kNoRid;
- EXPECT_FALSE(packet.HasExtension<RepairedRtpStreamId>());
- uint16_t packet_id = packet.SequenceNumber();
- rtp_sender()->ReSendPacket(packet_id);
- ASSERT_EQ(2u, transport_.sent_packets_.size());
- const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
- ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rid));
- EXPECT_EQ(kRid, rid);
- EXPECT_FALSE(rtx_packet.HasExtension<RtpStreamId>());
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>, kRid),
+ Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
+ rtp_sender()->ReSendPacket(kSeqNum);
}
-TEST_P(RtpSenderTestWithoutPacer, MidAndRidNotIncludedOnSentPacketsAfterAck) {
+TEST_P(RtpSenderTest, MidAndRidNotIncludedOnSentPacketsAfterAck) {
const char kMid[] = "mid";
const char kRid[] = "f";
@@ -771,53 +763,48 @@
EnableRidSending(kRid);
// This first packet should include both MID and RID.
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
+ Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))));
auto first_built_packet = SendGenericPacket();
-
rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
// The second packet should include neither since an ack was received.
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
+ Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
SendGenericPacket();
-
- ASSERT_EQ(2u, transport_.sent_packets_.size());
-
- const RtpPacketReceived& first_packet = transport_.sent_packets_[0];
- std::string mid, rid;
- ASSERT_TRUE(first_packet.GetExtension<RtpMid>(&mid));
- EXPECT_EQ(kMid, mid);
- ASSERT_TRUE(first_packet.GetExtension<RtpStreamId>(&rid));
- EXPECT_EQ(kRid, rid);
-
- const RtpPacketReceived& second_packet = transport_.sent_packets_[1];
- EXPECT_FALSE(second_packet.HasExtension<RtpMid>());
- EXPECT_FALSE(second_packet.HasExtension<RtpStreamId>());
}
-TEST_P(RtpSenderTestWithoutPacer,
- MidAndRidAlwaysIncludedOnSentPacketsWhenConfigured) {
- SetUpRtpSender(false, false, /*always_send_mid_and_rid=*/true);
+TEST_P(RtpSenderTest, MidAndRidAlwaysIncludedOnSentPacketsWhenConfigured) {
+ SetUpRtpSender(true, false, /*always_send_mid_and_rid=*/true, nullptr);
const char kMid[] = "mid";
const char kRid[] = "f";
EnableMidSending(kMid);
EnableRidSending(kRid);
// Send two media packets: one before and one after the ack.
- auto first_packet = SendGenericPacket();
- rtp_sender()->OnReceivedAckOnSsrc(first_packet->SequenceNumber());
- SendGenericPacket();
-
// Due to the configuration, both sent packets should contain MID and RID.
- ASSERT_EQ(2u, transport_.sent_packets_.size());
- for (const RtpPacketReceived& packet : transport_.sent_packets_) {
- EXPECT_EQ(packet.GetExtension<RtpMid>(), kMid);
- EXPECT_EQ(packet.GetExtension<RtpStreamId>(), kRid);
- }
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(
+ AllOf(Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
+ Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))))
+ .Times(2);
+ auto first_built_packet = SendGenericPacket();
+ rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
+ SendGenericPacket();
}
// Test that the first RTX packet includes both MID and RRID even if the packet
// being retransmitted did not have MID or RID. The MID and RID are needed on
// the first packets for a given SSRC, and RTX packets are sent on a separate
// SSRC.
-TEST_P(RtpSenderTestWithoutPacer, MidAndRidIncludedOnFirstRtxPacket) {
+TEST_P(RtpSenderTest, MidAndRidIncludedOnFirstRtxPacket) {
const char kMid[] = "mid";
const char kRid[] = "f";
@@ -826,30 +813,32 @@
EnableRidSending(kRid);
// This first packet will include both MID and RID.
+ EXPECT_CALL(mock_paced_sender_, EnqueuePackets);
auto first_built_packet = SendGenericPacket();
rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
- // The second packet will include neither since an ack was received.
+ // The second packet will include neither since an ack was received, put
+ // it in the packet history for retransmission.
+ EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
+ .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender_context_->packet_history_.PutRtpPacket(
+ std::move(packets[0]), clock_->TimeInMilliseconds());
+ });
auto second_built_packet = SendGenericPacket();
// The first RTX packet should include MID and RRID.
- ASSERT_LT(0,
- rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber()));
-
- ASSERT_EQ(3u, transport_.sent_packets_.size());
-
- const RtpPacketReceived& rtx_packet = transport_.sent_packets_[2];
- std::string mid, rrid;
- ASSERT_TRUE(rtx_packet.GetExtension<RtpMid>(&mid));
- EXPECT_EQ(kMid, mid);
- ASSERT_TRUE(rtx_packet.GetExtension<RepairedRtpStreamId>(&rrid));
- EXPECT_EQ(kRid, rrid);
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
+ Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>,
+ kRid))))));
+ rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber());
}
// Test that the RTX packets sent after receving an ACK on the RTX SSRC does
// not include either MID or RRID even if the packet being retransmitted did
// had a MID or RID.
-TEST_P(RtpSenderTestWithoutPacer, MidAndRidNotIncludedOnRtxPacketsAfterAck) {
+TEST_P(RtpSenderTest, MidAndRidNotIncludedOnRtxPacketsAfterAck) {
const char kMid[] = "mid";
const char kRid[] = "f";
@@ -858,41 +847,44 @@
EnableRidSending(kRid);
// This first packet will include both MID and RID.
+ EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
+ .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender_context_->packet_history_.PutRtpPacket(
+ std::move(packets[0]), clock_->TimeInMilliseconds());
+ });
auto first_built_packet = SendGenericPacket();
rtp_sender()->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
// The second packet will include neither since an ack was received.
+ EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
+ .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender_context_->packet_history_.PutRtpPacket(
+ std::move(packets[0]), clock_->TimeInMilliseconds());
+ });
auto second_built_packet = SendGenericPacket();
// The first RTX packet will include MID and RRID.
- ASSERT_LT(0,
- rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber()));
-
- ASSERT_EQ(3u, transport_.sent_packets_.size());
- const RtpPacketReceived& first_rtx_packet = transport_.sent_packets_[2];
-
- rtp_sender()->OnReceivedAckOnRtxSsrc(first_rtx_packet.SequenceNumber());
+ EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
+ .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender()->OnReceivedAckOnRtxSsrc(packets[0]->SequenceNumber());
+ rtp_sender_context_->packet_history_.MarkPacketAsSent(
+ *packets[0]->retransmitted_sequence_number());
+ });
+ rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber());
// The second and third RTX packets should not include MID nor RRID.
- ASSERT_LT(0,
- rtp_sender()->ReSendPacket(first_built_packet->SequenceNumber()));
- ASSERT_LT(0,
- rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber()));
-
- ASSERT_EQ(5u, transport_.sent_packets_.size());
-
- const RtpPacketReceived& second_rtx_packet = transport_.sent_packets_[3];
- EXPECT_FALSE(second_rtx_packet.HasExtension<RtpMid>());
- EXPECT_FALSE(second_rtx_packet.HasExtension<RepairedRtpStreamId>());
-
- const RtpPacketReceived& third_rtx_packet = transport_.sent_packets_[4];
- EXPECT_FALSE(third_rtx_packet.HasExtension<RtpMid>());
- EXPECT_FALSE(third_rtx_packet.HasExtension<RepairedRtpStreamId>());
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
+ Property(&RtpPacketToSend::HasExtension<RepairedRtpStreamId>,
+ false))))))
+ .Times(2);
+ rtp_sender()->ReSendPacket(first_built_packet->SequenceNumber());
+ rtp_sender()->ReSendPacket(second_built_packet->SequenceNumber());
}
-TEST_P(RtpSenderTestWithoutPacer,
- MidAndRidAlwaysIncludedOnRtxPacketsWhenConfigured) {
- SetUpRtpSender(false, false, /*always_send_mid_and_rid=*/true);
+TEST_P(RtpSenderTest, MidAndRidAlwaysIncludedOnRtxPacketsWhenConfigured) {
+ SetUpRtpSender(true, false, /*always_send_mid_and_rid=*/true, nullptr);
const char kMid[] = "mid";
const char kRid[] = "f";
EnableRtx();
@@ -900,39 +892,45 @@
EnableRidSending(kRid);
// Send two media packets: one before and one after the ack.
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(
+ AllOf(Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
+ Property(&RtpPacketToSend::GetExtension<RtpStreamId>, kRid))))))
+ .Times(2)
+ .WillRepeatedly(
+ [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender_context_->packet_history_.PutRtpPacket(
+ std::move(packets[0]), clock_->TimeInMilliseconds());
+ });
auto media_packet1 = SendGenericPacket();
rtp_sender()->OnReceivedAckOnSsrc(media_packet1->SequenceNumber());
auto media_packet2 = SendGenericPacket();
// Send three RTX packets with different combinations of orders w.r.t. the
// media and RTX acks.
- ASSERT_LT(0, rtp_sender()->ReSendPacket(media_packet2->SequenceNumber()));
- ASSERT_EQ(3u, transport_.sent_packets_.size());
- rtp_sender()->OnReceivedAckOnRtxSsrc(
- transport_.sent_packets_[2].SequenceNumber());
- ASSERT_LT(0, rtp_sender()->ReSendPacket(media_packet1->SequenceNumber()));
- ASSERT_LT(0, rtp_sender()->ReSendPacket(media_packet2->SequenceNumber()));
-
// Due to the configuration, all sent packets should contain MID
// and either RID (media) or RRID (RTX).
- ASSERT_EQ(5u, transport_.sent_packets_.size());
- for (const auto& packet : transport_.sent_packets_) {
- EXPECT_EQ(packet.GetExtension<RtpMid>(), kMid);
- }
- for (size_t i = 0; i < 2; ++i) {
- const RtpPacketReceived& packet = transport_.sent_packets_[i];
- EXPECT_EQ(packet.GetExtension<RtpStreamId>(), kRid);
- }
- for (size_t i = 2; i < transport_.sent_packets_.size(); ++i) {
- const RtpPacketReceived& packet = transport_.sent_packets_[i];
- EXPECT_EQ(packet.GetExtension<RepairedRtpStreamId>(), kRid);
- }
+ EXPECT_CALL(mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::GetExtension<RtpMid>, kMid),
+ Property(&RtpPacketToSend::GetExtension<RepairedRtpStreamId>,
+ kRid))))))
+ .Times(3)
+ .WillRepeatedly(
+ [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender()->OnReceivedAckOnRtxSsrc(packets[0]->SequenceNumber());
+ rtp_sender_context_->packet_history_.MarkPacketAsSent(
+ *packets[0]->retransmitted_sequence_number());
+ });
+ rtp_sender()->ReSendPacket(media_packet2->SequenceNumber());
+ rtp_sender()->ReSendPacket(media_packet1->SequenceNumber());
+ rtp_sender()->ReSendPacket(media_packet2->SequenceNumber());
}
// Test that if the RtpState indicates an ACK has been received on that SSRC
// then neither the MID nor RID header extensions will be sent.
-TEST_P(RtpSenderTestWithoutPacer,
- MidAndRidNotIncludedOnSentPacketsAfterRtpStateRestored) {
+TEST_P(RtpSenderTest, MidAndRidNotIncludedOnSentPacketsAfterRtpStateRestored) {
const char kMid[] = "mid";
const char kRid[] = "f";
@@ -944,19 +942,18 @@
state.ssrc_has_acked = true;
rtp_sender()->SetRtpState(state);
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
+ Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
SendGenericPacket();
-
- ASSERT_EQ(1u, transport_.sent_packets_.size());
- const RtpPacketReceived& packet = transport_.sent_packets_[0];
- EXPECT_FALSE(packet.HasExtension<RtpMid>());
- EXPECT_FALSE(packet.HasExtension<RtpStreamId>());
}
// Test that if the RTX RtpState indicates an ACK has been received on that
// RTX SSRC then neither the MID nor RRID header extensions will be sent on
// RTX packets.
-TEST_P(RtpSenderTestWithoutPacer,
- MidAndRridNotIncludedOnRtxPacketsAfterRtpStateRestored) {
+TEST_P(RtpSenderTest, MidAndRridNotIncludedOnRtxPacketsAfterRtpStateRestored) {
const char kMid[] = "mid";
const char kRid[] = "f";
@@ -969,13 +966,19 @@
rtx_state.ssrc_has_acked = true;
rtp_sender()->SetRtxRtpState(rtx_state);
+ EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
+ .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
+ rtp_sender_context_->packet_history_.PutRtpPacket(
+ std::move(packets[0]), clock_->TimeInMilliseconds());
+ });
auto built_packet = SendGenericPacket();
- ASSERT_LT(0, rtp_sender()->ReSendPacket(built_packet->SequenceNumber()));
- ASSERT_EQ(2u, transport_.sent_packets_.size());
- const RtpPacketReceived& rtx_packet = transport_.sent_packets_[1];
- EXPECT_FALSE(rtx_packet.HasExtension<RtpMid>());
- EXPECT_FALSE(rtx_packet.HasExtension<RepairedRtpStreamId>());
+ EXPECT_CALL(
+ mock_paced_sender_,
+ EnqueuePackets(ElementsAre(Pointee(AllOf(
+ Property(&RtpPacketToSend::HasExtension<RtpMid>, false),
+ Property(&RtpPacketToSend::HasExtension<RtpStreamId>, false))))));
+ ASSERT_LT(0, rtp_sender()->ReSendPacket(built_packet->SequenceNumber()));
}
TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {