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}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
a39d96666b
commit
770acabd5d
@ -87,10 +87,12 @@ using ::testing::Gt;
|
||||
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_P(RtpSenderTest, KeepsTimestampsOnPayloadPadding) {
|
||||
|
||||
// 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 @@ TEST_P(RtpSenderTestWithoutPacer, MidAndRidNotIncludedOnSentPacketsAfterAck) {
|
||||
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 @@ TEST_P(RtpSenderTestWithoutPacer, MidAndRidIncludedOnFirstRtxPacket) {
|
||||
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 @@ TEST_P(RtpSenderTestWithoutPacer, MidAndRidNotIncludedOnRtxPacketsAfterAck) {
|
||||
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 @@ TEST_P(RtpSenderTestWithoutPacer,
|
||||
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 @@ TEST_P(RtpSenderTestWithoutPacer,
|
||||
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 @@ TEST_P(RtpSenderTestWithoutPacer,
|
||||
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) {
|
||||
|
Reference in New Issue
Block a user