xref: /aosp_15_r20/external/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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 "modules/rtp_rtcp/source/rtp_rtcp_impl.h"
12 
13 #include <map>
14 #include <memory>
15 #include <set>
16 
17 #include "api/transport/field_trial_based_config.h"
18 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
19 #include "modules/rtp_rtcp/source/rtcp_packet.h"
20 #include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
21 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
22 #include "modules/rtp_rtcp/source/rtp_sender_video.h"
23 #include "rtc_base/rate_limiter.h"
24 #include "test/gmock.h"
25 #include "test/gtest.h"
26 #include "test/rtcp_packet_parser.h"
27 
28 using ::testing::ElementsAre;
29 using ::testing::Eq;
30 using ::testing::Field;
31 using ::testing::Gt;
32 using ::testing::Not;
33 using ::testing::Optional;
34 
35 namespace webrtc {
36 namespace {
37 const uint32_t kSenderSsrc = 0x12345;
38 const uint32_t kReceiverSsrc = 0x23456;
39 const int64_t kOneWayNetworkDelayMs = 100;
40 const uint8_t kBaseLayerTid = 0;
41 const uint8_t kHigherLayerTid = 1;
42 const uint16_t kSequenceNumber = 100;
43 const uint8_t kPayloadType = 100;
44 const int kWidth = 320;
45 const int kHeight = 100;
46 
47 #pragma clang diagnostic push
48 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
49 
50 class RtcpRttStatsTestImpl : public RtcpRttStats {
51  public:
RtcpRttStatsTestImpl()52   RtcpRttStatsTestImpl() : rtt_ms_(0) {}
53   ~RtcpRttStatsTestImpl() override = default;
54 
OnRttUpdate(int64_t rtt_ms)55   void OnRttUpdate(int64_t rtt_ms) override { rtt_ms_ = rtt_ms; }
LastProcessedRtt() const56   int64_t LastProcessedRtt() const override { return rtt_ms_; }
57   int64_t rtt_ms_;
58 };
59 
60 class SendTransport : public Transport {
61  public:
SendTransport()62   SendTransport()
63       : receiver_(nullptr),
64         clock_(nullptr),
65         delay_ms_(0),
66         rtp_packets_sent_(0),
67         rtcp_packets_sent_(0) {}
68 
SetRtpRtcpModule(ModuleRtpRtcpImpl * receiver)69   void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) { receiver_ = receiver; }
SimulateNetworkDelay(int64_t delay_ms,SimulatedClock * clock)70   void SimulateNetworkDelay(int64_t delay_ms, SimulatedClock* clock) {
71     clock_ = clock;
72     delay_ms_ = delay_ms;
73   }
SendRtp(const uint8_t * data,size_t len,const PacketOptions & options)74   bool SendRtp(const uint8_t* data,
75                size_t len,
76                const PacketOptions& options) override {
77     RtpPacket packet;
78     EXPECT_TRUE(packet.Parse(data, len));
79     ++rtp_packets_sent_;
80     last_rtp_sequence_number_ = packet.SequenceNumber();
81     return true;
82   }
SendRtcp(const uint8_t * data,size_t len)83   bool SendRtcp(const uint8_t* data, size_t len) override {
84     test::RtcpPacketParser parser;
85     parser.Parse(data, len);
86     last_nack_list_ = parser.nack()->packet_ids();
87 
88     if (clock_) {
89       clock_->AdvanceTimeMilliseconds(delay_ms_);
90     }
91     EXPECT_TRUE(receiver_);
92     receiver_->IncomingRtcpPacket(data, len);
93     ++rtcp_packets_sent_;
94     return true;
95   }
NumRtcpSent()96   size_t NumRtcpSent() { return rtcp_packets_sent_; }
97   ModuleRtpRtcpImpl* receiver_;
98   SimulatedClock* clock_;
99   int64_t delay_ms_;
100   int rtp_packets_sent_;
101   size_t rtcp_packets_sent_;
102   uint16_t last_rtp_sequence_number_;
103   std::vector<uint16_t> last_nack_list_;
104 };
105 
106 class RtpRtcpModule : public RtcpPacketTypeCounterObserver {
107  public:
RtpRtcpModule(SimulatedClock * clock,bool is_sender)108   RtpRtcpModule(SimulatedClock* clock, bool is_sender)
109       : is_sender_(is_sender),
110         receive_statistics_(ReceiveStatistics::Create(clock)),
111         clock_(clock) {
112     CreateModuleImpl();
113     transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock);
114   }
115 
116   const bool is_sender_;
117   RtcpPacketTypeCounter packets_sent_;
118   RtcpPacketTypeCounter packets_received_;
119   std::unique_ptr<ReceiveStatistics> receive_statistics_;
120   SendTransport transport_;
121   RtcpRttStatsTestImpl rtt_stats_;
122   std::unique_ptr<ModuleRtpRtcpImpl> impl_;
123   int rtcp_report_interval_ms_ = 0;
124 
RtcpPacketTypesCounterUpdated(uint32_t ssrc,const RtcpPacketTypeCounter & packet_counter)125   void RtcpPacketTypesCounterUpdated(
126       uint32_t ssrc,
127       const RtcpPacketTypeCounter& packet_counter) override {
128     counter_map_[ssrc] = packet_counter;
129   }
130 
RtcpSent()131   RtcpPacketTypeCounter RtcpSent() {
132     // RTCP counters for remote SSRC.
133     return counter_map_[is_sender_ ? kReceiverSsrc : kSenderSsrc];
134   }
135 
RtcpReceived()136   RtcpPacketTypeCounter RtcpReceived() {
137     // Received RTCP stats for (own) local SSRC.
138     return counter_map_[impl_->SSRC()];
139   }
RtpSent()140   int RtpSent() { return transport_.rtp_packets_sent_; }
LastRtpSequenceNumber()141   uint16_t LastRtpSequenceNumber() {
142     return transport_.last_rtp_sequence_number_;
143   }
LastNackListSent()144   std::vector<uint16_t> LastNackListSent() {
145     return transport_.last_nack_list_;
146   }
SetRtcpReportIntervalAndReset(int rtcp_report_interval_ms)147   void SetRtcpReportIntervalAndReset(int rtcp_report_interval_ms) {
148     rtcp_report_interval_ms_ = rtcp_report_interval_ms;
149     CreateModuleImpl();
150   }
151 
152  private:
CreateModuleImpl()153   void CreateModuleImpl() {
154     RtpRtcpInterface::Configuration config;
155     config.audio = false;
156     config.clock = clock_;
157     config.outgoing_transport = &transport_;
158     config.receive_statistics = receive_statistics_.get();
159     config.rtcp_packet_type_counter_observer = this;
160     config.rtt_stats = &rtt_stats_;
161     config.rtcp_report_interval_ms = rtcp_report_interval_ms_;
162     config.local_media_ssrc = is_sender_ ? kSenderSsrc : kReceiverSsrc;
163     config.need_rtp_packet_infos = true;
164     config.non_sender_rtt_measurement = true;
165 
166     impl_.reset(new ModuleRtpRtcpImpl(config));
167     impl_->SetRemoteSSRC(is_sender_ ? kReceiverSsrc : kSenderSsrc);
168     impl_->SetRTCPStatus(RtcpMode::kCompound);
169   }
170 
171   SimulatedClock* const clock_;
172   std::map<uint32_t, RtcpPacketTypeCounter> counter_map_;
173 };
174 }  // namespace
175 
176 class RtpRtcpImplTest : public ::testing::Test {
177  protected:
RtpRtcpImplTest()178   RtpRtcpImplTest()
179       : clock_(133590000000000),
180         sender_(&clock_, /*is_sender=*/true),
181         receiver_(&clock_, /*is_sender=*/false) {}
182 
SetUp()183   void SetUp() override {
184     // Send module.
185     EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true));
186     sender_.impl_->SetSendingMediaStatus(true);
187     sender_.impl_->SetSequenceNumber(kSequenceNumber);
188     sender_.impl_->SetStorePacketsStatus(true, 100);
189 
190     FieldTrialBasedConfig field_trials;
191     RTPSenderVideo::Config video_config;
192     video_config.clock = &clock_;
193     video_config.rtp_sender = sender_.impl_->RtpSender();
194     video_config.field_trials = &field_trials;
195     sender_video_ = std::make_unique<RTPSenderVideo>(video_config);
196 
197     // Receive module.
198     EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false));
199     receiver_.impl_->SetSendingMediaStatus(false);
200     // Transport settings.
201     sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get());
202     receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get());
203   }
204 
205   SimulatedClock clock_;
206   RtpRtcpModule sender_;
207   std::unique_ptr<RTPSenderVideo> sender_video_;
208   RtpRtcpModule receiver_;
209 
SendFrame(const RtpRtcpModule * module,RTPSenderVideo * sender,uint8_t tid)210   void SendFrame(const RtpRtcpModule* module,
211                  RTPSenderVideo* sender,
212                  uint8_t tid) {
213     RTPVideoHeaderVP8 vp8_header = {};
214     vp8_header.temporalIdx = tid;
215     RTPVideoHeader rtp_video_header;
216     rtp_video_header.frame_type = VideoFrameType::kVideoFrameKey;
217     rtp_video_header.width = kWidth;
218     rtp_video_header.height = kHeight;
219     rtp_video_header.rotation = kVideoRotation_0;
220     rtp_video_header.content_type = VideoContentType::UNSPECIFIED;
221     rtp_video_header.playout_delay = {-1, -1};
222     rtp_video_header.is_first_packet_in_frame = true;
223     rtp_video_header.simulcastIdx = 0;
224     rtp_video_header.codec = kVideoCodecVP8;
225     rtp_video_header.video_type_header = vp8_header;
226     rtp_video_header.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
227 
228     const uint8_t payload[100] = {0};
229     EXPECT_TRUE(module->impl_->OnSendingRtpFrame(0, 0, kPayloadType, true));
230     EXPECT_TRUE(sender->SendVideo(kPayloadType, VideoCodecType::kVideoCodecVP8,
231                                   0, 0, payload, rtp_video_header, 0));
232   }
233 
IncomingRtcpNack(const RtpRtcpModule * module,uint16_t sequence_number)234   void IncomingRtcpNack(const RtpRtcpModule* module, uint16_t sequence_number) {
235     bool sender = module->impl_->SSRC() == kSenderSsrc;
236     rtcp::Nack nack;
237     uint16_t list[1];
238     list[0] = sequence_number;
239     const uint16_t kListLength = sizeof(list) / sizeof(list[0]);
240     nack.SetSenderSsrc(sender ? kReceiverSsrc : kSenderSsrc);
241     nack.SetMediaSsrc(sender ? kSenderSsrc : kReceiverSsrc);
242     nack.SetPacketIds(list, kListLength);
243     rtc::Buffer packet = nack.Build();
244     module->impl_->IncomingRtcpPacket(packet.data(), packet.size());
245   }
246 };
247 
TEST_F(RtpRtcpImplTest,RetransmitsAllLayers)248 TEST_F(RtpRtcpImplTest, RetransmitsAllLayers) {
249   // Send frames.
250   EXPECT_EQ(0, sender_.RtpSent());
251   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);  // kSequenceNumber
252   SendFrame(&sender_, sender_video_.get(),
253             kHigherLayerTid);  // kSequenceNumber + 1
254   SendFrame(&sender_, sender_video_.get(),
255             kNoTemporalIdx);  // kSequenceNumber + 2
256   EXPECT_EQ(3, sender_.RtpSent());
257   EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
258 
259   // Min required delay until retransmit = 5 + RTT ms (RTT = 0).
260   clock_.AdvanceTimeMilliseconds(5);
261 
262   // Frame with kBaseLayerTid re-sent.
263   IncomingRtcpNack(&sender_, kSequenceNumber);
264   EXPECT_EQ(4, sender_.RtpSent());
265   EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber());
266   // Frame with kHigherLayerTid re-sent.
267   IncomingRtcpNack(&sender_, kSequenceNumber + 1);
268   EXPECT_EQ(5, sender_.RtpSent());
269   EXPECT_EQ(kSequenceNumber + 1, sender_.LastRtpSequenceNumber());
270   // Frame with kNoTemporalIdx re-sent.
271   IncomingRtcpNack(&sender_, kSequenceNumber + 2);
272   EXPECT_EQ(6, sender_.RtpSent());
273   EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
274 }
275 
TEST_F(RtpRtcpImplTest,Rtt)276 TEST_F(RtpRtcpImplTest, Rtt) {
277   RtpPacketReceived packet;
278   packet.SetTimestamp(1);
279   packet.SetSequenceNumber(123);
280   packet.SetSsrc(kSenderSsrc);
281   packet.AllocatePayload(100 - 12);
282   receiver_.receive_statistics_->OnRtpPacket(packet);
283 
284   // Send Frame before sending an SR.
285   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
286   // Sender module should send an SR.
287   EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
288 
289   // Receiver module should send a RR with a response to the last received SR.
290   clock_.AdvanceTimeMilliseconds(1000);
291   EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
292 
293   // Verify RTT.
294   int64_t rtt;
295   int64_t avg_rtt;
296   int64_t min_rtt;
297   int64_t max_rtt;
298   EXPECT_EQ(
299       0, sender_.impl_->RTT(kReceiverSsrc, &rtt, &avg_rtt, &min_rtt, &max_rtt));
300   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, rtt, 1);
301   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, avg_rtt, 1);
302   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, min_rtt, 1);
303   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, max_rtt, 1);
304 
305   // No RTT from other ssrc.
306   EXPECT_EQ(-1, sender_.impl_->RTT(kReceiverSsrc + 1, &rtt, &avg_rtt, &min_rtt,
307                                    &max_rtt));
308 
309   // Verify RTT from rtt_stats config.
310   EXPECT_EQ(0, sender_.rtt_stats_.LastProcessedRtt());
311   EXPECT_EQ(0, sender_.impl_->rtt_ms());
312   sender_.impl_->Process();
313   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.rtt_stats_.LastProcessedRtt(),
314               1);
315   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.impl_->rtt_ms(), 1);
316 }
317 
TEST_F(RtpRtcpImplTest,RttForReceiverOnly)318 TEST_F(RtpRtcpImplTest, RttForReceiverOnly) {
319   // Receiver module should send a Receiver time reference report (RTRR).
320   EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
321 
322   // Sender module should send a response to the last received RTRR (DLRR).
323   clock_.AdvanceTimeMilliseconds(1000);
324   // Send Frame before sending a SR.
325   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
326   EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
327 
328   // Verify RTT.
329   EXPECT_EQ(0, receiver_.rtt_stats_.LastProcessedRtt());
330   EXPECT_EQ(0, receiver_.impl_->rtt_ms());
331   receiver_.impl_->Process();
332   EXPECT_NEAR(2 * kOneWayNetworkDelayMs,
333               receiver_.rtt_stats_.LastProcessedRtt(), 1);
334   EXPECT_NEAR(2 * kOneWayNetworkDelayMs, receiver_.impl_->rtt_ms(), 1);
335 }
336 
TEST_F(RtpRtcpImplTest,NoSrBeforeMedia)337 TEST_F(RtpRtcpImplTest, NoSrBeforeMedia) {
338   // Ignore fake transport delays in this test.
339   sender_.transport_.SimulateNetworkDelay(0, &clock_);
340   receiver_.transport_.SimulateNetworkDelay(0, &clock_);
341 
342   sender_.impl_->Process();
343   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 0u);
344 
345   // Verify no SR is sent before media has been sent, RR should still be sent
346   // from the receiving module though.
347   clock_.AdvanceTimeMilliseconds(2000);
348   sender_.impl_->Process();
349   receiver_.impl_->Process();
350   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 0u);
351   EXPECT_EQ(receiver_.transport_.NumRtcpSent(), 1u);
352 
353   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
354   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
355 }
356 
TEST_F(RtpRtcpImplTest,RtcpPacketTypeCounter_Nack)357 TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_Nack) {
358   EXPECT_EQ(0U, sender_.RtcpReceived().nack_packets);
359   EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
360 
361   // Receive module sends a NACK.
362   const uint16_t kNackLength = 1;
363   uint16_t nack_list[kNackLength] = {123};
364   EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
365   EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
366 
367   // Send module receives the NACK.
368   EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
369 }
370 
TEST_F(RtpRtcpImplTest,AddStreamDataCounters)371 TEST_F(RtpRtcpImplTest, AddStreamDataCounters) {
372   StreamDataCounters rtp;
373   rtp.transmitted.packets = 1;
374   rtp.transmitted.payload_bytes = 1;
375   rtp.transmitted.header_bytes = 2;
376   rtp.transmitted.padding_bytes = 3;
377   EXPECT_EQ(rtp.transmitted.TotalBytes(), rtp.transmitted.payload_bytes +
378                                               rtp.transmitted.header_bytes +
379                                               rtp.transmitted.padding_bytes);
380 
381   StreamDataCounters rtp2;
382   rtp2.transmitted.packets = 10;
383   rtp2.transmitted.payload_bytes = 10;
384   rtp2.retransmitted.header_bytes = 4;
385   rtp2.retransmitted.payload_bytes = 5;
386   rtp2.retransmitted.padding_bytes = 6;
387   rtp2.retransmitted.packets = 7;
388   rtp2.fec.packets = 8;
389 
390   StreamDataCounters sum = rtp;
391   sum.Add(rtp2);
392   EXPECT_EQ(11U, sum.transmitted.packets);
393   EXPECT_EQ(11U, sum.transmitted.payload_bytes);
394   EXPECT_EQ(2U, sum.transmitted.header_bytes);
395   EXPECT_EQ(3U, sum.transmitted.padding_bytes);
396   EXPECT_EQ(4U, sum.retransmitted.header_bytes);
397   EXPECT_EQ(5U, sum.retransmitted.payload_bytes);
398   EXPECT_EQ(6U, sum.retransmitted.padding_bytes);
399   EXPECT_EQ(7U, sum.retransmitted.packets);
400   EXPECT_EQ(8U, sum.fec.packets);
401   EXPECT_EQ(sum.transmitted.TotalBytes(),
402             rtp.transmitted.TotalBytes() + rtp2.transmitted.TotalBytes());
403 }
404 
TEST_F(RtpRtcpImplTest,SendsInitialNackList)405 TEST_F(RtpRtcpImplTest, SendsInitialNackList) {
406   // Send module sends a NACK.
407   const uint16_t kNackLength = 1;
408   uint16_t nack_list[kNackLength] = {123};
409   EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
410   // Send Frame before sending a compound RTCP that starts with SR.
411   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
412   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
413   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
414   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
415 }
416 
TEST_F(RtpRtcpImplTest,SendsExtendedNackList)417 TEST_F(RtpRtcpImplTest, SendsExtendedNackList) {
418   // Send module sends a NACK.
419   const uint16_t kNackLength = 1;
420   uint16_t nack_list[kNackLength] = {123};
421   EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
422   // Send Frame before sending a compound RTCP that starts with SR.
423   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
424   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
425   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
426   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
427 
428   // Same list not re-send.
429   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
430   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
431   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
432 
433   // Only extended list sent.
434   const uint16_t kNackExtLength = 2;
435   uint16_t nack_list_ext[kNackExtLength] = {123, 124};
436   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list_ext, kNackExtLength));
437   EXPECT_EQ(2U, sender_.RtcpSent().nack_packets);
438   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(124));
439 }
440 
TEST_F(RtpRtcpImplTest,ReSendsNackListAfterRttMs)441 TEST_F(RtpRtcpImplTest, ReSendsNackListAfterRttMs) {
442   sender_.transport_.SimulateNetworkDelay(0, &clock_);
443   // Send module sends a NACK.
444   const uint16_t kNackLength = 2;
445   uint16_t nack_list[kNackLength] = {123, 125};
446   EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
447   // Send Frame before sending a compound RTCP that starts with SR.
448   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
449   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
450   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
451   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
452 
453   // Same list not re-send, rtt interval has not passed.
454   const int kStartupRttMs = 100;
455   clock_.AdvanceTimeMilliseconds(kStartupRttMs);
456   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
457   EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
458 
459   // Rtt interval passed, full list sent.
460   clock_.AdvanceTimeMilliseconds(1);
461   EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
462   EXPECT_EQ(2U, sender_.RtcpSent().nack_packets);
463   EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
464 }
465 
TEST_F(RtpRtcpImplTest,UniqueNackRequests)466 TEST_F(RtpRtcpImplTest, UniqueNackRequests) {
467   receiver_.transport_.SimulateNetworkDelay(0, &clock_);
468   EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
469   EXPECT_EQ(0U, receiver_.RtcpSent().nack_requests);
470   EXPECT_EQ(0U, receiver_.RtcpSent().unique_nack_requests);
471   EXPECT_EQ(0, receiver_.RtcpSent().UniqueNackRequestsInPercent());
472 
473   // Receive module sends NACK request.
474   const uint16_t kNackLength = 4;
475   uint16_t nack_list[kNackLength] = {10, 11, 13, 18};
476   EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
477   EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
478   EXPECT_EQ(4U, receiver_.RtcpSent().nack_requests);
479   EXPECT_EQ(4U, receiver_.RtcpSent().unique_nack_requests);
480   EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(10, 11, 13, 18));
481 
482   // Send module receives the request.
483   EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
484   EXPECT_EQ(4U, sender_.RtcpReceived().nack_requests);
485   EXPECT_EQ(4U, sender_.RtcpReceived().unique_nack_requests);
486   EXPECT_EQ(100, sender_.RtcpReceived().UniqueNackRequestsInPercent());
487 
488   // Receive module sends new request with duplicated packets.
489   const int kStartupRttMs = 100;
490   clock_.AdvanceTimeMilliseconds(kStartupRttMs + 1);
491   const uint16_t kNackLength2 = 4;
492   uint16_t nack_list2[kNackLength2] = {11, 18, 20, 21};
493   EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list2, kNackLength2));
494   EXPECT_EQ(2U, receiver_.RtcpSent().nack_packets);
495   EXPECT_EQ(8U, receiver_.RtcpSent().nack_requests);
496   EXPECT_EQ(6U, receiver_.RtcpSent().unique_nack_requests);
497   EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(11, 18, 20, 21));
498 
499   // Send module receives the request.
500   EXPECT_EQ(2U, sender_.RtcpReceived().nack_packets);
501   EXPECT_EQ(8U, sender_.RtcpReceived().nack_requests);
502   EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests);
503   EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent());
504 }
505 
TEST_F(RtpRtcpImplTest,ConfigurableRtcpReportInterval)506 TEST_F(RtpRtcpImplTest, ConfigurableRtcpReportInterval) {
507   const int kVideoReportInterval = 3000;
508 
509   // Recreate sender impl with new configuration, and redo setup.
510   sender_.SetRtcpReportIntervalAndReset(kVideoReportInterval);
511   SetUp();
512 
513   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
514 
515   // Initial state
516   sender_.impl_->Process();
517   EXPECT_EQ(0u, sender_.transport_.NumRtcpSent());
518 
519   // Move ahead to the last ms before a rtcp is expected, no action.
520   clock_.AdvanceTimeMilliseconds(kVideoReportInterval / 2 - 1);
521   sender_.impl_->Process();
522   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 0u);
523 
524   // Move ahead to the first rtcp. Send RTCP.
525   clock_.AdvanceTimeMilliseconds(1);
526   sender_.impl_->Process();
527   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
528 
529   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
530 
531   // Move ahead to the last possible second before second rtcp is expected.
532   clock_.AdvanceTimeMilliseconds(kVideoReportInterval * 1 / 2 - 1);
533   sender_.impl_->Process();
534   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 1u);
535 
536   // Move ahead into the range of second rtcp, the second rtcp may be sent.
537   clock_.AdvanceTimeMilliseconds(1);
538   sender_.impl_->Process();
539   EXPECT_GE(sender_.transport_.NumRtcpSent(), 1u);
540 
541   clock_.AdvanceTimeMilliseconds(kVideoReportInterval / 2);
542   sender_.impl_->Process();
543   EXPECT_GE(sender_.transport_.NumRtcpSent(), 1u);
544 
545   // Move out the range of second rtcp, the second rtcp must have been sent.
546   clock_.AdvanceTimeMilliseconds(kVideoReportInterval / 2);
547   sender_.impl_->Process();
548   EXPECT_EQ(sender_.transport_.NumRtcpSent(), 2u);
549 }
550 
TEST_F(RtpRtcpImplTest,StoresPacketInfoForSentPackets)551 TEST_F(RtpRtcpImplTest, StoresPacketInfoForSentPackets) {
552   const uint32_t kStartTimestamp = 1u;
553   SetUp();
554   sender_.impl_->SetStartTimestamp(kStartTimestamp);
555   sender_.impl_->SetSequenceNumber(1);
556 
557   PacedPacketInfo pacing_info;
558   RtpPacketToSend packet(nullptr);
559   packet.set_packet_type(RtpPacketToSend::Type::kVideo);
560   packet.SetSsrc(kSenderSsrc);
561 
562   // Single-packet frame.
563   packet.SetTimestamp(1);
564   packet.set_first_packet_of_frame(true);
565   packet.SetMarker(true);
566   sender_.impl_->TrySendPacket(&packet, pacing_info);
567 
568   std::vector<RtpSequenceNumberMap::Info> seqno_info =
569       sender_.impl_->GetSentRtpPacketInfos(std::vector<uint16_t>{1});
570 
571   EXPECT_THAT(seqno_info, ElementsAre(RtpSequenceNumberMap::Info(
572                               /*timestamp=*/1 - kStartTimestamp,
573                               /*is_first=*/1,
574                               /*is_last=*/1)));
575 
576   // Three-packet frame.
577   packet.SetTimestamp(2);
578   packet.set_first_packet_of_frame(true);
579   packet.SetMarker(false);
580   sender_.impl_->TrySendPacket(&packet, pacing_info);
581 
582   packet.set_first_packet_of_frame(false);
583   sender_.impl_->TrySendPacket(&packet, pacing_info);
584 
585   packet.SetMarker(true);
586   sender_.impl_->TrySendPacket(&packet, pacing_info);
587 
588   seqno_info =
589       sender_.impl_->GetSentRtpPacketInfos(std::vector<uint16_t>{2, 3, 4});
590 
591   EXPECT_THAT(seqno_info, ElementsAre(RtpSequenceNumberMap::Info(
592                                           /*timestamp=*/2 - kStartTimestamp,
593                                           /*is_first=*/1,
594                                           /*is_last=*/0),
595                                       RtpSequenceNumberMap::Info(
596                                           /*timestamp=*/2 - kStartTimestamp,
597                                           /*is_first=*/0,
598                                           /*is_last=*/0),
599                                       RtpSequenceNumberMap::Info(
600                                           /*timestamp=*/2 - kStartTimestamp,
601                                           /*is_first=*/0,
602                                           /*is_last=*/1)));
603 }
604 
605 // Checks that the remote sender stats are not available if no RTCP SR was sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsNotAvailable)606 TEST_F(RtpRtcpImplTest, SenderReportStatsNotAvailable) {
607   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Eq(absl::nullopt));
608 }
609 
610 // Checks that the remote sender stats are available if an RTCP SR was sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsAvailable)611 TEST_F(RtpRtcpImplTest, SenderReportStatsAvailable) {
612   // Send a frame in order to send an SR.
613   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
614   // Send an SR.
615   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
616   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Not(Eq(absl::nullopt)));
617 }
618 
619 // Checks that the remote sender stats are not available if an RTCP SR with an
620 // unexpected SSRC is received.
TEST_F(RtpRtcpImplTest,SenderReportStatsNotUpdatedWithUnexpectedSsrc)621 TEST_F(RtpRtcpImplTest, SenderReportStatsNotUpdatedWithUnexpectedSsrc) {
622   constexpr uint32_t kUnexpectedSenderSsrc = 0x87654321;
623   static_assert(kUnexpectedSenderSsrc != kSenderSsrc, "");
624   // Forge a sender report and pass it to the receiver as if an RTCP SR were
625   // sent by an unexpected sender.
626   rtcp::SenderReport sr;
627   sr.SetSenderSsrc(kUnexpectedSenderSsrc);
628   sr.SetNtp({/*seconds=*/1u, /*fractions=*/1u << 31});
629   sr.SetPacketCount(123u);
630   sr.SetOctetCount(456u);
631   auto raw_packet = sr.Build();
632   receiver_.impl_->IncomingRtcpPacket(raw_packet.data(), raw_packet.size());
633   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(), Eq(absl::nullopt));
634 }
635 
636 // Checks the stats derived from the last received RTCP SR are set correctly.
TEST_F(RtpRtcpImplTest,SenderReportStatsCheckStatsFromLastReport)637 TEST_F(RtpRtcpImplTest, SenderReportStatsCheckStatsFromLastReport) {
638   using SenderReportStats = RtpRtcpInterface::SenderReportStats;
639   const NtpTime ntp(/*seconds=*/1u, /*fractions=*/1u << 31);
640   constexpr uint32_t kPacketCount = 123u;
641   constexpr uint32_t kOctetCount = 456u;
642   // Forge a sender report and pass it to the receiver as if an RTCP SR were
643   // sent by the sender.
644   rtcp::SenderReport sr;
645   sr.SetSenderSsrc(kSenderSsrc);
646   sr.SetNtp(ntp);
647   sr.SetPacketCount(kPacketCount);
648   sr.SetOctetCount(kOctetCount);
649   auto raw_packet = sr.Build();
650   receiver_.impl_->IncomingRtcpPacket(raw_packet.data(), raw_packet.size());
651 
652   EXPECT_THAT(
653       receiver_.impl_->GetSenderReportStats(),
654       Optional(AllOf(Field(&SenderReportStats::last_remote_timestamp, Eq(ntp)),
655                      Field(&SenderReportStats::packets_sent, Eq(kPacketCount)),
656                      Field(&SenderReportStats::bytes_sent, Eq(kOctetCount)))));
657 }
658 
659 // Checks that the remote sender stats count equals the number of sent RTCP SRs.
TEST_F(RtpRtcpImplTest,SenderReportStatsCount)660 TEST_F(RtpRtcpImplTest, SenderReportStatsCount) {
661   using SenderReportStats = RtpRtcpInterface::SenderReportStats;
662   // Send a frame in order to send an SR.
663   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
664   // Send the first SR.
665   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
666   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
667               Optional(Field(&SenderReportStats::reports_count, Eq(1u))));
668   // Send the second SR.
669   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
670   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
671               Optional(Field(&SenderReportStats::reports_count, Eq(2u))));
672 }
673 
674 // Checks that the remote sender stats include a valid arrival time if an RTCP
675 // SR was sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsArrivalTimestampSet)676 TEST_F(RtpRtcpImplTest, SenderReportStatsArrivalTimestampSet) {
677   // Send a frame in order to send an SR.
678   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
679   // Send an SR.
680   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
681   auto stats = receiver_.impl_->GetSenderReportStats();
682   ASSERT_THAT(stats, Not(Eq(absl::nullopt)));
683   EXPECT_TRUE(stats->last_arrival_timestamp.Valid());
684 }
685 
686 // Checks that the packet and byte counters from an RTCP SR are not zero once
687 // a frame is sent.
TEST_F(RtpRtcpImplTest,SenderReportStatsPacketByteCounters)688 TEST_F(RtpRtcpImplTest, SenderReportStatsPacketByteCounters) {
689   using SenderReportStats = RtpRtcpInterface::SenderReportStats;
690   // Send a frame in order to send an SR.
691   SendFrame(&sender_, sender_video_.get(), kBaseLayerTid);
692   ASSERT_THAT(sender_.transport_.rtp_packets_sent_, Gt(0));
693   // Advance time otherwise the RTCP SR report will not include any packets
694   // generated by `SendFrame()`.
695   clock_.AdvanceTimeMilliseconds(1);
696   // Send an SR.
697   ASSERT_THAT(sender_.impl_->SendRTCP(kRtcpReport), Eq(0));
698   EXPECT_THAT(receiver_.impl_->GetSenderReportStats(),
699               Optional(AllOf(Field(&SenderReportStats::packets_sent, Gt(0u)),
700                              Field(&SenderReportStats::bytes_sent, Gt(0u)))));
701 }
702 
703 #pragma clang diagnostic pop
704 
705 }  // namespace webrtc
706