rtp_rtcp_impl_unittest.cc revision ff761fba8274d93bd73e76c8b8a1f2d0776dd840
1/* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#include "testing/gmock/include/gmock/gmock.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14#include "webrtc/common_types.h" 15#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 16#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 17#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 18#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" 19#include "webrtc/system_wrappers/include/scoped_vector.h" 20#include "webrtc/test/rtcp_packet_parser.h" 21 22using ::testing::_; 23using ::testing::ElementsAre; 24using ::testing::NiceMock; 25using ::testing::Return; 26using ::testing::SaveArg; 27 28namespace webrtc { 29namespace { 30const uint32_t kSenderSsrc = 0x12345; 31const uint32_t kReceiverSsrc = 0x23456; 32const int64_t kOneWayNetworkDelayMs = 100; 33const uint8_t kBaseLayerTid = 0; 34const uint8_t kHigherLayerTid = 1; 35const uint16_t kSequenceNumber = 100; 36 37class RtcpRttStatsTestImpl : public RtcpRttStats { 38 public: 39 RtcpRttStatsTestImpl() : rtt_ms_(0) {} 40 virtual ~RtcpRttStatsTestImpl() {} 41 42 void OnRttUpdate(int64_t rtt_ms) override { rtt_ms_ = rtt_ms; } 43 int64_t LastProcessedRtt() const override { return rtt_ms_; } 44 int64_t rtt_ms_; 45}; 46 47class SendTransport : public Transport, 48 public NullRtpData { 49 public: 50 SendTransport() 51 : receiver_(NULL), 52 clock_(NULL), 53 delay_ms_(0), 54 rtp_packets_sent_(0) { 55 } 56 57 void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) { 58 receiver_ = receiver; 59 } 60 void SimulateNetworkDelay(int64_t delay_ms, SimulatedClock* clock) { 61 clock_ = clock; 62 delay_ms_ = delay_ms; 63 } 64 bool SendRtp(const uint8_t* data, 65 size_t len, 66 const PacketOptions& options) override { 67 RTPHeader header; 68 rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); 69 EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data), len, &header)); 70 ++rtp_packets_sent_; 71 last_rtp_header_ = header; 72 return true; 73 } 74 bool SendRtcp(const uint8_t* data, size_t len) override { 75 test::RtcpPacketParser parser; 76 parser.Parse(static_cast<const uint8_t*>(data), len); 77 last_nack_list_ = parser.nack_item()->last_nack_list(); 78 79 if (clock_) { 80 clock_->AdvanceTimeMilliseconds(delay_ms_); 81 } 82 EXPECT_TRUE(receiver_ != NULL); 83 EXPECT_EQ(0, receiver_->IncomingRtcpPacket( 84 static_cast<const uint8_t*>(data), len)); 85 return true; 86 } 87 ModuleRtpRtcpImpl* receiver_; 88 SimulatedClock* clock_; 89 int64_t delay_ms_; 90 int rtp_packets_sent_; 91 RTPHeader last_rtp_header_; 92 std::vector<uint16_t> last_nack_list_; 93}; 94 95class RtpRtcpModule : public RtcpPacketTypeCounterObserver { 96 public: 97 RtpRtcpModule(SimulatedClock* clock) 98 : receive_statistics_(ReceiveStatistics::Create(clock)) { 99 RtpRtcp::Configuration config; 100 config.audio = false; 101 config.clock = clock; 102 config.outgoing_transport = &transport_; 103 config.receive_statistics = receive_statistics_.get(); 104 config.rtcp_packet_type_counter_observer = this; 105 config.rtt_stats = &rtt_stats_; 106 107 impl_.reset(new ModuleRtpRtcpImpl(config)); 108 impl_->SetRTCPStatus(RtcpMode::kCompound); 109 110 transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock); 111 } 112 113 RtcpPacketTypeCounter packets_sent_; 114 RtcpPacketTypeCounter packets_received_; 115 rtc::scoped_ptr<ReceiveStatistics> receive_statistics_; 116 SendTransport transport_; 117 RtcpRttStatsTestImpl rtt_stats_; 118 rtc::scoped_ptr<ModuleRtpRtcpImpl> impl_; 119 uint32_t remote_ssrc_; 120 121 void SetRemoteSsrc(uint32_t ssrc) { 122 remote_ssrc_ = ssrc; 123 impl_->SetRemoteSSRC(ssrc); 124 } 125 126 void RtcpPacketTypesCounterUpdated( 127 uint32_t ssrc, 128 const RtcpPacketTypeCounter& packet_counter) override { 129 counter_map_[ssrc] = packet_counter; 130 } 131 132 RtcpPacketTypeCounter RtcpSent() { 133 // RTCP counters for remote SSRC. 134 return counter_map_[remote_ssrc_]; 135 } 136 137 RtcpPacketTypeCounter RtcpReceived() { 138 // Received RTCP stats for (own) local SSRC. 139 return counter_map_[impl_->SSRC()]; 140 } 141 int RtpSent() { 142 return transport_.rtp_packets_sent_; 143 } 144 uint16_t LastRtpSequenceNumber() { 145 return transport_.last_rtp_header_.sequenceNumber; 146 } 147 std::vector<uint16_t> LastNackListSent() { 148 return transport_.last_nack_list_; 149 } 150 151 private: 152 std::map<uint32_t, RtcpPacketTypeCounter> counter_map_; 153}; 154} // namespace 155 156class RtpRtcpImplTest : public ::testing::Test { 157 protected: 158 RtpRtcpImplTest() 159 : clock_(133590000000000), 160 sender_(&clock_), 161 receiver_(&clock_) { 162 // Send module. 163 EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true)); 164 sender_.impl_->SetSendingMediaStatus(true); 165 sender_.impl_->SetSSRC(kSenderSsrc); 166 sender_.SetRemoteSsrc(kReceiverSsrc); 167 sender_.impl_->SetSequenceNumber(kSequenceNumber); 168 sender_.impl_->SetStorePacketsStatus(true, 100); 169 170 memset(&codec_, 0, sizeof(VideoCodec)); 171 codec_.plType = 100; 172 strncpy(codec_.plName, "VP8", 3); 173 codec_.width = 320; 174 codec_.height = 180; 175 EXPECT_EQ(0, sender_.impl_->RegisterSendPayload(codec_)); 176 177 // Receive module. 178 EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false)); 179 receiver_.impl_->SetSendingMediaStatus(false); 180 receiver_.impl_->SetSSRC(kReceiverSsrc); 181 receiver_.SetRemoteSsrc(kSenderSsrc); 182 // Transport settings. 183 sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get()); 184 receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get()); 185 } 186 SimulatedClock clock_; 187 RtpRtcpModule sender_; 188 RtpRtcpModule receiver_; 189 VideoCodec codec_; 190 191 void SendFrame(const RtpRtcpModule* module, uint8_t tid) { 192 RTPVideoHeaderVP8 vp8_header = {}; 193 vp8_header.temporalIdx = tid; 194 RTPVideoHeader rtp_video_header = {codec_.width, 195 codec_.height, 196 kVideoRotation_0, 197 true, 198 0, 199 kRtpVideoVp8, 200 {vp8_header}}; 201 202 const uint8_t payload[100] = {0}; 203 EXPECT_EQ(0, module->impl_->SendOutgoingData(kVideoFrameKey, 204 codec_.plType, 205 0, 206 0, 207 payload, 208 sizeof(payload), 209 NULL, 210 &rtp_video_header)); 211 } 212 213 void IncomingRtcpNack(const RtpRtcpModule* module, uint16_t sequence_number) { 214 bool sender = module->impl_->SSRC() == kSenderSsrc; 215 rtcp::Nack nack; 216 uint16_t list[1]; 217 list[0] = sequence_number; 218 const uint16_t kListLength = sizeof(list) / sizeof(list[0]); 219 nack.From(sender ? kReceiverSsrc : kSenderSsrc); 220 nack.To(sender ? kSenderSsrc : kReceiverSsrc); 221 nack.WithList(list, kListLength); 222 rtc::scoped_ptr<rtcp::RawPacket> packet(nack.Build()); 223 EXPECT_EQ(0, module->impl_->IncomingRtcpPacket(packet->Buffer(), 224 packet->Length())); 225 } 226}; 227 228TEST_F(RtpRtcpImplTest, SetSelectiveRetransmissions_BaseLayer) { 229 sender_.impl_->SetSelectiveRetransmissions(kRetransmitBaseLayer); 230 EXPECT_EQ(kRetransmitBaseLayer, sender_.impl_->SelectiveRetransmissions()); 231 232 // Send frames. 233 EXPECT_EQ(0, sender_.RtpSent()); 234 SendFrame(&sender_, kBaseLayerTid); // kSequenceNumber 235 SendFrame(&sender_, kHigherLayerTid); // kSequenceNumber + 1 236 SendFrame(&sender_, kNoTemporalIdx); // kSequenceNumber + 2 237 EXPECT_EQ(3, sender_.RtpSent()); 238 EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber()); 239 240 // Min required delay until retransmit = 5 + RTT ms (RTT = 0). 241 clock_.AdvanceTimeMilliseconds(5); 242 243 // Frame with kBaseLayerTid re-sent. 244 IncomingRtcpNack(&sender_, kSequenceNumber); 245 EXPECT_EQ(4, sender_.RtpSent()); 246 EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber()); 247 // Frame with kHigherLayerTid not re-sent. 248 IncomingRtcpNack(&sender_, kSequenceNumber + 1); 249 EXPECT_EQ(4, sender_.RtpSent()); 250 // Frame with kNoTemporalIdx re-sent. 251 IncomingRtcpNack(&sender_, kSequenceNumber + 2); 252 EXPECT_EQ(5, sender_.RtpSent()); 253 EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber()); 254} 255 256TEST_F(RtpRtcpImplTest, SetSelectiveRetransmissions_HigherLayers) { 257 const uint8_t kSetting = kRetransmitBaseLayer + kRetransmitHigherLayers; 258 sender_.impl_->SetSelectiveRetransmissions(kSetting); 259 EXPECT_EQ(kSetting, sender_.impl_->SelectiveRetransmissions()); 260 261 // Send frames. 262 EXPECT_EQ(0, sender_.RtpSent()); 263 SendFrame(&sender_, kBaseLayerTid); // kSequenceNumber 264 SendFrame(&sender_, kHigherLayerTid); // kSequenceNumber + 1 265 SendFrame(&sender_, kNoTemporalIdx); // kSequenceNumber + 2 266 EXPECT_EQ(3, sender_.RtpSent()); 267 EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber()); 268 269 // Min required delay until retransmit = 5 + RTT ms (RTT = 0). 270 clock_.AdvanceTimeMilliseconds(5); 271 272 // Frame with kBaseLayerTid re-sent. 273 IncomingRtcpNack(&sender_, kSequenceNumber); 274 EXPECT_EQ(4, sender_.RtpSent()); 275 EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber()); 276 // Frame with kHigherLayerTid re-sent. 277 IncomingRtcpNack(&sender_, kSequenceNumber + 1); 278 EXPECT_EQ(5, sender_.RtpSent()); 279 EXPECT_EQ(kSequenceNumber + 1, sender_.LastRtpSequenceNumber()); 280 // Frame with kNoTemporalIdx re-sent. 281 IncomingRtcpNack(&sender_, kSequenceNumber + 2); 282 EXPECT_EQ(6, sender_.RtpSent()); 283 EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber()); 284} 285 286TEST_F(RtpRtcpImplTest, Rtt) { 287 RTPHeader header; 288 header.timestamp = 1; 289 header.sequenceNumber = 123; 290 header.ssrc = kSenderSsrc; 291 header.headerLength = 12; 292 receiver_.receive_statistics_->IncomingPacket(header, 100, false); 293 294 // Sender module should send a SR. 295 EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport)); 296 297 // Receiver module should send a RR with a response to the last received SR. 298 clock_.AdvanceTimeMilliseconds(1000); 299 EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport)); 300 301 // Verify RTT. 302 int64_t rtt; 303 int64_t avg_rtt; 304 int64_t min_rtt; 305 int64_t max_rtt; 306 EXPECT_EQ(0, 307 sender_.impl_->RTT(kReceiverSsrc, &rtt, &avg_rtt, &min_rtt, &max_rtt)); 308 EXPECT_EQ(2 * kOneWayNetworkDelayMs, rtt); 309 EXPECT_EQ(2 * kOneWayNetworkDelayMs, avg_rtt); 310 EXPECT_EQ(2 * kOneWayNetworkDelayMs, min_rtt); 311 EXPECT_EQ(2 * kOneWayNetworkDelayMs, max_rtt); 312 313 // No RTT from other ssrc. 314 EXPECT_EQ(-1, 315 sender_.impl_->RTT(kReceiverSsrc+1, &rtt, &avg_rtt, &min_rtt, &max_rtt)); 316 317 // Verify RTT from rtt_stats config. 318 EXPECT_EQ(0, sender_.rtt_stats_.LastProcessedRtt()); 319 EXPECT_EQ(0, sender_.impl_->rtt_ms()); 320 sender_.impl_->Process(); 321 EXPECT_EQ(2 * kOneWayNetworkDelayMs, sender_.rtt_stats_.LastProcessedRtt()); 322 EXPECT_EQ(2 * kOneWayNetworkDelayMs, sender_.impl_->rtt_ms()); 323} 324 325TEST_F(RtpRtcpImplTest, SetRtcpXrRrtrStatus) { 326 EXPECT_FALSE(receiver_.impl_->RtcpXrRrtrStatus()); 327 receiver_.impl_->SetRtcpXrRrtrStatus(true); 328 EXPECT_TRUE(receiver_.impl_->RtcpXrRrtrStatus()); 329} 330 331TEST_F(RtpRtcpImplTest, RttForReceiverOnly) { 332 receiver_.impl_->SetRtcpXrRrtrStatus(true); 333 334 // Receiver module should send a Receiver time reference report (RTRR). 335 EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport)); 336 337 // Sender module should send a response to the last received RTRR (DLRR). 338 clock_.AdvanceTimeMilliseconds(1000); 339 EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport)); 340 341 // Verify RTT. 342 EXPECT_EQ(0, receiver_.rtt_stats_.LastProcessedRtt()); 343 EXPECT_EQ(0, receiver_.impl_->rtt_ms()); 344 receiver_.impl_->Process(); 345 EXPECT_EQ(2 * kOneWayNetworkDelayMs, receiver_.rtt_stats_.LastProcessedRtt()); 346 EXPECT_EQ(2 * kOneWayNetworkDelayMs, receiver_.impl_->rtt_ms()); 347} 348 349TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_Nack) { 350 EXPECT_EQ(-1, receiver_.RtcpSent().first_packet_time_ms); 351 EXPECT_EQ(-1, sender_.RtcpReceived().first_packet_time_ms); 352 EXPECT_EQ(0U, sender_.RtcpReceived().nack_packets); 353 EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets); 354 355 // Receive module sends a NACK. 356 const uint16_t kNackLength = 1; 357 uint16_t nack_list[kNackLength] = {123}; 358 EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength)); 359 EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets); 360 EXPECT_GT(receiver_.RtcpSent().first_packet_time_ms, -1); 361 362 // Send module receives the NACK. 363 EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets); 364 EXPECT_GT(sender_.RtcpReceived().first_packet_time_ms, -1); 365} 366 367TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_FirAndPli) { 368 EXPECT_EQ(0U, sender_.RtcpReceived().fir_packets); 369 EXPECT_EQ(0U, receiver_.RtcpSent().fir_packets); 370 // Receive module sends a FIR. 371 EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpFir)); 372 EXPECT_EQ(1U, receiver_.RtcpSent().fir_packets); 373 // Send module receives the FIR. 374 EXPECT_EQ(1U, sender_.RtcpReceived().fir_packets); 375 376 // Receive module sends a FIR and PLI. 377 std::set<RTCPPacketType> packet_types; 378 packet_types.insert(kRtcpFir); 379 packet_types.insert(kRtcpPli); 380 EXPECT_EQ(0, receiver_.impl_->SendCompoundRTCP(packet_types)); 381 EXPECT_EQ(2U, receiver_.RtcpSent().fir_packets); 382 EXPECT_EQ(1U, receiver_.RtcpSent().pli_packets); 383 // Send module receives the FIR and PLI. 384 EXPECT_EQ(2U, sender_.RtcpReceived().fir_packets); 385 EXPECT_EQ(1U, sender_.RtcpReceived().pli_packets); 386} 387 388TEST_F(RtpRtcpImplTest, AddStreamDataCounters) { 389 StreamDataCounters rtp; 390 const int64_t kStartTimeMs = 1; 391 rtp.first_packet_time_ms = kStartTimeMs; 392 rtp.transmitted.packets = 1; 393 rtp.transmitted.payload_bytes = 1; 394 rtp.transmitted.header_bytes = 2; 395 rtp.transmitted.padding_bytes = 3; 396 EXPECT_EQ(rtp.transmitted.TotalBytes(), rtp.transmitted.payload_bytes + 397 rtp.transmitted.header_bytes + 398 rtp.transmitted.padding_bytes); 399 400 StreamDataCounters rtp2; 401 rtp2.first_packet_time_ms = -1; 402 rtp2.transmitted.packets = 10; 403 rtp2.transmitted.payload_bytes = 10; 404 rtp2.retransmitted.header_bytes = 4; 405 rtp2.retransmitted.payload_bytes = 5; 406 rtp2.retransmitted.padding_bytes = 6; 407 rtp2.retransmitted.packets = 7; 408 rtp2.fec.packets = 8; 409 410 StreamDataCounters sum = rtp; 411 sum.Add(rtp2); 412 EXPECT_EQ(kStartTimeMs, sum.first_packet_time_ms); 413 EXPECT_EQ(11U, sum.transmitted.packets); 414 EXPECT_EQ(11U, sum.transmitted.payload_bytes); 415 EXPECT_EQ(2U, sum.transmitted.header_bytes); 416 EXPECT_EQ(3U, sum.transmitted.padding_bytes); 417 EXPECT_EQ(4U, sum.retransmitted.header_bytes); 418 EXPECT_EQ(5U, sum.retransmitted.payload_bytes); 419 EXPECT_EQ(6U, sum.retransmitted.padding_bytes); 420 EXPECT_EQ(7U, sum.retransmitted.packets); 421 EXPECT_EQ(8U, sum.fec.packets); 422 EXPECT_EQ(sum.transmitted.TotalBytes(), 423 rtp.transmitted.TotalBytes() + rtp2.transmitted.TotalBytes()); 424 425 StreamDataCounters rtp3; 426 rtp3.first_packet_time_ms = kStartTimeMs + 10; 427 sum.Add(rtp3); 428 EXPECT_EQ(kStartTimeMs, sum.first_packet_time_ms); // Holds oldest time. 429} 430 431TEST_F(RtpRtcpImplTest, SendsInitialNackList) { 432 // Send module sends a NACK. 433 const uint16_t kNackLength = 1; 434 uint16_t nack_list[kNackLength] = {123}; 435 EXPECT_EQ(0U, sender_.RtcpSent().nack_packets); 436 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); 437 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); 438 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123)); 439} 440 441TEST_F(RtpRtcpImplTest, SendsExtendedNackList) { 442 // Send module sends a NACK. 443 const uint16_t kNackLength = 1; 444 uint16_t nack_list[kNackLength] = {123}; 445 EXPECT_EQ(0U, sender_.RtcpSent().nack_packets); 446 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); 447 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); 448 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123)); 449 450 // Same list not re-send. 451 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); 452 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); 453 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123)); 454 455 // Only extended list sent. 456 const uint16_t kNackExtLength = 2; 457 uint16_t nack_list_ext[kNackExtLength] = {123, 124}; 458 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list_ext, kNackExtLength)); 459 EXPECT_EQ(2U, sender_.RtcpSent().nack_packets); 460 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(124)); 461} 462 463TEST_F(RtpRtcpImplTest, ReSendsNackListAfterRttMs) { 464 sender_.transport_.SimulateNetworkDelay(0, &clock_); 465 // Send module sends a NACK. 466 const uint16_t kNackLength = 2; 467 uint16_t nack_list[kNackLength] = {123, 125}; 468 EXPECT_EQ(0U, sender_.RtcpSent().nack_packets); 469 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); 470 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); 471 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125)); 472 473 // Same list not re-send, rtt interval has not passed. 474 const int kStartupRttMs = 100; 475 clock_.AdvanceTimeMilliseconds(kStartupRttMs); 476 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); 477 EXPECT_EQ(1U, sender_.RtcpSent().nack_packets); 478 479 // Rtt interval passed, full list sent. 480 clock_.AdvanceTimeMilliseconds(1); 481 EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength)); 482 EXPECT_EQ(2U, sender_.RtcpSent().nack_packets); 483 EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125)); 484} 485 486TEST_F(RtpRtcpImplTest, UniqueNackRequests) { 487 receiver_.transport_.SimulateNetworkDelay(0, &clock_); 488 EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets); 489 EXPECT_EQ(0U, receiver_.RtcpSent().nack_requests); 490 EXPECT_EQ(0U, receiver_.RtcpSent().unique_nack_requests); 491 EXPECT_EQ(0, receiver_.RtcpSent().UniqueNackRequestsInPercent()); 492 493 // Receive module sends NACK request. 494 const uint16_t kNackLength = 4; 495 uint16_t nack_list[kNackLength] = {10, 11, 13, 18}; 496 EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength)); 497 EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets); 498 EXPECT_EQ(4U, receiver_.RtcpSent().nack_requests); 499 EXPECT_EQ(4U, receiver_.RtcpSent().unique_nack_requests); 500 EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(10, 11, 13, 18)); 501 502 // Send module receives the request. 503 EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets); 504 EXPECT_EQ(4U, sender_.RtcpReceived().nack_requests); 505 EXPECT_EQ(4U, sender_.RtcpReceived().unique_nack_requests); 506 EXPECT_EQ(100, sender_.RtcpReceived().UniqueNackRequestsInPercent()); 507 508 // Receive module sends new request with duplicated packets. 509 const int kStartupRttMs = 100; 510 clock_.AdvanceTimeMilliseconds(kStartupRttMs + 1); 511 const uint16_t kNackLength2 = 4; 512 uint16_t nack_list2[kNackLength2] = {11, 18, 20, 21}; 513 EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list2, kNackLength2)); 514 EXPECT_EQ(2U, receiver_.RtcpSent().nack_packets); 515 EXPECT_EQ(8U, receiver_.RtcpSent().nack_requests); 516 EXPECT_EQ(6U, receiver_.RtcpSent().unique_nack_requests); 517 EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(11, 18, 20, 21)); 518 519 // Send module receives the request. 520 EXPECT_EQ(2U, sender_.RtcpReceived().nack_packets); 521 EXPECT_EQ(8U, sender_.RtcpReceived().nack_requests); 522 EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests); 523 EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent()); 524} 525 526} // namespace webrtc 527