| Index: webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc
|
| diff --git a/webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc b/webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc
|
| index 2c94c71c75e5f55af57d397cc4a410034117db75..a87f2af02d205b21cca7a3d9f91bd75d623f666d 100644
|
| --- a/webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc
|
| +++ b/webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc
|
| @@ -37,6 +37,7 @@ class TransportFeedbackAdapterTest : public ::testing::Test {
|
| virtual void SetUp() {
|
| adapter_.reset(new TransportFeedbackAdapter(&clock_, &bitrate_controller_));
|
| adapter_->InitBwe();
|
| + adapter_->SetStartBitrate(300000);
|
| }
|
|
|
| virtual void TearDown() { adapter_.reset(); }
|
| @@ -128,6 +129,83 @@ TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) {
|
| ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector());
|
| }
|
|
|
| +TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) {
|
| + const int64_t kFeedbackTimeoutMs = 60001;
|
| + const int kMaxConsecutiveFailedLookups = 5;
|
| + for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) {
|
| + std::vector<PacketInfo> packets;
|
| + packets.push_back(PacketInfo(i * 100, 2 * i * 100, 0, 1500, 0));
|
| + packets.push_back(PacketInfo(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, 0));
|
| + packets.push_back(PacketInfo(i * 100 + 20, 2 * i * 100 + 20, 2, 1500, 0));
|
| + packets.push_back(PacketInfo(i * 100 + 30, 2 * i * 100 + 30, 3, 1500, 1));
|
| + packets.push_back(PacketInfo(i * 100 + 40, 2 * i * 100 + 40, 4, 1500, 1));
|
| +
|
| + for (const PacketInfo& packet : packets)
|
| + OnSentPacket(packet);
|
| +
|
| + rtcp::TransportFeedback feedback;
|
| + feedback.SetBase(packets[0].sequence_number,
|
| + packets[0].arrival_time_ms * 1000);
|
| +
|
| + for (const PacketInfo& packet : packets) {
|
| + EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
|
| + packet.arrival_time_ms * 1000));
|
| + }
|
| +
|
| + feedback.Build();
|
| +
|
| + clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs);
|
| + PacketInfo later_packet(kFeedbackTimeoutMs + i * 100 + 40,
|
| + kFeedbackTimeoutMs + i * 200 + 40, 5, 1500, 1);
|
| + OnSentPacket(later_packet);
|
| +
|
| + adapter_->OnTransportFeedback(feedback);
|
| +
|
| + // Check that packets have timed out.
|
| + for (PacketInfo& packet : packets) {
|
| + packet.send_time_ms = -1;
|
| + packet.payload_size = 0;
|
| + packet.probe_cluster_id = -1;
|
| + }
|
| + ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector());
|
| + }
|
| +
|
| + // Target bitate should have halved due to feedback delays.
|
| + EXPECT_EQ(150000u, target_bitrate_bps_);
|
| +
|
| + // Test with feedback that isn't late enough to time out.
|
| + {
|
| + std::vector<PacketInfo> packets;
|
| + packets.push_back(PacketInfo(100, 200, 0, 1500, 0));
|
| + packets.push_back(PacketInfo(110, 210, 1, 1500, 0));
|
| + packets.push_back(PacketInfo(120, 220, 2, 1500, 0));
|
| + packets.push_back(PacketInfo(130, 230, 3, 1500, 1));
|
| + packets.push_back(PacketInfo(140, 240, 4, 1500, 1));
|
| +
|
| + for (const PacketInfo& packet : packets)
|
| + OnSentPacket(packet);
|
| +
|
| + rtcp::TransportFeedback feedback;
|
| + feedback.SetBase(packets[0].sequence_number,
|
| + packets[0].arrival_time_ms * 1000);
|
| +
|
| + for (const PacketInfo& packet : packets) {
|
| + EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
|
| + packet.arrival_time_ms * 1000));
|
| + }
|
| +
|
| + feedback.Build();
|
| +
|
| + clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs - 1);
|
| + PacketInfo later_packet(kFeedbackTimeoutMs + 140, kFeedbackTimeoutMs + 240,
|
| + 5, 1500, 1);
|
| + OnSentPacket(later_packet);
|
| +
|
| + adapter_->OnTransportFeedback(feedback);
|
| + ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector());
|
| + }
|
| +}
|
| +
|
| TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) {
|
| std::vector<PacketInfo> packets;
|
| packets.push_back(PacketInfo(100, 200, 0, 1500, 1));
|
| @@ -158,8 +236,14 @@ TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) {
|
| feedback.Build();
|
|
|
| std::vector<PacketInfo> expected_packets(
|
| - packets.begin() + kSendSideDropBefore,
|
| - packets.begin() + kReceiveSideDropAfter + 1);
|
| + packets.begin(), packets.begin() + kReceiveSideDropAfter + 1);
|
| + // Packets that have timed out on the send-side have lost the
|
| + // information stored on the send-side.
|
| + for (size_t i = 0; i < kSendSideDropBefore; ++i) {
|
| + expected_packets[i].send_time_ms = -1;
|
| + expected_packets[i].probe_cluster_id = -1;
|
| + expected_packets[i].payload_size = 0;
|
| + }
|
|
|
| adapter_->OnTransportFeedback(feedback);
|
| ComparePacketVectors(expected_packets,
|
|
|