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

Side by Side Diff: webrtc/modules/congestion_controller/transport_feedback_adapter_unittest.cc

Issue 2707383006: GetTransportFeedbackVector() includes unreceived packets, sorted by seq-num (Closed)
Patch Set: Response to CR Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 // truth contains the input data for the test, and input is what will be 83 // truth contains the input data for the test, and input is what will be
84 // sent to the bandwidth estimator. truth.arrival_tims_ms is used to 84 // sent to the bandwidth estimator. truth.arrival_tims_ms is used to
85 // populate the transport feedback messages. As these times may be changed 85 // populate the transport feedback messages. As these times may be changed
86 // (because of resolution limits in the packets, and because of the time 86 // (because of resolution limits in the packets, and because of the time
87 // base adjustment performed by the TransportFeedbackAdapter at the first 87 // base adjustment performed by the TransportFeedbackAdapter at the first
88 // packet, the truth[x].arrival_time and input[x].arrival_time may not be 88 // packet, the truth[x].arrival_time and input[x].arrival_time may not be
89 // equal. However, the difference must be the same for all x. 89 // equal. However, the difference must be the same for all x.
90 int64_t arrival_time_delta = 90 int64_t arrival_time_delta =
91 truth[0].arrival_time_ms - input[0].arrival_time_ms; 91 truth[0].arrival_time_ms - input[0].arrival_time_ms;
92 for (size_t i = 0; i < len; ++i) { 92 for (size_t i = 0; i < len; ++i) {
93 EXPECT_EQ(truth[i].arrival_time_ms, 93 RTC_CHECK(truth[i].arrival_time_ms != PacketFeedback::kNotReceived);
94 input[i].arrival_time_ms + arrival_time_delta); 94 if (input[i].arrival_time_ms != PacketFeedback::kNotReceived) {
95 EXPECT_EQ(truth[i].arrival_time_ms,
96 input[i].arrival_time_ms + arrival_time_delta);
97 }
95 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); 98 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms);
96 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); 99 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number);
97 EXPECT_EQ(truth[i].payload_size, input[i].payload_size); 100 EXPECT_EQ(truth[i].payload_size, input[i].payload_size);
98 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info); 101 EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info);
99 } 102 }
100 } 103 }
101 104
102 // Utility method, to reset arrival_time_ms before adding send time. 105 // Utility method, to reset arrival_time_ms before adding send time.
103 void OnSentPacket(PacketFeedback packet_feedback) { 106 void OnSentPacket(PacketFeedback packet_feedback) {
104 packet_feedback.arrival_time_ms = 0; 107 packet_feedback.arrival_time_ms = 0;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, 139 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
137 packet.arrival_time_ms * 1000)); 140 packet.arrival_time_ms * 1000));
138 } 141 }
139 142
140 feedback.Build(); 143 feedback.Build();
141 144
142 adapter_->OnTransportFeedback(feedback); 145 adapter_->OnTransportFeedback(feedback);
143 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector()); 146 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector());
144 } 147 }
145 148
149 TEST_F(TransportFeedbackAdapterTest, FeedbackVectorReportsUnreceived) {
150 std::vector<PacketFeedback> sent_packets = {
151 PacketFeedback(100, 220, 0, 1500, kPacingInfo0),
152 PacketFeedback(110, 210, 1, 1500, kPacingInfo0),
153 PacketFeedback(120, 220, 2, 1500, kPacingInfo0),
154 PacketFeedback(130, 230, 3, 1500, kPacingInfo0),
155 PacketFeedback(140, 240, 4, 1500, kPacingInfo0),
156 PacketFeedback(150, 250, 5, 1500, kPacingInfo0),
157 PacketFeedback(160, 260, 6, 1500, kPacingInfo0)
158 };
159
160 for (const PacketFeedback& packet : sent_packets)
161 OnSentPacket(packet);
162
163 // Note: Important to include the last packet, as only unreceived packets in
164 // between received packets can be inferred.
165 std::vector<PacketFeedback> received_packets = {
166 sent_packets[0], sent_packets[2], sent_packets[6]
167 };
168
169 rtcp::TransportFeedback feedback;
170 feedback.SetBase(received_packets[0].sequence_number,
171 received_packets[0].arrival_time_ms * 1000);
172
173 for (const PacketFeedback& packet : received_packets) {
174 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
175 packet.arrival_time_ms * 1000));
176 }
177
178 feedback.Build();
179
180 adapter_->OnTransportFeedback(feedback);
181 ComparePacketVectors(sent_packets, adapter_->GetTransportFeedbackVector());
182 }
183
146 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) { 184 TEST_F(TransportFeedbackAdapterTest, LongFeedbackDelays) {
147 const int64_t kFeedbackTimeoutMs = 60001; 185 const int64_t kFeedbackTimeoutMs = 60001;
148 const int kMaxConsecutiveFailedLookups = 5; 186 const int kMaxConsecutiveFailedLookups = 5;
149 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) { 187 for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) {
150 std::vector<PacketFeedback> packets; 188 std::vector<PacketFeedback> packets;
151 packets.push_back( 189 packets.push_back(
152 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0)); 190 PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0));
153 packets.push_back( 191 packets.push_back(
154 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0)); 192 PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0));
155 packets.push_back( 193 packets.push_back(
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 339
302 std::vector<PacketFeedback> expected_packets; 340 std::vector<PacketFeedback> expected_packets;
303 expected_packets.push_back(packets[i]); 341 expected_packets.push_back(packets[i]);
304 342
305 adapter_->OnTransportFeedback(*feedback.get()); 343 adapter_->OnTransportFeedback(*feedback.get());
306 ComparePacketVectors(expected_packets, 344 ComparePacketVectors(expected_packets,
307 adapter_->GetTransportFeedbackVector()); 345 adapter_->GetTransportFeedbackVector());
308 } 346 }
309 } 347 }
310 348
311 TEST_F(TransportFeedbackAdapterTest, HandlesReordering) { 349 TEST_F(TransportFeedbackAdapterTest, HandlesArrivalReordering) {
312 std::vector<PacketFeedback> packets; 350 std::vector<PacketFeedback> packets;
313 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0)); 351 packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0));
314 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0)); 352 packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0));
315 packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0)); 353 packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0));
316 std::vector<PacketFeedback> expected_packets;
317 expected_packets.push_back(packets[2]);
318 expected_packets.push_back(packets[1]);
319 expected_packets.push_back(packets[0]);
320 354
321 for (const PacketFeedback& packet : packets) 355 for (const PacketFeedback& packet : packets)
322 OnSentPacket(packet); 356 OnSentPacket(packet);
323 357
324 rtcp::TransportFeedback feedback; 358 rtcp::TransportFeedback feedback;
325 feedback.SetBase(packets[0].sequence_number, 359 feedback.SetBase(packets[0].sequence_number,
326 packets[0].arrival_time_ms * 1000); 360 packets[0].arrival_time_ms * 1000);
327 361
328 for (const PacketFeedback& packet : packets) { 362 for (const PacketFeedback& packet : packets) {
329 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number, 363 EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
330 packet.arrival_time_ms * 1000)); 364 packet.arrival_time_ms * 1000));
331 } 365 }
332 366
333 feedback.Build(); 367 feedback.Build();
334 368
369 // Adapter keeps the packets ordered by sequence number (which is itself
370 // assigned by the order of transmission). Reordering by some other criteria,
371 // eg. arrival time, is up to the observers.
335 adapter_->OnTransportFeedback(feedback); 372 adapter_->OnTransportFeedback(feedback);
336 ComparePacketVectors(expected_packets, 373 ComparePacketVectors(packets, adapter_->GetTransportFeedbackVector());
337 adapter_->GetTransportFeedbackVector());
338 } 374 }
339 375
340 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { 376 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) {
341 std::vector<PacketFeedback> sent_packets; 377 std::vector<PacketFeedback> sent_packets;
342 const int64_t kSmallDeltaUs = 378 const int64_t kSmallDeltaUs =
343 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); 379 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1);
344 const int64_t kLargePositiveDeltaUs = 380 const int64_t kLargePositiveDeltaUs =
345 rtcp::TransportFeedback::kDeltaScaleFactor * 381 rtcp::TransportFeedback::kDeltaScaleFactor *
346 std::numeric_limits<int16_t>::max(); 382 std::numeric_limits<int16_t>::max();
347 const int64_t kLargeNegativeDeltaUs = 383 const int64_t kLargeNegativeDeltaUs =
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); 426 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000));
391 427
392 rtc::Buffer raw_packet = feedback->Build(); 428 rtc::Buffer raw_packet = feedback->Build();
393 feedback = 429 feedback =
394 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); 430 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size());
395 431
396 std::vector<PacketFeedback> received_feedback; 432 std::vector<PacketFeedback> received_feedback;
397 433
398 EXPECT_TRUE(feedback.get() != nullptr); 434 EXPECT_TRUE(feedback.get() != nullptr);
399 adapter_->OnTransportFeedback(*feedback.get()); 435 adapter_->OnTransportFeedback(*feedback.get());
400 { 436 ComparePacketVectors(sent_packets, adapter_->GetTransportFeedbackVector());
401 // Expected to be ordered on arrival time when the feedback message has been
402 // parsed.
403 std::vector<PacketFeedback> expected_packets;
404 expected_packets.push_back(sent_packets[0]);
405 expected_packets.push_back(sent_packets[3]);
406 expected_packets.push_back(sent_packets[1]);
407 expected_packets.push_back(sent_packets[2]);
408 ComparePacketVectors(expected_packets,
409 adapter_->GetTransportFeedbackVector());
410 }
411 437
412 // Create a new feedback message and add the trailing item. 438 // Create a new feedback message and add the trailing item.
413 feedback.reset(new rtcp::TransportFeedback()); 439 feedback.reset(new rtcp::TransportFeedback());
414 feedback->SetBase(packet_feedback.sequence_number, 440 feedback->SetBase(packet_feedback.sequence_number,
415 packet_feedback.arrival_time_ms * 1000); 441 packet_feedback.arrival_time_ms * 1000);
416 EXPECT_TRUE(feedback->AddReceivedPacket( 442 EXPECT_TRUE(feedback->AddReceivedPacket(
417 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000)); 443 packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000));
418 raw_packet = feedback->Build(); 444 raw_packet = feedback->Build();
419 feedback = 445 feedback =
420 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size()); 446 rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 EXPECT_TRUE(feedback.get() != nullptr); 479 EXPECT_TRUE(feedback.get() != nullptr);
454 adapter_->OnTransportFeedback(*feedback.get()); 480 adapter_->OnTransportFeedback(*feedback.get());
455 clock_.AdvanceTimeMilliseconds(50); 481 clock_.AdvanceTimeMilliseconds(50);
456 ++seq_num; 482 ++seq_num;
457 } 483 }
458 EXPECT_GT(target_bitrate_bps_, 0u); 484 EXPECT_GT(target_bitrate_bps_, 0u);
459 } 485 }
460 486
461 } // namespace test 487 } // namespace test
462 } // namespace webrtc 488 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698