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, |