xref: /aosp_15_r20/external/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2012 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/rtcp_sender.h"
12 
13 #include <memory>
14 #include <utility>
15 
16 #include "absl/base/macros.h"
17 #include "api/units/time_delta.h"
18 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
19 #include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
20 #include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
21 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
22 #include "modules/rtp_rtcp/source/rtp_rtcp_impl2.h"
23 #include "rtc_base/rate_limiter.h"
24 #include "rtc_base/thread.h"
25 #include "test/gmock.h"
26 #include "test/gtest.h"
27 #include "test/mock_transport.h"
28 #include "test/rtcp_packet_parser.h"
29 
30 using ::testing::_;
31 using ::testing::ElementsAre;
32 using ::testing::Eq;
33 using ::testing::Invoke;
34 using ::testing::Property;
35 using ::testing::SizeIs;
36 
37 namespace webrtc {
38 
39 class RtcpPacketTypeCounterObserverImpl : public RtcpPacketTypeCounterObserver {
40  public:
RtcpPacketTypeCounterObserverImpl()41   RtcpPacketTypeCounterObserverImpl() : ssrc_(0) {}
42   ~RtcpPacketTypeCounterObserverImpl() override = default;
RtcpPacketTypesCounterUpdated(uint32_t ssrc,const RtcpPacketTypeCounter & packet_counter)43   void RtcpPacketTypesCounterUpdated(
44       uint32_t ssrc,
45       const RtcpPacketTypeCounter& packet_counter) override {
46     ssrc_ = ssrc;
47     counter_ = packet_counter;
48   }
49   uint32_t ssrc_;
50   RtcpPacketTypeCounter counter_;
51 };
52 
53 class TestTransport : public Transport {
54  public:
TestTransport()55   TestTransport() {}
56 
SendRtp(const uint8_t *,size_t,const PacketOptions & options)57   bool SendRtp(const uint8_t* /*data*/,
58                size_t /*len*/,
59                const PacketOptions& options) override {
60     return false;
61   }
SendRtcp(const uint8_t * data,size_t len)62   bool SendRtcp(const uint8_t* data, size_t len) override {
63     parser_.Parse(data, len);
64     return true;
65   }
66   test::RtcpPacketParser parser_;
67 };
68 
69 namespace {
70 static const uint32_t kSenderSsrc = 0x11111111;
71 static const uint32_t kRemoteSsrc = 0x22222222;
72 static const uint32_t kStartRtpTimestamp = 0x34567;
73 static const uint32_t kRtpTimestamp = 0x45678;
74 
CreateRtcpSender(const RTCPSender::Configuration & config,bool init_timestamps=true)75 std::unique_ptr<RTCPSender> CreateRtcpSender(
76     const RTCPSender::Configuration& config,
77     bool init_timestamps = true) {
78   auto rtcp_sender = std::make_unique<RTCPSender>(config);
79   rtcp_sender->SetRemoteSSRC(kRemoteSsrc);
80   if (init_timestamps) {
81     rtcp_sender->SetTimestampOffset(kStartRtpTimestamp);
82     rtcp_sender->SetLastRtpTime(kRtpTimestamp, config.clock->CurrentTime(),
83                                 /*payload_type=*/0);
84   }
85   return rtcp_sender;
86 }
87 }  // namespace
88 
89 class RtcpSenderTest : public ::testing::Test {
90  protected:
RtcpSenderTest()91   RtcpSenderTest()
92       : clock_(1335900000),
93         receive_statistics_(ReceiveStatistics::Create(&clock_)) {
94     rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl2(GetDefaultRtpRtcpConfig()));
95   }
96 
GetDefaultConfig()97   RTCPSender::Configuration GetDefaultConfig() {
98     RTCPSender::Configuration configuration;
99     configuration.audio = false;
100     configuration.clock = &clock_;
101     configuration.outgoing_transport = &test_transport_;
102     configuration.rtcp_report_interval = TimeDelta::Millis(1000);
103     configuration.receive_statistics = receive_statistics_.get();
104     configuration.local_media_ssrc = kSenderSsrc;
105     return configuration;
106   }
107 
GetDefaultRtpRtcpConfig()108   RtpRtcpInterface::Configuration GetDefaultRtpRtcpConfig() {
109     RTCPSender::Configuration config = GetDefaultConfig();
110     RtpRtcpInterface::Configuration result;
111     result.audio = config.audio;
112     result.clock = config.clock;
113     result.outgoing_transport = config.outgoing_transport;
114     result.rtcp_report_interval_ms = config.rtcp_report_interval->ms();
115     result.receive_statistics = config.receive_statistics;
116     result.local_media_ssrc = config.local_media_ssrc;
117     return result;
118   }
119 
InsertIncomingPacket(uint32_t remote_ssrc,uint16_t seq_num)120   void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) {
121     RtpPacketReceived packet;
122     packet.SetSsrc(remote_ssrc);
123     packet.SetSequenceNumber(seq_num);
124     packet.SetTimestamp(12345);
125     packet.SetPayloadSize(100 - 12);
126     receive_statistics_->OnRtpPacket(packet);
127   }
128 
parser()129   test::RtcpPacketParser* parser() { return &test_transport_.parser_; }
130 
feedback_state()131   RTCPSender::FeedbackState feedback_state() {
132     return rtp_rtcp_impl_->GetFeedbackState();
133   }
134 
135   rtc::AutoThread main_thread_;
136   SimulatedClock clock_;
137   TestTransport test_transport_;
138   std::unique_ptr<ReceiveStatistics> receive_statistics_;
139   std::unique_ptr<ModuleRtpRtcpImpl2> rtp_rtcp_impl_;
140 };
141 
TEST_F(RtcpSenderTest,SetRtcpStatus)142 TEST_F(RtcpSenderTest, SetRtcpStatus) {
143   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
144   EXPECT_EQ(RtcpMode::kOff, rtcp_sender->Status());
145   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
146   EXPECT_EQ(RtcpMode::kReducedSize, rtcp_sender->Status());
147 }
148 
TEST_F(RtcpSenderTest,SetSendingStatus)149 TEST_F(RtcpSenderTest, SetSendingStatus) {
150   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
151   EXPECT_FALSE(rtcp_sender->Sending());
152   rtcp_sender->SetSendingStatus(feedback_state(), true);
153   EXPECT_TRUE(rtcp_sender->Sending());
154 }
155 
TEST_F(RtcpSenderTest,NoPacketSentIfOff)156 TEST_F(RtcpSenderTest, NoPacketSentIfOff) {
157   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
158   rtcp_sender->SetRTCPStatus(RtcpMode::kOff);
159   EXPECT_EQ(-1, rtcp_sender->SendRTCP(feedback_state(), kRtcpSr));
160 }
161 
TEST_F(RtcpSenderTest,SendSr)162 TEST_F(RtcpSenderTest, SendSr) {
163   const uint32_t kPacketCount = 0x12345;
164   const uint32_t kOctetCount = 0x23456;
165   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
166   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
167   RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
168   rtcp_sender->SetSendingStatus(feedback_state, true);
169   feedback_state.packets_sent = kPacketCount;
170   feedback_state.media_bytes_sent = kOctetCount;
171   NtpTime ntp = clock_.CurrentNtpTime();
172   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpSr));
173   EXPECT_EQ(1, parser()->sender_report()->num_packets());
174   EXPECT_EQ(kSenderSsrc, parser()->sender_report()->sender_ssrc());
175   EXPECT_EQ(ntp, parser()->sender_report()->ntp());
176   EXPECT_EQ(kPacketCount, parser()->sender_report()->sender_packet_count());
177   EXPECT_EQ(kOctetCount, parser()->sender_report()->sender_octet_count());
178   EXPECT_EQ(kStartRtpTimestamp + kRtpTimestamp,
179             parser()->sender_report()->rtp_timestamp());
180   EXPECT_EQ(0U, parser()->sender_report()->report_blocks().size());
181 }
182 
TEST_F(RtcpSenderTest,SendConsecutiveSrWithExactSlope)183 TEST_F(RtcpSenderTest, SendConsecutiveSrWithExactSlope) {
184   const uint32_t kPacketCount = 0x12345;
185   const uint32_t kOctetCount = 0x23456;
186   const int kTimeBetweenSRsUs = 10043;  // Not exact value in milliseconds.
187   const int kExtraPackets = 30;
188   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
189   // Make sure clock is not exactly at some milliseconds point.
190   clock_.AdvanceTimeMicroseconds(kTimeBetweenSRsUs);
191   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
192   RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
193   rtcp_sender->SetSendingStatus(feedback_state, true);
194   feedback_state.packets_sent = kPacketCount;
195   feedback_state.media_bytes_sent = kOctetCount;
196 
197   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpSr));
198   EXPECT_EQ(1, parser()->sender_report()->num_packets());
199   NtpTime ntp1 = parser()->sender_report()->ntp();
200   uint32_t rtp1 = parser()->sender_report()->rtp_timestamp();
201 
202   // Send more SRs to ensure slope is always exact for different offsets
203   for (int packets = 1; packets <= kExtraPackets; ++packets) {
204     clock_.AdvanceTimeMicroseconds(kTimeBetweenSRsUs);
205     EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpSr));
206     EXPECT_EQ(packets + 1, parser()->sender_report()->num_packets());
207 
208     NtpTime ntp2 = parser()->sender_report()->ntp();
209     uint32_t rtp2 = parser()->sender_report()->rtp_timestamp();
210 
211     uint32_t ntp_diff_in_rtp_units =
212         (ntp2.ToMs() - ntp1.ToMs()) * (kVideoPayloadTypeFrequency / 1000);
213     EXPECT_EQ(rtp2 - rtp1, ntp_diff_in_rtp_units);
214   }
215 }
216 
TEST_F(RtcpSenderTest,DoNotSendSrBeforeRtp)217 TEST_F(RtcpSenderTest, DoNotSendSrBeforeRtp) {
218   RTCPSender::Configuration config;
219   config.clock = &clock_;
220   config.receive_statistics = receive_statistics_.get();
221   config.outgoing_transport = &test_transport_;
222   config.rtcp_report_interval = TimeDelta::Millis(1000);
223   config.local_media_ssrc = kSenderSsrc;
224   auto rtcp_sender = CreateRtcpSender(config, /*init_timestamps=*/false);
225   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
226   rtcp_sender->SetSendingStatus(feedback_state(), true);
227 
228   // Sender Report shouldn't be send as an SR nor as a Report.
229   rtcp_sender->SendRTCP(feedback_state(), kRtcpSr);
230   EXPECT_EQ(0, parser()->sender_report()->num_packets());
231   rtcp_sender->SendRTCP(feedback_state(), kRtcpReport);
232   EXPECT_EQ(0, parser()->sender_report()->num_packets());
233   // Other packets (e.g. Pli) are allowed, even if useless.
234   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
235   EXPECT_EQ(1, parser()->pli()->num_packets());
236 }
237 
TEST_F(RtcpSenderTest,DoNotSendCompundBeforeRtp)238 TEST_F(RtcpSenderTest, DoNotSendCompundBeforeRtp) {
239   RTCPSender::Configuration config;
240   config.clock = &clock_;
241   config.receive_statistics = receive_statistics_.get();
242   config.outgoing_transport = &test_transport_;
243   config.rtcp_report_interval = TimeDelta::Millis(1000);
244   config.local_media_ssrc = kSenderSsrc;
245   auto rtcp_sender = CreateRtcpSender(config, /*init_timestamps=*/false);
246   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
247   rtcp_sender->SetSendingStatus(feedback_state(), true);
248 
249   // In compound mode no packets are allowed (e.g. Pli) because compound mode
250   // should start with Sender Report.
251   EXPECT_EQ(-1, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
252   EXPECT_EQ(0, parser()->pli()->num_packets());
253 }
254 
TEST_F(RtcpSenderTest,SendRr)255 TEST_F(RtcpSenderTest, SendRr) {
256   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
257   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
258   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpRr));
259   EXPECT_EQ(1, parser()->receiver_report()->num_packets());
260   EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
261   EXPECT_EQ(0U, parser()->receiver_report()->report_blocks().size());
262 }
263 
TEST_F(RtcpSenderTest,DoesntSendEmptyRrInReducedSizeMode)264 TEST_F(RtcpSenderTest, DoesntSendEmptyRrInReducedSizeMode) {
265   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
266   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
267   rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
268   EXPECT_EQ(parser()->receiver_report()->num_packets(), 0);
269 }
270 
TEST_F(RtcpSenderTest,SendRrWithOneReportBlock)271 TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) {
272   const uint16_t kSeqNum = 11111;
273   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
274   InsertIncomingPacket(kRemoteSsrc, kSeqNum);
275   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
276   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpRr));
277   EXPECT_EQ(1, parser()->receiver_report()->num_packets());
278   EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
279   ASSERT_EQ(1U, parser()->receiver_report()->report_blocks().size());
280   const rtcp::ReportBlock& rb = parser()->receiver_report()->report_blocks()[0];
281   EXPECT_EQ(kRemoteSsrc, rb.source_ssrc());
282   EXPECT_EQ(0U, rb.fraction_lost());
283   EXPECT_EQ(0, rb.cumulative_lost_signed());
284   EXPECT_EQ(kSeqNum, rb.extended_high_seq_num());
285 }
286 
TEST_F(RtcpSenderTest,SendRrWithTwoReportBlocks)287 TEST_F(RtcpSenderTest, SendRrWithTwoReportBlocks) {
288   const uint16_t kSeqNum = 11111;
289   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
290   InsertIncomingPacket(kRemoteSsrc, kSeqNum);
291   InsertIncomingPacket(kRemoteSsrc + 1, kSeqNum + 1);
292   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
293   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpRr));
294   EXPECT_EQ(1, parser()->receiver_report()->num_packets());
295   EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
296   EXPECT_THAT(
297       parser()->receiver_report()->report_blocks(),
298       UnorderedElementsAre(
299           Property(&rtcp::ReportBlock::source_ssrc, Eq(kRemoteSsrc)),
300           Property(&rtcp::ReportBlock::source_ssrc, Eq(kRemoteSsrc + 1))));
301 }
302 
TEST_F(RtcpSenderTest,SendSdes)303 TEST_F(RtcpSenderTest, SendSdes) {
304   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
305   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
306   EXPECT_EQ(0, rtcp_sender->SetCNAME("alice@host"));
307   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpSdes));
308   EXPECT_EQ(1, parser()->sdes()->num_packets());
309   EXPECT_EQ(1U, parser()->sdes()->chunks().size());
310   EXPECT_EQ(kSenderSsrc, parser()->sdes()->chunks()[0].ssrc);
311   EXPECT_EQ("alice@host", parser()->sdes()->chunks()[0].cname);
312 }
313 
TEST_F(RtcpSenderTest,SdesIncludedInCompoundPacket)314 TEST_F(RtcpSenderTest, SdesIncludedInCompoundPacket) {
315   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
316   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
317   EXPECT_EQ(0, rtcp_sender->SetCNAME("alice@host"));
318   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
319   EXPECT_EQ(1, parser()->receiver_report()->num_packets());
320   EXPECT_EQ(1, parser()->sdes()->num_packets());
321   EXPECT_EQ(1U, parser()->sdes()->chunks().size());
322 }
323 
TEST_F(RtcpSenderTest,SendBye)324 TEST_F(RtcpSenderTest, SendBye) {
325   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
326   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
327   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpBye));
328   EXPECT_EQ(1, parser()->bye()->num_packets());
329   EXPECT_EQ(kSenderSsrc, parser()->bye()->sender_ssrc());
330 }
331 
TEST_F(RtcpSenderTest,StopSendingTriggersBye)332 TEST_F(RtcpSenderTest, StopSendingTriggersBye) {
333   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
334   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
335   rtcp_sender->SetSendingStatus(feedback_state(), true);
336   rtcp_sender->SetSendingStatus(feedback_state(), false);
337   EXPECT_EQ(1, parser()->bye()->num_packets());
338   EXPECT_EQ(kSenderSsrc, parser()->bye()->sender_ssrc());
339 }
340 
TEST_F(RtcpSenderTest,SendFir)341 TEST_F(RtcpSenderTest, SendFir) {
342   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
343   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
344   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpFir));
345   EXPECT_EQ(1, parser()->fir()->num_packets());
346   EXPECT_EQ(kSenderSsrc, parser()->fir()->sender_ssrc());
347   EXPECT_EQ(1U, parser()->fir()->requests().size());
348   EXPECT_EQ(kRemoteSsrc, parser()->fir()->requests()[0].ssrc);
349   uint8_t seq = parser()->fir()->requests()[0].seq_nr;
350   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpFir));
351   EXPECT_EQ(2, parser()->fir()->num_packets());
352   EXPECT_EQ(seq + 1, parser()->fir()->requests()[0].seq_nr);
353 }
354 
TEST_F(RtcpSenderTest,SendPli)355 TEST_F(RtcpSenderTest, SendPli) {
356   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
357   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
358   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
359   EXPECT_EQ(1, parser()->pli()->num_packets());
360   EXPECT_EQ(kSenderSsrc, parser()->pli()->sender_ssrc());
361   EXPECT_EQ(kRemoteSsrc, parser()->pli()->media_ssrc());
362 }
363 
TEST_F(RtcpSenderTest,SendNack)364 TEST_F(RtcpSenderTest, SendNack) {
365   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
366   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
367   const uint16_t kList[] = {0, 1, 16};
368   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpNack,
369                                      ABSL_ARRAYSIZE(kList), kList));
370   EXPECT_EQ(1, parser()->nack()->num_packets());
371   EXPECT_EQ(kSenderSsrc, parser()->nack()->sender_ssrc());
372   EXPECT_EQ(kRemoteSsrc, parser()->nack()->media_ssrc());
373   EXPECT_THAT(parser()->nack()->packet_ids(), ElementsAre(0, 1, 16));
374 }
375 
TEST_F(RtcpSenderTest,SendLossNotificationBufferingNotAllowed)376 TEST_F(RtcpSenderTest, SendLossNotificationBufferingNotAllowed) {
377   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
378   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
379   constexpr uint16_t kLastDecoded = 0x1234;
380   constexpr uint16_t kLastReceived = 0x4321;
381   constexpr bool kDecodabilityFlag = true;
382   constexpr bool kBufferingAllowed = false;
383   EXPECT_EQ(rtcp_sender->SendLossNotification(feedback_state(), kLastDecoded,
384                                               kLastReceived, kDecodabilityFlag,
385                                               kBufferingAllowed),
386             0);
387   EXPECT_EQ(parser()->processed_rtcp_packets(), 1u);
388   EXPECT_EQ(parser()->loss_notification()->num_packets(), 1);
389   EXPECT_EQ(kSenderSsrc, parser()->loss_notification()->sender_ssrc());
390   EXPECT_EQ(kRemoteSsrc, parser()->loss_notification()->media_ssrc());
391 }
392 
TEST_F(RtcpSenderTest,SendLossNotificationBufferingAllowed)393 TEST_F(RtcpSenderTest, SendLossNotificationBufferingAllowed) {
394   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
395   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
396   constexpr uint16_t kLastDecoded = 0x1234;
397   constexpr uint16_t kLastReceived = 0x4321;
398   constexpr bool kDecodabilityFlag = true;
399   constexpr bool kBufferingAllowed = true;
400   EXPECT_EQ(rtcp_sender->SendLossNotification(feedback_state(), kLastDecoded,
401                                               kLastReceived, kDecodabilityFlag,
402                                               kBufferingAllowed),
403             0);
404 
405   // No RTCP messages sent yet.
406   ASSERT_EQ(parser()->processed_rtcp_packets(), 0u);
407 
408   // Sending another messages triggers sending the LNTF messages as well.
409   const uint16_t kList[] = {0, 1, 16};
410   EXPECT_EQ(rtcp_sender->SendRTCP(feedback_state(), kRtcpNack,
411                                   ABSL_ARRAYSIZE(kList), kList),
412             0);
413 
414   // Exactly one packet was produced, and it contained both the buffered LNTF
415   // as well as the message that had triggered the packet.
416   EXPECT_EQ(parser()->processed_rtcp_packets(), 1u);
417   EXPECT_EQ(parser()->loss_notification()->num_packets(), 1);
418   EXPECT_EQ(parser()->loss_notification()->sender_ssrc(), kSenderSsrc);
419   EXPECT_EQ(parser()->loss_notification()->media_ssrc(), kRemoteSsrc);
420   EXPECT_EQ(parser()->nack()->num_packets(), 1);
421   EXPECT_EQ(parser()->nack()->sender_ssrc(), kSenderSsrc);
422   EXPECT_EQ(parser()->nack()->media_ssrc(), kRemoteSsrc);
423 }
424 
TEST_F(RtcpSenderTest,RembNotIncludedBeforeSet)425 TEST_F(RtcpSenderTest, RembNotIncludedBeforeSet) {
426   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
427   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
428 
429   rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
430 
431   ASSERT_EQ(1, parser()->receiver_report()->num_packets());
432   EXPECT_EQ(0, parser()->remb()->num_packets());
433 }
434 
TEST_F(RtcpSenderTest,RembNotIncludedAfterUnset)435 TEST_F(RtcpSenderTest, RembNotIncludedAfterUnset) {
436   const int64_t kBitrate = 261011;
437   const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
438   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
439   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
440   rtcp_sender->SetRemb(kBitrate, kSsrcs);
441   rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
442   ASSERT_EQ(1, parser()->receiver_report()->num_packets());
443   EXPECT_EQ(1, parser()->remb()->num_packets());
444 
445   // Turn off REMB. rtcp_sender no longer should send it.
446   rtcp_sender->UnsetRemb();
447   rtcp_sender->SendRTCP(feedback_state(), kRtcpRr);
448   ASSERT_EQ(2, parser()->receiver_report()->num_packets());
449   EXPECT_EQ(1, parser()->remb()->num_packets());
450 }
451 
TEST_F(RtcpSenderTest,SendRemb)452 TEST_F(RtcpSenderTest, SendRemb) {
453   const int64_t kBitrate = 261011;
454   const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
455   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
456   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
457   rtcp_sender->SetRemb(kBitrate, kSsrcs);
458 
459   rtcp_sender->SendRTCP(feedback_state(), kRtcpRemb);
460 
461   EXPECT_EQ(1, parser()->remb()->num_packets());
462   EXPECT_EQ(kSenderSsrc, parser()->remb()->sender_ssrc());
463   EXPECT_EQ(kBitrate, parser()->remb()->bitrate_bps());
464   EXPECT_THAT(parser()->remb()->ssrcs(),
465               ElementsAre(kRemoteSsrc, kRemoteSsrc + 1));
466 }
467 
TEST_F(RtcpSenderTest,RembIncludedInEachCompoundPacketAfterSet)468 TEST_F(RtcpSenderTest, RembIncludedInEachCompoundPacketAfterSet) {
469   const int kBitrate = 261011;
470   const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
471   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
472   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
473   rtcp_sender->SetRemb(kBitrate, kSsrcs);
474 
475   rtcp_sender->SendRTCP(feedback_state(), kRtcpReport);
476   EXPECT_EQ(1, parser()->remb()->num_packets());
477   // REMB should be included in each compound packet.
478   rtcp_sender->SendRTCP(feedback_state(), kRtcpReport);
479   EXPECT_EQ(2, parser()->remb()->num_packets());
480 }
481 
TEST_F(RtcpSenderTest,SendXrWithDlrr)482 TEST_F(RtcpSenderTest, SendXrWithDlrr) {
483   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
484   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
485   RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
486   rtcp::ReceiveTimeInfo last_xr_rr;
487   last_xr_rr.ssrc = 0x11111111;
488   last_xr_rr.last_rr = 0x22222222;
489   last_xr_rr.delay_since_last_rr = 0x33333333;
490   feedback_state.last_xr_rtis.push_back(last_xr_rr);
491   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpReport));
492   EXPECT_EQ(1, parser()->xr()->num_packets());
493   EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
494   ASSERT_THAT(parser()->xr()->dlrr().sub_blocks(), SizeIs(1));
495   EXPECT_EQ(last_xr_rr.ssrc, parser()->xr()->dlrr().sub_blocks()[0].ssrc);
496   EXPECT_EQ(last_xr_rr.last_rr, parser()->xr()->dlrr().sub_blocks()[0].last_rr);
497   EXPECT_EQ(last_xr_rr.delay_since_last_rr,
498             parser()->xr()->dlrr().sub_blocks()[0].delay_since_last_rr);
499 }
500 
TEST_F(RtcpSenderTest,SendXrWithMultipleDlrrSubBlocks)501 TEST_F(RtcpSenderTest, SendXrWithMultipleDlrrSubBlocks) {
502   const size_t kNumReceivers = 2;
503   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
504   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
505   RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
506   for (size_t i = 0; i < kNumReceivers; ++i) {
507     rtcp::ReceiveTimeInfo last_xr_rr;
508     last_xr_rr.ssrc = i;
509     last_xr_rr.last_rr = (i + 1) * 100;
510     last_xr_rr.delay_since_last_rr = (i + 2) * 200;
511     feedback_state.last_xr_rtis.push_back(last_xr_rr);
512   }
513 
514   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state, kRtcpReport));
515   EXPECT_EQ(1, parser()->xr()->num_packets());
516   EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
517   ASSERT_THAT(parser()->xr()->dlrr().sub_blocks(), SizeIs(kNumReceivers));
518   for (size_t i = 0; i < kNumReceivers; ++i) {
519     EXPECT_EQ(feedback_state.last_xr_rtis[i].ssrc,
520               parser()->xr()->dlrr().sub_blocks()[i].ssrc);
521     EXPECT_EQ(feedback_state.last_xr_rtis[i].last_rr,
522               parser()->xr()->dlrr().sub_blocks()[i].last_rr);
523     EXPECT_EQ(feedback_state.last_xr_rtis[i].delay_since_last_rr,
524               parser()->xr()->dlrr().sub_blocks()[i].delay_since_last_rr);
525   }
526 }
527 
TEST_F(RtcpSenderTest,SendXrWithRrtr)528 TEST_F(RtcpSenderTest, SendXrWithRrtr) {
529   RTCPSender::Configuration config = GetDefaultConfig();
530   config.non_sender_rtt_measurement = true;
531   auto rtcp_sender = CreateRtcpSender(config);
532   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
533   rtcp_sender->SetSendingStatus(feedback_state(), false);
534   NtpTime ntp = clock_.CurrentNtpTime();
535   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
536   EXPECT_EQ(1, parser()->xr()->num_packets());
537   EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
538   EXPECT_FALSE(parser()->xr()->dlrr());
539   ASSERT_TRUE(parser()->xr()->rrtr());
540   EXPECT_EQ(ntp, parser()->xr()->rrtr()->ntp());
541 }
542 
543 // Same test as above, but enable Rrtr with the setter.
TEST_F(RtcpSenderTest,SendXrWithRrtrUsingSetter)544 TEST_F(RtcpSenderTest, SendXrWithRrtrUsingSetter) {
545   RTCPSender::Configuration config = GetDefaultConfig();
546   config.non_sender_rtt_measurement = false;
547   auto rtcp_sender = CreateRtcpSender(config);
548   rtcp_sender->SetNonSenderRttMeasurement(true);
549   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
550   rtcp_sender->SetSendingStatus(feedback_state(), false);
551   NtpTime ntp = clock_.CurrentNtpTime();
552   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
553   EXPECT_EQ(1, parser()->xr()->num_packets());
554   EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
555   EXPECT_FALSE(parser()->xr()->dlrr());
556   ASSERT_TRUE(parser()->xr()->rrtr());
557   EXPECT_EQ(ntp, parser()->xr()->rrtr()->ntp());
558 }
559 
560 // Same test as above, but disable Rrtr with the setter.
TEST_F(RtcpSenderTest,SendsNoRrtrUsingSetter)561 TEST_F(RtcpSenderTest, SendsNoRrtrUsingSetter) {
562   RTCPSender::Configuration config = GetDefaultConfig();
563   config.non_sender_rtt_measurement = true;
564   auto rtcp_sender = CreateRtcpSender(config);
565   rtcp_sender->SetNonSenderRttMeasurement(false);
566   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
567   rtcp_sender->SetSendingStatus(feedback_state(), false);
568   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
569   EXPECT_EQ(0, parser()->xr()->num_packets());
570 }
571 
TEST_F(RtcpSenderTest,TestNoXrRrtrSentIfSending)572 TEST_F(RtcpSenderTest, TestNoXrRrtrSentIfSending) {
573   RTCPSender::Configuration config = GetDefaultConfig();
574   config.non_sender_rtt_measurement = true;
575   auto rtcp_sender = CreateRtcpSender(config);
576   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
577   rtcp_sender->SetSendingStatus(feedback_state(), true);
578   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
579   EXPECT_EQ(0, parser()->xr()->num_packets());
580 }
581 
TEST_F(RtcpSenderTest,TestNoXrRrtrSentIfNotEnabled)582 TEST_F(RtcpSenderTest, TestNoXrRrtrSentIfNotEnabled) {
583   RTCPSender::Configuration config = GetDefaultConfig();
584   config.non_sender_rtt_measurement = false;
585   auto rtcp_sender = CreateRtcpSender(config);
586   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
587   rtcp_sender->SetSendingStatus(feedback_state(), false);
588   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
589   EXPECT_EQ(0, parser()->xr()->num_packets());
590 }
591 
TEST_F(RtcpSenderTest,TestRegisterRtcpPacketTypeObserver)592 TEST_F(RtcpSenderTest, TestRegisterRtcpPacketTypeObserver) {
593   RtcpPacketTypeCounterObserverImpl observer;
594   RTCPSender::Configuration config;
595   config.clock = &clock_;
596   config.receive_statistics = receive_statistics_.get();
597   config.outgoing_transport = &test_transport_;
598   config.rtcp_packet_type_counter_observer = &observer;
599   config.rtcp_report_interval = TimeDelta::Millis(1000);
600   auto rtcp_sender = CreateRtcpSender(config);
601   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
602   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpPli));
603   EXPECT_EQ(1, parser()->pli()->num_packets());
604   EXPECT_EQ(kRemoteSsrc, observer.ssrc_);
605   EXPECT_EQ(1U, observer.counter_.pli_packets);
606 }
607 
TEST_F(RtcpSenderTest,SendTmmbr)608 TEST_F(RtcpSenderTest, SendTmmbr) {
609   const unsigned int kBitrateBps = 312000;
610   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
611   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
612   rtcp_sender->SetTargetBitrate(kBitrateBps);
613   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpTmmbr));
614   EXPECT_EQ(1, parser()->tmmbr()->num_packets());
615   EXPECT_EQ(kSenderSsrc, parser()->tmmbr()->sender_ssrc());
616   EXPECT_EQ(1U, parser()->tmmbr()->requests().size());
617   EXPECT_EQ(kBitrateBps, parser()->tmmbr()->requests()[0].bitrate_bps());
618   // TODO(asapersson): tmmbr_item()->Overhead() looks broken, always zero.
619 }
620 
TEST_F(RtcpSenderTest,SendTmmbn)621 TEST_F(RtcpSenderTest, SendTmmbn) {
622   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
623   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
624   rtcp_sender->SetSendingStatus(feedback_state(), true);
625   std::vector<rtcp::TmmbItem> bounding_set;
626   const uint32_t kBitrateBps = 32768000;
627   const uint32_t kPacketOh = 40;
628   const uint32_t kSourceSsrc = 12345;
629   const rtcp::TmmbItem tmmbn(kSourceSsrc, kBitrateBps, kPacketOh);
630   bounding_set.push_back(tmmbn);
631   rtcp_sender->SetTmmbn(bounding_set);
632 
633   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpSr));
634   EXPECT_EQ(1, parser()->sender_report()->num_packets());
635   EXPECT_EQ(1, parser()->tmmbn()->num_packets());
636   EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->sender_ssrc());
637   EXPECT_EQ(1U, parser()->tmmbn()->items().size());
638   EXPECT_EQ(kBitrateBps, parser()->tmmbn()->items()[0].bitrate_bps());
639   EXPECT_EQ(kPacketOh, parser()->tmmbn()->items()[0].packet_overhead());
640   EXPECT_EQ(kSourceSsrc, parser()->tmmbn()->items()[0].ssrc());
641 }
642 
643 // This test is written to verify actual behaviour. It does not seem
644 // to make much sense to send an empty TMMBN, since there is no place
645 // to put an actual limit here. It's just information that no limit
646 // is set, which is kind of the starting assumption.
647 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one
648 // situation where this caused confusion.
TEST_F(RtcpSenderTest,SendsTmmbnIfSetAndEmpty)649 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) {
650   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
651   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
652   rtcp_sender->SetSendingStatus(feedback_state(), true);
653   std::vector<rtcp::TmmbItem> bounding_set;
654   rtcp_sender->SetTmmbn(bounding_set);
655   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpSr));
656   EXPECT_EQ(1, parser()->sender_report()->num_packets());
657   EXPECT_EQ(1, parser()->tmmbn()->num_packets());
658   EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->sender_ssrc());
659   EXPECT_EQ(0U, parser()->tmmbn()->items().size());
660 }
661 
662 // This test is written to verify that BYE is always the last packet
663 // type in a RTCP compoud packet.  The rtcp_sender is recreated with
664 // mock_transport, which is used to check for whether BYE at the end
665 // of a RTCP compound packet.
TEST_F(RtcpSenderTest,ByeMustBeLast)666 TEST_F(RtcpSenderTest, ByeMustBeLast) {
667   MockTransport mock_transport;
668   EXPECT_CALL(mock_transport, SendRtcp(_, _))
669       .WillOnce(Invoke([](const uint8_t* data, size_t len) {
670         const uint8_t* next_packet = data;
671         const uint8_t* const packet_end = data + len;
672         rtcp::CommonHeader packet;
673         while (next_packet < packet_end) {
674           EXPECT_TRUE(packet.Parse(next_packet, packet_end - next_packet));
675           next_packet = packet.NextPacket();
676           if (packet.type() ==
677               rtcp::Bye::kPacketType)  // Main test expectation.
678             EXPECT_EQ(0, packet_end - next_packet)
679                 << "Bye packet should be last in a compound RTCP packet.";
680           if (next_packet == packet_end)  // Validate test was set correctly.
681             EXPECT_EQ(packet.type(), rtcp::Bye::kPacketType)
682                 << "Last packet in this test expected to be Bye.";
683         }
684 
685         return true;
686       }));
687 
688   // Re-configure rtcp_sender with mock_transport_
689   RTCPSender::Configuration config;
690   config.clock = &clock_;
691   config.receive_statistics = receive_statistics_.get();
692   config.outgoing_transport = &mock_transport;
693   config.rtcp_report_interval = TimeDelta::Millis(1000);
694   config.local_media_ssrc = kSenderSsrc;
695   auto rtcp_sender = CreateRtcpSender(config);
696 
697   rtcp_sender->SetTimestampOffset(kStartRtpTimestamp);
698   rtcp_sender->SetLastRtpTime(kRtpTimestamp, clock_.CurrentTime(),
699                               /*payload_type=*/0);
700 
701   // Set up REMB info to be included with BYE.
702   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
703   rtcp_sender->SetRemb(1234, {});
704   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpBye));
705 }
706 
TEST_F(RtcpSenderTest,SendXrWithTargetBitrate)707 TEST_F(RtcpSenderTest, SendXrWithTargetBitrate) {
708   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
709   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
710   const size_t kNumSpatialLayers = 2;
711   const size_t kNumTemporalLayers = 2;
712   VideoBitrateAllocation allocation;
713   for (size_t sl = 0; sl < kNumSpatialLayers; ++sl) {
714     uint32_t start_bitrate_bps = (sl + 1) * 100000;
715     for (size_t tl = 0; tl < kNumTemporalLayers; ++tl)
716       allocation.SetBitrate(sl, tl, start_bitrate_bps + (tl * 20000));
717   }
718   rtcp_sender->SetVideoBitrateAllocation(allocation);
719 
720   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
721   EXPECT_EQ(1, parser()->xr()->num_packets());
722   EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
723   const absl::optional<rtcp::TargetBitrate>& target_bitrate =
724       parser()->xr()->target_bitrate();
725   ASSERT_TRUE(target_bitrate);
726   const std::vector<rtcp::TargetBitrate::BitrateItem>& bitrates =
727       target_bitrate->GetTargetBitrates();
728   EXPECT_EQ(kNumSpatialLayers * kNumTemporalLayers, bitrates.size());
729 
730   for (size_t sl = 0; sl < kNumSpatialLayers; ++sl) {
731     uint32_t start_bitrate_bps = (sl + 1) * 100000;
732     for (size_t tl = 0; tl < kNumTemporalLayers; ++tl) {
733       size_t index = (sl * kNumSpatialLayers) + tl;
734       const rtcp::TargetBitrate::BitrateItem& item = bitrates[index];
735       EXPECT_EQ(sl, item.spatial_layer);
736       EXPECT_EQ(tl, item.temporal_layer);
737       EXPECT_EQ(start_bitrate_bps + (tl * 20000),
738                 item.target_bitrate_kbps * 1000);
739     }
740   }
741 }
742 
TEST_F(RtcpSenderTest,SendImmediateXrWithTargetBitrate)743 TEST_F(RtcpSenderTest, SendImmediateXrWithTargetBitrate) {
744   // Initialize. Send a first report right away.
745   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
746   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
747   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
748   clock_.AdvanceTimeMilliseconds(5);
749 
750   // Video bitrate allocation generated, save until next time we send a report.
751   VideoBitrateAllocation allocation;
752   allocation.SetBitrate(0, 0, 100000);
753   rtcp_sender->SetVideoBitrateAllocation(allocation);
754   // First seen instance will be sent immediately.
755   EXPECT_TRUE(rtcp_sender->TimeToSendRTCPReport(false));
756   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
757   clock_.AdvanceTimeMilliseconds(5);
758 
759   // Update bitrate of existing layer, does not quality for immediate sending.
760   allocation.SetBitrate(0, 0, 150000);
761   rtcp_sender->SetVideoBitrateAllocation(allocation);
762   EXPECT_FALSE(rtcp_sender->TimeToSendRTCPReport(false));
763 
764   // A new spatial layer enabled, signal this as soon as possible.
765   allocation.SetBitrate(1, 0, 200000);
766   rtcp_sender->SetVideoBitrateAllocation(allocation);
767   EXPECT_TRUE(rtcp_sender->TimeToSendRTCPReport(false));
768   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
769   clock_.AdvanceTimeMilliseconds(5);
770 
771   // Explicitly disable top layer. The same set of layers now has a bitrate
772   // defined, but the explicit 0 indicates shutdown. Signal immediately.
773   allocation.SetBitrate(1, 0, 0);
774   EXPECT_FALSE(rtcp_sender->TimeToSendRTCPReport(false));
775   rtcp_sender->SetVideoBitrateAllocation(allocation);
776   EXPECT_TRUE(rtcp_sender->TimeToSendRTCPReport(false));
777 }
778 
TEST_F(RtcpSenderTest,SendTargetBitrateExplicitZeroOnStreamRemoval)779 TEST_F(RtcpSenderTest, SendTargetBitrateExplicitZeroOnStreamRemoval) {
780   // Set up and send a bitrate allocation with two layers.
781 
782   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
783   rtcp_sender->SetRTCPStatus(RtcpMode::kCompound);
784   VideoBitrateAllocation allocation;
785   allocation.SetBitrate(0, 0, 100000);
786   allocation.SetBitrate(1, 0, 200000);
787   rtcp_sender->SetVideoBitrateAllocation(allocation);
788   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
789   absl::optional<rtcp::TargetBitrate> target_bitrate =
790       parser()->xr()->target_bitrate();
791   ASSERT_TRUE(target_bitrate);
792   std::vector<rtcp::TargetBitrate::BitrateItem> bitrates =
793       target_bitrate->GetTargetBitrates();
794   ASSERT_EQ(2u, bitrates.size());
795   EXPECT_EQ(bitrates[0].target_bitrate_kbps,
796             allocation.GetBitrate(0, 0) / 1000);
797   EXPECT_EQ(bitrates[1].target_bitrate_kbps,
798             allocation.GetBitrate(1, 0) / 1000);
799 
800   // Create a new allocation, where the second stream is no longer available.
801   VideoBitrateAllocation new_allocation;
802   new_allocation.SetBitrate(0, 0, 150000);
803   rtcp_sender->SetVideoBitrateAllocation(new_allocation);
804   EXPECT_EQ(0, rtcp_sender->SendRTCP(feedback_state(), kRtcpReport));
805   target_bitrate = parser()->xr()->target_bitrate();
806   ASSERT_TRUE(target_bitrate);
807   bitrates = target_bitrate->GetTargetBitrates();
808 
809   // Two bitrates should still be set, with an explicit entry indicating the
810   // removed stream is gone.
811   ASSERT_EQ(2u, bitrates.size());
812   EXPECT_EQ(bitrates[0].target_bitrate_kbps,
813             new_allocation.GetBitrate(0, 0) / 1000);
814   EXPECT_EQ(bitrates[1].target_bitrate_kbps, 0u);
815 }
816 
TEST_F(RtcpSenderTest,DoesntSchedulesInitialReportWhenSsrcSetOnConstruction)817 TEST_F(RtcpSenderTest, DoesntSchedulesInitialReportWhenSsrcSetOnConstruction) {
818   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
819   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
820   rtcp_sender->SetRemoteSSRC(kRemoteSsrc);
821   // New report should not have been scheduled yet.
822   clock_.AdvanceTimeMilliseconds(100);
823   EXPECT_FALSE(rtcp_sender->TimeToSendRTCPReport(false));
824 }
825 
TEST_F(RtcpSenderTest,SendsCombinedRtcpPacket)826 TEST_F(RtcpSenderTest, SendsCombinedRtcpPacket) {
827   auto rtcp_sender = CreateRtcpSender(GetDefaultConfig());
828   rtcp_sender->SetRTCPStatus(RtcpMode::kReducedSize);
829 
830   std::vector<std::unique_ptr<rtcp::RtcpPacket>> packets;
831   auto transport_feedback = std::make_unique<rtcp::TransportFeedback>();
832   transport_feedback->AddReceivedPacket(321, Timestamp::Millis(10));
833   packets.push_back(std::move(transport_feedback));
834   auto remote_estimate = std::make_unique<rtcp::RemoteEstimate>();
835   packets.push_back(std::move(remote_estimate));
836   rtcp_sender->SendCombinedRtcpPacket(std::move(packets));
837 
838   EXPECT_EQ(parser()->transport_feedback()->num_packets(), 1);
839   EXPECT_EQ(parser()->transport_feedback()->sender_ssrc(), kSenderSsrc);
840   EXPECT_EQ(parser()->app()->num_packets(), 1);
841   EXPECT_EQ(parser()->app()->sender_ssrc(), kSenderSsrc);
842 }
843 
844 }  // namespace webrtc
845