tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

rtcp_receiver_unittest.cc (77876B)


      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_receiver.h"
     12 
     13 #include <cstddef>
     14 #include <cstdint>
     15 #include <memory>
     16 #include <optional>
     17 #include <set>
     18 #include <string>
     19 #include <utility>
     20 #include <vector>
     21 
     22 #include "absl/strings/string_view.h"
     23 #include "api/array_view.h"
     24 #include "api/environment/environment_factory.h"
     25 #include "api/transport/network_types.h"
     26 #include "api/units/data_rate.h"
     27 #include "api/units/time_delta.h"
     28 #include "api/units/timestamp.h"
     29 #include "api/video/video_bitrate_allocation.h"
     30 #include "api/video/video_bitrate_allocator.h"
     31 #include "api/video/video_codec_constants.h"
     32 #include "modules/rtp_rtcp/include/report_block_data.h"
     33 #include "modules/rtp_rtcp/include/rtcp_statistics.h"
     34 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     35 #include "modules/rtp_rtcp/mocks/mock_network_link_rtcp_observer.h"
     36 #include "modules/rtp_rtcp/mocks/mock_network_state_estimator_observer.h"
     37 #include "modules/rtp_rtcp/source/byte_io.h"
     38 #include "modules/rtp_rtcp/source/ntp_time_util.h"
     39 #include "modules/rtp_rtcp/source/rtcp_packet/app.h"
     40 #include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
     41 #include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
     42 #include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h"
     43 #include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
     44 #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
     45 #include "modules/rtp_rtcp/source/rtcp_packet/fir.h"
     46 #include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
     47 #include "modules/rtp_rtcp/source/rtcp_packet/pli.h"
     48 #include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
     49 #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
     50 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
     51 #include "modules/rtp_rtcp/source/rtcp_packet/remote_estimate.h"
     52 #include "modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
     53 #include "modules/rtp_rtcp/source/rtcp_packet/sdes.h"
     54 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
     55 #include "modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
     56 #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
     57 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
     58 #include "rtc_base/buffer.h"
     59 #include "rtc_base/random.h"
     60 #include "system_wrappers/include/clock.h"
     61 #include "system_wrappers/include/ntp_time.h"
     62 #include "test/create_test_field_trials.h"
     63 #include "test/gmock.h"
     64 #include "test/gtest.h"
     65 
     66 namespace webrtc {
     67 namespace {
     68 
     69 using rtcp::ReceiveTimeInfo;
     70 using ::testing::_;
     71 using ::testing::AllOf;
     72 using ::testing::ElementsAre;
     73 using ::testing::ElementsAreArray;
     74 using ::testing::Eq;
     75 using ::testing::Field;
     76 using ::testing::Gt;
     77 using ::testing::InSequence;
     78 using ::testing::IsEmpty;
     79 using ::testing::NiceMock;
     80 using ::testing::Property;
     81 using ::testing::SizeIs;
     82 using ::testing::StrEq;
     83 using ::testing::StrictMock;
     84 using ::testing::UnorderedElementsAre;
     85 
     86 class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver {
     87 public:
     88  MOCK_METHOD(void,
     89              RtcpPacketTypesCounterUpdated,
     90              (uint32_t, const RtcpPacketTypeCounter&),
     91              (override));
     92 };
     93 
     94 class MockRtcpIntraFrameObserver : public RtcpIntraFrameObserver {
     95 public:
     96  MOCK_METHOD(void, OnReceivedIntraFrameRequest, (uint32_t), (override));
     97 };
     98 
     99 class MockRtcpLossNotificationObserver : public RtcpLossNotificationObserver {
    100 public:
    101  ~MockRtcpLossNotificationObserver() override = default;
    102  MOCK_METHOD(void,
    103              OnReceivedLossNotification,
    104              (uint32_t ssrc,
    105               uint16_t seq_num_of_last_decodable,
    106               uint16_t seq_num_of_last_received,
    107               bool decodability_flag),
    108              (override));
    109 };
    110 
    111 class MockCnameCallbackImpl : public RtcpCnameCallback {
    112 public:
    113  MOCK_METHOD(void, OnCname, (uint32_t, absl::string_view), (override));
    114 };
    115 
    116 class MockReportBlockDataObserverImpl : public ReportBlockDataObserver {
    117 public:
    118  MOCK_METHOD(void, OnReportBlockDataUpdated, (ReportBlockData), (override));
    119 };
    120 
    121 class MockModuleRtpRtcp : public RTCPReceiver::ModuleRtpRtcp {
    122 public:
    123  MOCK_METHOD(void, SetTmmbn, (std::vector<rtcp::TmmbItem>), (override));
    124  MOCK_METHOD(void, OnRequestSendReport, (), (override));
    125  MOCK_METHOD(void, OnReceivedNack, (const std::vector<uint16_t>&), (override));
    126  MOCK_METHOD(void,
    127              OnReceivedRtcpReportBlocks,
    128              (ArrayView<const ReportBlockData>),
    129              (override));
    130 };
    131 
    132 class MockVideoBitrateAllocationObserver
    133    : public VideoBitrateAllocationObserver {
    134 public:
    135  MOCK_METHOD(void,
    136              OnBitrateAllocationUpdated,
    137              (const VideoBitrateAllocation& allocation),
    138              (override));
    139 };
    140 
    141 MATCHER_P2(Near, value, margin, "") {
    142  return value - margin <= arg && arg <= value + margin;
    143 }
    144 
    145 // SSRC of remote peer, that sends rtcp packet to the rtcp receiver under test.
    146 constexpr uint32_t kSenderSsrc = 0x10203;
    147 // SSRCs of local peer, that rtcp packet addressed to.
    148 constexpr uint32_t kReceiverMainSsrc = 0x123456;
    149 // RtcpReceiver can accept several ssrc, e.g. regular and rtx streams.
    150 constexpr uint32_t kReceiverExtraSsrc = 0x1234567;
    151 // SSRCs to ignore (i.e. not configured in RtcpReceiver).
    152 constexpr uint32_t kNotToUsSsrc = 0x654321;
    153 constexpr uint32_t kUnknownSenderSsrc = 0x54321;
    154 
    155 constexpr int64_t kRtcpIntervalMs = 1000;
    156 constexpr TimeDelta kEpsilon = TimeDelta::Millis(1);
    157 
    158 }  // namespace
    159 
    160 struct ReceiverMocks {
    161  SimulatedClock clock{1335900000};
    162  std::string field_trials;
    163  // Callbacks to packet_type_counter_observer are frequent but most of the time
    164  // are not interesting.
    165  NiceMock<MockRtcpPacketTypeCounterObserver> packet_type_counter_observer;
    166  StrictMock<MockRtcpIntraFrameObserver> intra_frame_observer;
    167  StrictMock<MockRtcpLossNotificationObserver> rtcp_loss_notification_observer;
    168  StrictMock<MockVideoBitrateAllocationObserver> bitrate_allocation_observer;
    169  StrictMock<MockModuleRtpRtcp> rtp_rtcp_impl;
    170  NiceMock<MockNetworkLinkRtcpObserver> network_link_rtcp_observer;
    171  NiceMock<MockNetworkStateEstimateObserver> network_state_estimate_observer;
    172 
    173  RtpRtcpInterface::Configuration config = {
    174      .receiver_only = false,
    175      .intra_frame_callback = &intra_frame_observer,
    176      .rtcp_loss_notification_observer = &rtcp_loss_notification_observer,
    177      .network_link_rtcp_observer = &network_link_rtcp_observer,
    178      .network_state_estimate_observer = &network_state_estimate_observer,
    179      .bitrate_allocation_observer = &bitrate_allocation_observer,
    180      .rtcp_packet_type_counter_observer = &packet_type_counter_observer,
    181      .rtcp_report_interval_ms = kRtcpIntervalMs,
    182      .local_media_ssrc = kReceiverMainSsrc,
    183      .rtx_send_ssrc = kReceiverExtraSsrc};
    184 };
    185 
    186 RTCPReceiver Create(ReceiverMocks& mocks) {
    187  return RTCPReceiver(CreateEnvironment(&mocks.clock, CreateTestFieldTrialsPtr(
    188                                                          mocks.field_trials)),
    189                      mocks.config, &mocks.rtp_rtcp_impl);
    190 }
    191 
    192 TEST(RtcpReceiverTest, BrokenPacketIsIgnored) {
    193  ReceiverMocks mocks;
    194  RTCPReceiver receiver = Create(mocks);
    195 
    196  const uint8_t bad_packet[] = {0, 0, 0, 0};
    197  EXPECT_CALL(mocks.packet_type_counter_observer, RtcpPacketTypesCounterUpdated)
    198      .Times(0);
    199  receiver.IncomingPacket(bad_packet);
    200 }
    201 
    202 TEST(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) {
    203  ReceiverMocks mocks;
    204  RTCPReceiver receiver = Create(mocks);
    205 
    206  // Too short feedback packet.
    207  const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0};
    208 
    209  EXPECT_CALL(mocks.packet_type_counter_observer, RtcpPacketTypesCounterUpdated)
    210      .Times(0);
    211  receiver.IncomingPacket(bad_packet);
    212 }
    213 
    214 TEST(RtcpReceiverTest, InjectSrPacket) {
    215  ReceiverMocks mocks;
    216  RTCPReceiver receiver = Create(mocks);
    217  receiver.SetRemoteSSRC(kSenderSsrc);
    218 
    219  EXPECT_FALSE(receiver.GetSenderReportStats());
    220 
    221  rtcp::SenderReport sr;
    222  sr.SetSenderSsrc(kSenderSsrc);
    223 
    224  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(IsEmpty()));
    225  receiver.IncomingPacket(sr.Build());
    226 
    227  EXPECT_TRUE(receiver.GetSenderReportStats());
    228 }
    229 
    230 TEST(RtcpReceiverTest, InjectSrPacketFromUnknownSender) {
    231  ReceiverMocks mocks;
    232  RTCPReceiver receiver = Create(mocks);
    233  receiver.SetRemoteSSRC(kSenderSsrc);
    234 
    235  rtcp::SenderReport sr;
    236  sr.SetSenderSsrc(kUnknownSenderSsrc);
    237 
    238  // The parser will handle report blocks in Sender Report from other than their
    239  // expected peer.
    240  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
    241  receiver.IncomingPacket(sr.Build());
    242 
    243  // But will not flag that he's gotten sender information.
    244  EXPECT_FALSE(receiver.GetSenderReportStats());
    245 }
    246 
    247 TEST(RtcpReceiverTest, InjectSrPacketCalculatesRTT) {
    248  ReceiverMocks mocks;
    249  RTCPReceiver receiver = Create(mocks);
    250  receiver.SetRemoteSSRC(kSenderSsrc);
    251 
    252  const TimeDelta kRtt = TimeDelta::Millis(123);
    253  const uint32_t kDelayNtp = 0x4321;
    254  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
    255 
    256  EXPECT_EQ(receiver.LastRtt(), std::nullopt);
    257 
    258  uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime());
    259  mocks.clock.AdvanceTime(kRtt + kDelay);
    260 
    261  rtcp::SenderReport sr;
    262  sr.SetSenderSsrc(kSenderSsrc);
    263  rtcp::ReportBlock block;
    264  block.SetMediaSsrc(kReceiverMainSsrc);
    265  block.SetLastSr(sent_ntp);
    266  block.SetDelayLastSr(kDelayNtp);
    267  sr.AddReportBlock(block);
    268 
    269  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
    270  EXPECT_CALL(mocks.network_link_rtcp_observer, OnRttUpdate);
    271  receiver.IncomingPacket(sr.Build());
    272 
    273  EXPECT_THAT(receiver.LastRtt(), Near(kRtt, TimeDelta::Millis(1)));
    274 }
    275 
    276 TEST(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOneMs) {
    277  ReceiverMocks mocks;
    278  RTCPReceiver receiver = Create(mocks);
    279  receiver.SetRemoteSSRC(kSenderSsrc);
    280 
    281  const TimeDelta kRtt = TimeDelta::Millis(-13);
    282  const uint32_t kDelayNtp = 0x4321;
    283  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
    284 
    285  EXPECT_EQ(receiver.LastRtt(), std::nullopt);
    286 
    287  uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime());
    288  mocks.clock.AdvanceTime(kRtt + kDelay);
    289 
    290  rtcp::SenderReport sr;
    291  sr.SetSenderSsrc(kSenderSsrc);
    292  rtcp::ReportBlock block;
    293  block.SetMediaSsrc(kReceiverMainSsrc);
    294  block.SetLastSr(sent_ntp);
    295  block.SetDelayLastSr(kDelayNtp);
    296  sr.AddReportBlock(block);
    297 
    298  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1)));
    299  EXPECT_CALL(mocks.network_link_rtcp_observer,
    300              OnRttUpdate(_, TimeDelta::Millis(1)));
    301  receiver.IncomingPacket(sr.Build());
    302 
    303  EXPECT_EQ(receiver.LastRtt(), TimeDelta::Millis(1));
    304 }
    305 
    306 TEST(RtcpReceiverTest, TwoReportBlocksWithLastOneWithoutLastSrCalculatesRtt) {
    307  ReceiverMocks mocks;
    308  RTCPReceiver receiver = Create(mocks);
    309  receiver.SetRemoteSSRC(kSenderSsrc);
    310 
    311  const TimeDelta kRtt = TimeDelta::Millis(125);
    312  const uint32_t kDelayNtp = 123000;
    313  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
    314 
    315  uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime());
    316  mocks.clock.AdvanceTime(kRtt + kDelay);
    317 
    318  rtcp::SenderReport sr;
    319  sr.SetSenderSsrc(kSenderSsrc);
    320  rtcp::ReportBlock block;
    321  block.SetMediaSsrc(kReceiverMainSsrc);
    322  block.SetLastSr(sent_ntp);
    323  block.SetDelayLastSr(kDelayNtp);
    324  sr.AddReportBlock(block);
    325  block.SetMediaSsrc(kReceiverExtraSsrc);
    326  block.SetLastSr(0);
    327  sr.AddReportBlock(block);
    328 
    329  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2)));
    330  EXPECT_CALL(mocks.network_link_rtcp_observer, OnRttUpdate(_, kRtt));
    331  receiver.IncomingPacket(sr.Build());
    332 }
    333 
    334 TEST(RtcpReceiverTest, InjectRrPacket) {
    335  ReceiverMocks mocks;
    336  RTCPReceiver receiver = Create(mocks);
    337  receiver.SetRemoteSSRC(kSenderSsrc);
    338 
    339  rtcp::ReceiverReport rr;
    340  rr.SetSenderSsrc(kSenderSsrc);
    341 
    342  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(IsEmpty()));
    343  receiver.IncomingPacket(rr.Build());
    344 
    345  EXPECT_THAT(receiver.GetLatestReportBlockData(), IsEmpty());
    346 }
    347 
    348 TEST(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
    349  ReceiverMocks mocks;
    350  RTCPReceiver receiver = Create(mocks);
    351  receiver.SetRemoteSSRC(kSenderSsrc);
    352 
    353  rtcp::ReportBlock rb;
    354  rb.SetMediaSsrc(kNotToUsSsrc);
    355  rtcp::ReceiverReport rr;
    356  rr.SetSenderSsrc(kSenderSsrc);
    357  rr.AddReportBlock(rb);
    358 
    359  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(IsEmpty()));
    360  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport).Times(0);
    361  receiver.IncomingPacket(rr.Build());
    362 
    363  EXPECT_EQ(0, receiver.LastReceivedReportBlockMs());
    364  EXPECT_THAT(receiver.GetLatestReportBlockData(), IsEmpty());
    365 }
    366 
    367 TEST(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
    368  ReceiverMocks mocks;
    369  RTCPReceiver receiver = Create(mocks);
    370  receiver.SetRemoteSSRC(kSenderSsrc);
    371 
    372  Timestamp now = mocks.clock.CurrentTime();
    373 
    374  rtcp::ReportBlock rb;
    375  rb.SetMediaSsrc(kReceiverMainSsrc);
    376  rtcp::ReceiverReport rr;
    377  rr.SetSenderSsrc(kSenderSsrc);
    378  rr.AddReportBlock(rb);
    379 
    380  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1)));
    381  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(1)));
    382  receiver.IncomingPacket(rr.Build());
    383 
    384  EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms());
    385  EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(1));
    386 }
    387 
    388 TEST(RtcpReceiverTest, InjectSrPacketWithOneReportBlock) {
    389  ReceiverMocks mocks;
    390  RTCPReceiver receiver = Create(mocks);
    391  receiver.SetRemoteSSRC(kSenderSsrc);
    392 
    393  Timestamp now = mocks.clock.CurrentTime();
    394 
    395  rtcp::ReportBlock rb;
    396  rb.SetMediaSsrc(kReceiverMainSsrc);
    397  rtcp::SenderReport sr;
    398  sr.SetSenderSsrc(kSenderSsrc);
    399  sr.AddReportBlock(rb);
    400 
    401  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1)));
    402  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(1)));
    403  receiver.IncomingPacket(sr.Build());
    404 
    405  EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms());
    406  EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(1));
    407 }
    408 
    409 TEST(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) {
    410  const uint16_t kSequenceNumbers[] = {10, 12423};
    411  const uint32_t kCumLost[] = {13, 555};
    412  const uint8_t kFracLost[] = {20, 11};
    413  ReceiverMocks mocks;
    414  RTCPReceiver receiver = Create(mocks);
    415  receiver.SetRemoteSSRC(kSenderSsrc);
    416 
    417  Timestamp now = mocks.clock.CurrentTime();
    418 
    419  rtcp::ReportBlock rb1;
    420  rb1.SetMediaSsrc(kReceiverMainSsrc);
    421  rb1.SetExtHighestSeqNum(kSequenceNumbers[0]);
    422  rb1.SetFractionLost(10);
    423 
    424  rtcp::ReportBlock rb2;
    425  rb2.SetMediaSsrc(kReceiverExtraSsrc);
    426  rb2.SetExtHighestSeqNum(kSequenceNumbers[1]);
    427  rb2.SetFractionLost(0);
    428 
    429  rtcp::ReceiverReport rr1;
    430  rr1.SetSenderSsrc(kSenderSsrc);
    431  rr1.AddReportBlock(rb1);
    432  rr1.AddReportBlock(rb2);
    433 
    434  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2)));
    435  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(2)));
    436  receiver.IncomingPacket(rr1.Build());
    437 
    438  EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms());
    439  EXPECT_THAT(
    440      receiver.GetLatestReportBlockData(),
    441      UnorderedElementsAre(Property(&ReportBlockData::fraction_lost_raw, 0),
    442                           Property(&ReportBlockData::fraction_lost_raw, 10)));
    443 
    444  // Insert next receiver report with same ssrc but new values.
    445  rtcp::ReportBlock rb3;
    446  rb3.SetMediaSsrc(kReceiverMainSsrc);
    447  rb3.SetExtHighestSeqNum(kSequenceNumbers[0]);
    448  rb3.SetFractionLost(kFracLost[0]);
    449  rb3.SetCumulativeLost(kCumLost[0]);
    450 
    451  rtcp::ReportBlock rb4;
    452  rb4.SetMediaSsrc(kReceiverExtraSsrc);
    453  rb4.SetExtHighestSeqNum(kSequenceNumbers[1]);
    454  rb4.SetFractionLost(kFracLost[1]);
    455  rb4.SetCumulativeLost(kCumLost[1]);
    456 
    457  rtcp::ReceiverReport rr2;
    458  rr2.SetSenderSsrc(kSenderSsrc);
    459  rr2.AddReportBlock(rb3);
    460  rr2.AddReportBlock(rb4);
    461 
    462  // Advance time to make 1st sent time and 2nd sent time different.
    463  mocks.clock.AdvanceTimeMilliseconds(500);
    464  now = mocks.clock.CurrentTime();
    465 
    466  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2)));
    467  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReport(now, SizeIs(2)));
    468  receiver.IncomingPacket(rr2.Build());
    469 
    470  EXPECT_THAT(
    471      receiver.GetLatestReportBlockData(),
    472      UnorderedElementsAre(
    473          AllOf(Property(&ReportBlockData::source_ssrc, kReceiverMainSsrc),
    474                Property(&ReportBlockData::fraction_lost_raw, kFracLost[0]),
    475                Property(&ReportBlockData::cumulative_lost, kCumLost[0]),
    476                Property(&ReportBlockData::extended_highest_sequence_number,
    477                         kSequenceNumbers[0])),
    478          AllOf(Property(&ReportBlockData::source_ssrc, kReceiverExtraSsrc),
    479                Property(&ReportBlockData::fraction_lost_raw, kFracLost[1]),
    480                Property(&ReportBlockData::cumulative_lost, kCumLost[1]),
    481                Property(&ReportBlockData::extended_highest_sequence_number,
    482                         kSequenceNumbers[1]))));
    483 }
    484 
    485 TEST(RtcpReceiverTest,
    486     InjectRrPacketsFromTwoRemoteSsrcsReturnsLatestReportBlock) {
    487  const uint32_t kSenderSsrc2 = 0x20304;
    488  const uint16_t kSequenceNumbers[] = {10, 12423};
    489  const int32_t kCumLost[] = {13, 555};
    490  const uint8_t kFracLost[] = {20, 11};
    491  ReceiverMocks mocks;
    492  RTCPReceiver receiver = Create(mocks);
    493  receiver.SetRemoteSSRC(kSenderSsrc);
    494 
    495  rtcp::ReportBlock rb1;
    496  rb1.SetMediaSsrc(kReceiverMainSsrc);
    497  rb1.SetExtHighestSeqNum(kSequenceNumbers[0]);
    498  rb1.SetFractionLost(kFracLost[0]);
    499  rb1.SetCumulativeLost(kCumLost[0]);
    500  rtcp::ReceiverReport rr1;
    501  rr1.SetSenderSsrc(kSenderSsrc);
    502  rr1.AddReportBlock(rb1);
    503 
    504  Timestamp now = mocks.clock.CurrentTime();
    505 
    506  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1)));
    507  receiver.IncomingPacket(rr1.Build());
    508 
    509  EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms());
    510 
    511  EXPECT_THAT(receiver.GetLatestReportBlockData(),
    512              ElementsAre(AllOf(
    513                  Property(&ReportBlockData::source_ssrc, kReceiverMainSsrc),
    514                  Property(&ReportBlockData::sender_ssrc, kSenderSsrc),
    515                  Property(&ReportBlockData::fraction_lost_raw, kFracLost[0]),
    516                  Property(&ReportBlockData::cumulative_lost, kCumLost[0]),
    517                  Property(&ReportBlockData::extended_highest_sequence_number,
    518                           kSequenceNumbers[0]))));
    519 
    520  rtcp::ReportBlock rb2;
    521  rb2.SetMediaSsrc(kReceiverMainSsrc);
    522  rb2.SetExtHighestSeqNum(kSequenceNumbers[1]);
    523  rb2.SetFractionLost(kFracLost[1]);
    524  rb2.SetCumulativeLost(kCumLost[1]);
    525  rtcp::ReceiverReport rr2;
    526  rr2.SetSenderSsrc(kSenderSsrc2);
    527  rr2.AddReportBlock(rb2);
    528 
    529  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(1)));
    530  receiver.IncomingPacket(rr2.Build());
    531 
    532  EXPECT_THAT(receiver.GetLatestReportBlockData(),
    533              UnorderedElementsAre(AllOf(
    534                  Property(&ReportBlockData::source_ssrc, kReceiverMainSsrc),
    535                  Property(&ReportBlockData::sender_ssrc, kSenderSsrc2),
    536                  Property(&ReportBlockData::fraction_lost_raw, kFracLost[1]),
    537                  Property(&ReportBlockData::cumulative_lost, kCumLost[1]),
    538                  Property(&ReportBlockData::extended_highest_sequence_number,
    539                           kSequenceNumbers[1]))));
    540 }
    541 
    542 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnReportBlocks) {
    543  ReceiverMocks mocks;
    544  RTCPReceiver receiver = Create(mocks);
    545  receiver.SetRemoteSSRC(kSenderSsrc);
    546 
    547  rtcp::ReportBlock rb1;
    548  rb1.SetMediaSsrc(kReceiverMainSsrc);
    549  rb1.SetFractionLost(10);
    550 
    551  rtcp::ReportBlock rb2;
    552  rb2.SetMediaSsrc(kNotToUsSsrc);
    553  rb2.SetFractionLost(20);
    554 
    555  rtcp::ReportBlock rb3;
    556  rb3.SetMediaSsrc(kReceiverExtraSsrc);
    557  rb3.SetFractionLost(0);
    558 
    559  rtcp::ReceiverReport rr;
    560  rr.SetSenderSsrc(kSenderSsrc);
    561  rr.AddReportBlock(rb1);
    562  rr.AddReportBlock(rb2);
    563  rr.AddReportBlock(rb3);
    564 
    565  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks(SizeIs(2)));
    566  EXPECT_CALL(mocks.network_link_rtcp_observer,
    567              OnReport(mocks.clock.CurrentTime(),
    568                       UnorderedElementsAre(
    569                           Property(&ReportBlockData::fraction_lost_raw, 0),
    570                           Property(&ReportBlockData::fraction_lost_raw, 10))));
    571  receiver.IncomingPacket(rr.Build());
    572 }
    573 
    574 TEST(RtcpReceiverTest, GetRtt) {
    575  const uint32_t kSentCompactNtp = 0x1234;
    576  const uint32_t kDelayCompactNtp = 0x222;
    577  ReceiverMocks mocks;
    578  mocks.config.network_link_rtcp_observer = &mocks.network_link_rtcp_observer;
    579  RTCPReceiver receiver = Create(mocks);
    580  receiver.SetRemoteSSRC(kSenderSsrc);
    581 
    582  // No report block received.
    583  EXPECT_EQ(receiver.LastRtt(), std::nullopt);
    584  EXPECT_EQ(receiver.AverageRtt(), std::nullopt);
    585 
    586  rtcp::ReportBlock rb;
    587  rb.SetMediaSsrc(kReceiverMainSsrc);
    588  rb.SetLastSr(kSentCompactNtp);
    589  rb.SetDelayLastSr(kDelayCompactNtp);
    590 
    591  rtcp::ReceiverReport rr;
    592  rr.SetSenderSsrc(kSenderSsrc);
    593  rr.AddReportBlock(rb);
    594 
    595  Timestamp now = mocks.clock.CurrentTime();
    596  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
    597  EXPECT_CALL(mocks.network_link_rtcp_observer,
    598              OnRttUpdate(now, Gt(TimeDelta::Zero())));
    599  receiver.IncomingPacket(rr.Build());
    600 
    601  EXPECT_EQ(receiver.LastReceivedReportBlockMs(), now.ms());
    602  EXPECT_NE(receiver.LastRtt(), std::nullopt);
    603  EXPECT_NE(receiver.AverageRtt(), std::nullopt);
    604 }
    605 
    606 // App packets are ignored.
    607 TEST(RtcpReceiverTest, InjectApp) {
    608  ReceiverMocks mocks;
    609  RTCPReceiver receiver = Create(mocks);
    610  receiver.SetRemoteSSRC(kSenderSsrc);
    611 
    612  rtcp::App app;
    613  app.SetSubType(30);
    614  app.SetName(0x17a177e);
    615  const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
    616  app.SetData(kData, sizeof(kData));
    617 
    618  receiver.IncomingPacket(app.Build());
    619 }
    620 
    621 TEST(RtcpReceiverTest, InjectSdesWithOneChunk) {
    622  ReceiverMocks mocks;
    623  MockCnameCallbackImpl callback;
    624  mocks.config.rtcp_cname_callback = &callback;
    625  RTCPReceiver receiver = Create(mocks);
    626  receiver.SetRemoteSSRC(kSenderSsrc);
    627 
    628  const char kCname[] = "alice@host";
    629  rtcp::Sdes sdes;
    630  sdes.AddCName(kSenderSsrc, kCname);
    631 
    632  EXPECT_CALL(callback, OnCname(kSenderSsrc, StrEq(kCname)));
    633  receiver.IncomingPacket(sdes.Build());
    634 }
    635 
    636 TEST(RtcpReceiverTest, InjectByePacketRemovesReportBlocks) {
    637  ReceiverMocks mocks;
    638  RTCPReceiver receiver = Create(mocks);
    639  receiver.SetRemoteSSRC(kSenderSsrc);
    640 
    641  rtcp::ReportBlock rb1;
    642  rb1.SetMediaSsrc(kReceiverMainSsrc);
    643  rtcp::ReportBlock rb2;
    644  rb2.SetMediaSsrc(kReceiverExtraSsrc);
    645  rtcp::ReceiverReport rr;
    646  rr.SetSenderSsrc(kSenderSsrc);
    647  rr.AddReportBlock(rb1);
    648  rr.AddReportBlock(rb2);
    649 
    650  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
    651  receiver.IncomingPacket(rr.Build());
    652 
    653  EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(2));
    654 
    655  // Verify that BYE removes the report blocks.
    656  rtcp::Bye bye;
    657  bye.SetSenderSsrc(kSenderSsrc);
    658 
    659  receiver.IncomingPacket(bye.Build());
    660 
    661  EXPECT_THAT(receiver.GetLatestReportBlockData(), IsEmpty());
    662 
    663  // Inject packet again.
    664  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
    665  receiver.IncomingPacket(rr.Build());
    666 
    667  EXPECT_THAT(receiver.GetLatestReportBlockData(), SizeIs(2));
    668 }
    669 
    670 TEST(RtcpReceiverTest, InjectByePacketRemovesReferenceTimeInfo) {
    671  ReceiverMocks mocks;
    672  RTCPReceiver receiver = Create(mocks);
    673  receiver.SetRemoteSSRC(kSenderSsrc);
    674 
    675  rtcp::ExtendedReports xr;
    676  xr.SetSenderSsrc(kSenderSsrc);
    677  rtcp::Rrtr rrtr;
    678  rrtr.SetNtp(NtpTime(0x10203, 0x40506));
    679  xr.SetRrtr(rrtr);
    680  receiver.IncomingPacket(xr.Build());
    681 
    682  rtcp::Bye bye;
    683  bye.SetSenderSsrc(kSenderSsrc);
    684  receiver.IncomingPacket(bye.Build());
    685 
    686  EXPECT_THAT(receiver.ConsumeReceivedXrReferenceTimeInfo(), IsEmpty());
    687 }
    688 
    689 TEST(RtcpReceiverTest, InjectPliPacket) {
    690  ReceiverMocks mocks;
    691  RTCPReceiver receiver = Create(mocks);
    692  receiver.SetRemoteSSRC(kSenderSsrc);
    693 
    694  rtcp::Pli pli;
    695  pli.SetMediaSsrc(kReceiverMainSsrc);
    696 
    697  EXPECT_CALL(
    698      mocks.packet_type_counter_observer,
    699      RtcpPacketTypesCounterUpdated(
    700          kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 1)));
    701  EXPECT_CALL(mocks.intra_frame_observer,
    702              OnReceivedIntraFrameRequest(kReceiverMainSsrc));
    703  receiver.IncomingPacket(pli.Build());
    704 }
    705 
    706 TEST(RtcpReceiverTest, PliPacketNotToUsIgnored) {
    707  ReceiverMocks mocks;
    708  RTCPReceiver receiver = Create(mocks);
    709  receiver.SetRemoteSSRC(kSenderSsrc);
    710 
    711  rtcp::Pli pli;
    712  pli.SetMediaSsrc(kNotToUsSsrc);
    713 
    714  EXPECT_CALL(
    715      mocks.packet_type_counter_observer,
    716      RtcpPacketTypesCounterUpdated(
    717          kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 0)));
    718  EXPECT_CALL(mocks.intra_frame_observer, OnReceivedIntraFrameRequest).Times(0);
    719  receiver.IncomingPacket(pli.Build());
    720 }
    721 
    722 TEST(RtcpReceiverTest, InjectFirPacket) {
    723  ReceiverMocks mocks;
    724  RTCPReceiver receiver = Create(mocks);
    725  receiver.SetRemoteSSRC(kSenderSsrc);
    726 
    727  rtcp::Fir fir;
    728  fir.AddRequestTo(kReceiverMainSsrc, 13);
    729 
    730  EXPECT_CALL(
    731      mocks.packet_type_counter_observer,
    732      RtcpPacketTypesCounterUpdated(
    733          kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::fir_packets, 1)));
    734  EXPECT_CALL(mocks.intra_frame_observer,
    735              OnReceivedIntraFrameRequest(kReceiverMainSsrc));
    736  receiver.IncomingPacket(fir.Build());
    737 }
    738 
    739 TEST(RtcpReceiverTest, FirPacketNotToUsIgnored) {
    740  ReceiverMocks mocks;
    741  RTCPReceiver receiver = Create(mocks);
    742  receiver.SetRemoteSSRC(kSenderSsrc);
    743 
    744  rtcp::Fir fir;
    745  fir.AddRequestTo(kNotToUsSsrc, 13);
    746 
    747  EXPECT_CALL(mocks.intra_frame_observer, OnReceivedIntraFrameRequest).Times(0);
    748  receiver.IncomingPacket(fir.Build());
    749 }
    750 
    751 TEST(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) {
    752  ReceiverMocks mocks;
    753  RTCPReceiver receiver = Create(mocks);
    754  receiver.SetRemoteSSRC(kSenderSsrc);
    755 
    756  rtcp::ExtendedReports xr;
    757  xr.SetSenderSsrc(kSenderSsrc);
    758 
    759  receiver.IncomingPacket(xr.Build());
    760 }
    761 
    762 TEST(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) {
    763  ReceiverMocks mocks;
    764  RTCPReceiver receiver = Create(mocks);
    765  receiver.SetRemoteSSRC(kSenderSsrc);
    766 
    767  const NtpTime kNtp(0x10203, 0x40506);
    768  rtcp::Rrtr rrtr;
    769  rrtr.SetNtp(kNtp);
    770  rtcp::ExtendedReports xr;
    771  xr.SetSenderSsrc(kSenderSsrc);
    772  xr.SetRrtr(rrtr);
    773 
    774  std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis =
    775      receiver.ConsumeReceivedXrReferenceTimeInfo();
    776  EXPECT_THAT(last_xr_rtis, IsEmpty());
    777 
    778  receiver.IncomingPacket(xr.Build());
    779 
    780  last_xr_rtis = receiver.ConsumeReceivedXrReferenceTimeInfo();
    781  ASSERT_THAT(last_xr_rtis, SizeIs(1));
    782  EXPECT_EQ(kSenderSsrc, last_xr_rtis[0].ssrc);
    783  EXPECT_EQ(CompactNtp(kNtp), last_xr_rtis[0].last_rr);
    784  EXPECT_EQ(0U, last_xr_rtis[0].delay_since_last_rr);
    785 }
    786 
    787 TEST(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) {
    788  ReceiverMocks mocks;
    789  // Allow calculate rtt using dlrr/rrtr, simulating media receiver side.
    790  mocks.config.non_sender_rtt_measurement = true;
    791  RTCPReceiver receiver = Create(mocks);
    792  receiver.SetRemoteSSRC(kSenderSsrc);
    793 
    794  rtcp::ExtendedReports xr;
    795  xr.SetSenderSsrc(kSenderSsrc);
    796  xr.AddDlrrItem(ReceiveTimeInfo(kNotToUsSsrc, 0x12345, 0x67890));
    797 
    798  receiver.IncomingPacket(xr.Build());
    799 
    800  EXPECT_FALSE(receiver.GetAndResetXrRrRtt());
    801  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    802      receiver.GetNonSenderRTT();
    803  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value());
    804  EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    805  EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    806 }
    807 
    808 TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) {
    809  ReceiverMocks mocks;
    810  mocks.config.non_sender_rtt_measurement = true;
    811  RTCPReceiver receiver = Create(mocks);
    812  receiver.SetRemoteSSRC(kSenderSsrc);
    813 
    814  const uint32_t kLastRR = 0x12345;
    815  const uint32_t kDelay = 0x23456;
    816  EXPECT_FALSE(receiver.GetAndResetXrRrRtt());
    817 
    818  rtcp::ExtendedReports xr;
    819  xr.SetSenderSsrc(kSenderSsrc);
    820  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, kLastRR, kDelay));
    821 
    822  receiver.IncomingPacket(xr.Build());
    823 
    824  uint32_t compact_ntp_now = CompactNtp(mocks.clock.CurrentNtpTime());
    825  uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
    826  EXPECT_THAT(receiver.GetAndResetXrRrRtt(),
    827              Near(CompactNtpRttToTimeDelta(rtt_ntp), kEpsilon));
    828  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    829      receiver.GetNonSenderRTT();
    830  EXPECT_GT(non_sender_rtt_stats.round_trip_time(), TimeDelta::Zero());
    831  EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    832  EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    833 }
    834 
    835 TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) {
    836  ReceiverMocks mocks;
    837  mocks.config.non_sender_rtt_measurement = true;
    838  RTCPReceiver receiver = Create(mocks);
    839  receiver.SetRemoteSSRC(kSenderSsrc);
    840 
    841  const uint32_t kLastRR = 0x12345;
    842  const uint32_t kDelay = 0x56789;
    843 
    844  rtcp::ExtendedReports xr;
    845  xr.SetSenderSsrc(kSenderSsrc);
    846  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, kLastRR, kDelay));
    847  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc + 1, 0x12345, 0x67890));
    848  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc + 2, 0x12345, 0x67890));
    849 
    850  receiver.IncomingPacket(xr.Build());
    851 
    852  uint32_t compact_ntp_now = CompactNtp(mocks.clock.CurrentNtpTime());
    853  uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
    854  EXPECT_THAT(receiver.GetAndResetXrRrRtt(),
    855              Near(CompactNtpRttToTimeDelta(rtt_ntp), kEpsilon));
    856  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    857      receiver.GetNonSenderRTT();
    858  EXPECT_GT(non_sender_rtt_stats.round_trip_time(), TimeDelta::Zero());
    859  EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    860  EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    861 }
    862 
    863 TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) {
    864  ReceiverMocks mocks;
    865  mocks.config.non_sender_rtt_measurement = true;
    866  RTCPReceiver receiver = Create(mocks);
    867  receiver.SetRemoteSSRC(kSenderSsrc);
    868 
    869  rtcp::Rrtr rrtr;
    870  rtcp::ExtendedReports xr;
    871  xr.SetSenderSsrc(kSenderSsrc);
    872  xr.SetRrtr(rrtr);
    873  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0x12345, 0x67890));
    874 
    875  receiver.IncomingPacket(xr.Build());
    876 
    877  std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis =
    878      receiver.ConsumeReceivedXrReferenceTimeInfo();
    879  EXPECT_THAT(last_xr_rtis, SizeIs(1));
    880  EXPECT_TRUE(receiver.GetAndResetXrRrRtt());
    881 }
    882 
    883 TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) {
    884  ReceiverMocks mocks;
    885  mocks.config.non_sender_rtt_measurement = true;
    886  RTCPReceiver receiver = Create(mocks);
    887  receiver.SetRemoteSSRC(kSenderSsrc);
    888 
    889  rtcp::Rrtr rrtr;
    890  rtcp::ExtendedReports xr;
    891  xr.SetSenderSsrc(kSenderSsrc);
    892  xr.SetRrtr(rrtr);
    893  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0x12345, 0x67890));
    894 
    895  Buffer packet = xr.Build();
    896  // Modify the DLRR block to have an unsupported block type, from 5 to 6.
    897  ASSERT_EQ(5, packet.data()[20]);
    898  packet.data()[20] = 6;
    899  receiver.IncomingPacket(packet);
    900 
    901  // Validate Rrtr was received and processed.
    902  std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis =
    903      receiver.ConsumeReceivedXrReferenceTimeInfo();
    904  EXPECT_THAT(last_xr_rtis, SizeIs(1));
    905  // Validate Dlrr report wasn't processed.
    906  EXPECT_FALSE(receiver.GetAndResetXrRrRtt());
    907  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    908      receiver.GetNonSenderRTT();
    909  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value());
    910  EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    911  EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    912 }
    913 
    914 TEST(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) {
    915  ReceiverMocks mocks;
    916  mocks.config.non_sender_rtt_measurement = true;
    917  RTCPReceiver receiver = Create(mocks);
    918  receiver.SetRemoteSSRC(kSenderSsrc);
    919 
    920  EXPECT_FALSE(receiver.GetAndResetXrRrRtt());
    921  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    922      receiver.GetNonSenderRTT();
    923  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value());
    924  EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    925  EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    926 }
    927 
    928 TEST(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) {
    929  ReceiverMocks mocks;
    930  mocks.config.non_sender_rtt_measurement = true;
    931  RTCPReceiver receiver = Create(mocks);
    932  receiver.SetRemoteSSRC(kSenderSsrc);
    933 
    934  Random rand(0x0123456789abcdef);
    935  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
    936  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
    937  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
    938  NtpTime now = mocks.clock.CurrentNtpTime();
    939  uint32_t sent_ntp = CompactNtp(now);
    940  mocks.clock.AdvanceTime(kRtt + kDelay);
    941 
    942  rtcp::ExtendedReports xr;
    943  xr.SetSenderSsrc(kSenderSsrc);
    944  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
    945 
    946  receiver.IncomingPacket(xr.Build());
    947 
    948  EXPECT_THAT(receiver.GetAndResetXrRrRtt(), Near(kRtt, kEpsilon));
    949  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    950      receiver.GetNonSenderRTT();
    951  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
    952  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().value().IsZero());
    953  EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    954  EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    955 }
    956 
    957 // Same test as above but enables receive-side RTT using the setter instead of
    958 // the config struct.
    959 TEST(RtcpReceiverTest, SetterEnablesReceiverRtt) {
    960  ReceiverMocks mocks;
    961  mocks.config.non_sender_rtt_measurement = false;
    962  RTCPReceiver receiver = Create(mocks);
    963  receiver.SetRemoteSSRC(kSenderSsrc);
    964  receiver.SetNonSenderRttMeasurement(true);
    965 
    966  Random rand(0x0123456789abcdef);
    967  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
    968  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
    969  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
    970  NtpTime now = mocks.clock.CurrentNtpTime();
    971  uint32_t sent_ntp = CompactNtp(now);
    972  mocks.clock.AdvanceTime(kRtt + kDelay);
    973 
    974  rtcp::ExtendedReports xr;
    975  xr.SetSenderSsrc(kSenderSsrc);
    976  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
    977 
    978  receiver.IncomingPacket(xr.Build());
    979 
    980  EXPECT_THAT(receiver.GetAndResetXrRrRtt(), Near(kRtt, kEpsilon));
    981  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
    982      receiver.GetNonSenderRTT();
    983  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
    984  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().value().IsZero());
    985  EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero());
    986  EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0);
    987 }
    988 
    989 // Same test as above but disables receive-side RTT using the setter instead of
    990 // the config struct.
    991 TEST(RtcpReceiverTest, DoesntCalculateRttOnReceivedDlrr) {
    992  ReceiverMocks mocks;
    993  mocks.config.non_sender_rtt_measurement = true;
    994  RTCPReceiver receiver = Create(mocks);
    995  receiver.SetRemoteSSRC(kSenderSsrc);
    996  receiver.SetNonSenderRttMeasurement(false);
    997 
    998  Random rand(0x0123456789abcdef);
    999  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
   1000  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
   1001  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1002  NtpTime now = mocks.clock.CurrentNtpTime();
   1003  uint32_t sent_ntp = CompactNtp(now);
   1004  mocks.clock.AdvanceTime(kRtt + kDelay);
   1005 
   1006  rtcp::ExtendedReports xr;
   1007  xr.SetSenderSsrc(kSenderSsrc);
   1008  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
   1009 
   1010  receiver.IncomingPacket(xr.Build());
   1011 
   1012  // We expect that no RTT is available (because receive-side RTT was disabled).
   1013  EXPECT_FALSE(receiver.GetAndResetXrRrRtt());
   1014  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
   1015      receiver.GetNonSenderRTT();
   1016  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value());
   1017  EXPECT_TRUE(non_sender_rtt_stats.total_round_trip_time().IsZero());
   1018  EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 0);
   1019 }
   1020 
   1021 TEST(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOneMillisecond) {
   1022  ReceiverMocks mocks;
   1023  mocks.config.non_sender_rtt_measurement = true;
   1024  RTCPReceiver receiver = Create(mocks);
   1025  receiver.SetRemoteSSRC(kSenderSsrc);
   1026 
   1027  Random rand(0x0123456789abcdef);
   1028  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(-3600 * 1000, -1));
   1029  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
   1030  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1031  NtpTime now = mocks.clock.CurrentNtpTime();
   1032  uint32_t sent_ntp = CompactNtp(now);
   1033  mocks.clock.AdvanceTime(kRtt + kDelay);
   1034 
   1035  rtcp::ExtendedReports xr;
   1036  xr.SetSenderSsrc(kSenderSsrc);
   1037  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
   1038 
   1039  receiver.IncomingPacket(xr.Build());
   1040 
   1041  EXPECT_EQ(receiver.GetAndResetXrRrRtt(), TimeDelta::Millis(1));
   1042  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
   1043      receiver.GetNonSenderRTT();
   1044  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
   1045  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().value().IsZero());
   1046  EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero());
   1047  EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0);
   1048 }
   1049 
   1050 // Test receiver RTT stats with multiple measurements.
   1051 TEST(RtcpReceiverTest, ReceiverRttWithMultipleMeasurements) {
   1052  ReceiverMocks mocks;
   1053  mocks.config.non_sender_rtt_measurement = true;
   1054  RTCPReceiver receiver = Create(mocks);
   1055  receiver.SetRemoteSSRC(kSenderSsrc);
   1056 
   1057  Random rand(0x0123456789abcdef);
   1058  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
   1059  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
   1060  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1061  NtpTime now = mocks.clock.CurrentNtpTime();
   1062  uint32_t sent_ntp = CompactNtp(now);
   1063  mocks.clock.AdvanceTime(kRtt + kDelay);
   1064 
   1065  rtcp::ExtendedReports xr;
   1066  xr.SetSenderSsrc(kSenderSsrc);
   1067  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
   1068 
   1069  receiver.IncomingPacket(xr.Build());
   1070 
   1071  // Check that the non-sender RTT stats are valid and based on a single
   1072  // measurement.
   1073  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
   1074      receiver.GetNonSenderRTT();
   1075  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
   1076  EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1);
   1077  EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 1);
   1078  EXPECT_EQ(non_sender_rtt_stats.total_round_trip_time().ms(),
   1079            non_sender_rtt_stats.round_trip_time()->ms());
   1080 
   1081  // Generate another XR report with the same RTT and delay.
   1082  NtpTime now2 = mocks.clock.CurrentNtpTime();
   1083  uint32_t sent_ntp2 = CompactNtp(now2);
   1084  mocks.clock.AdvanceTime(kRtt + kDelay);
   1085 
   1086  rtcp::ExtendedReports xr2;
   1087  xr2.SetSenderSsrc(kSenderSsrc);
   1088  xr2.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp2, kDelayNtp));
   1089 
   1090  receiver.IncomingPacket(xr2.Build());
   1091 
   1092  // Check that the non-sender RTT stats are based on 2 measurements, and that
   1093  // the values are as expected.
   1094  non_sender_rtt_stats = receiver.GetNonSenderRTT();
   1095  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
   1096  EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1);
   1097  EXPECT_EQ(non_sender_rtt_stats.round_trip_time_measurements(), 2);
   1098  EXPECT_NEAR(non_sender_rtt_stats.total_round_trip_time().ms(), 2 * kRtt.ms(),
   1099              2);
   1100 }
   1101 
   1102 // Test that the receiver RTT stat resets when receiving a SR without XR. This
   1103 // behavior is described in the standard, see
   1104 // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime.
   1105 TEST(RtcpReceiverTest, ReceiverRttResetOnSrWithoutXr) {
   1106  ReceiverMocks mocks;
   1107  mocks.config.non_sender_rtt_measurement = true;
   1108  RTCPReceiver receiver = Create(mocks);
   1109  receiver.SetRemoteSSRC(kSenderSsrc);
   1110 
   1111  Random rand(0x0123456789abcdef);
   1112  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
   1113  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
   1114  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1115  NtpTime now = mocks.clock.CurrentNtpTime();
   1116  uint32_t sent_ntp = CompactNtp(now);
   1117  mocks.clock.AdvanceTime(kRtt + kDelay);
   1118 
   1119  rtcp::ExtendedReports xr;
   1120  xr.SetSenderSsrc(kSenderSsrc);
   1121  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
   1122 
   1123  receiver.IncomingPacket(xr.Build());
   1124 
   1125  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
   1126      receiver.GetNonSenderRTT();
   1127  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
   1128  EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1);
   1129 
   1130  // Generate a SR without XR.
   1131  rtcp::ReportBlock rb;
   1132  rb.SetMediaSsrc(kReceiverMainSsrc);
   1133  rtcp::SenderReport sr;
   1134  sr.SetSenderSsrc(kSenderSsrc);
   1135  sr.AddReportBlock(rb);
   1136  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1137 
   1138  receiver.IncomingPacket(sr.Build());
   1139 
   1140  // Check that the non-sender RTT stat is not set.
   1141  non_sender_rtt_stats = receiver.GetNonSenderRTT();
   1142  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value());
   1143 }
   1144 
   1145 // Test that the receiver RTT stat resets when receiving a DLRR with a timestamp
   1146 // of zero. This behavior is described in the standard, see
   1147 // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime.
   1148 TEST(RtcpReceiverTest, ReceiverRttResetOnDlrrWithZeroTimestamp) {
   1149  ReceiverMocks mocks;
   1150  mocks.config.non_sender_rtt_measurement = true;
   1151  RTCPReceiver receiver = Create(mocks);
   1152  receiver.SetRemoteSSRC(kSenderSsrc);
   1153 
   1154  Random rand(0x0123456789abcdef);
   1155  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
   1156  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
   1157  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1158  NtpTime now = mocks.clock.CurrentNtpTime();
   1159  uint32_t sent_ntp = CompactNtp(now);
   1160  mocks.clock.AdvanceTime(kRtt + kDelay);
   1161 
   1162  rtcp::ExtendedReports xr;
   1163  xr.SetSenderSsrc(kSenderSsrc);
   1164  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
   1165 
   1166  receiver.IncomingPacket(xr.Build());
   1167 
   1168  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
   1169      receiver.GetNonSenderRTT();
   1170  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
   1171  EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1);
   1172 
   1173  // Generate an XR+DLRR with zero timestamp.
   1174  rtcp::ExtendedReports xr2;
   1175  xr2.SetSenderSsrc(kSenderSsrc);
   1176  xr2.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0, kDelayNtp));
   1177 
   1178  receiver.IncomingPacket(xr2.Build());
   1179 
   1180  // Check that the non-sender RTT stat is not set.
   1181  non_sender_rtt_stats = receiver.GetNonSenderRTT();
   1182  EXPECT_FALSE(non_sender_rtt_stats.round_trip_time().has_value());
   1183 }
   1184 
   1185 // Check that the receiver RTT works correctly when the remote SSRC changes.
   1186 TEST(RtcpReceiverTest, ReceiverRttWithMultipleRemoteSsrcs) {
   1187  ReceiverMocks mocks;
   1188  mocks.config.non_sender_rtt_measurement = false;
   1189  RTCPReceiver receiver = Create(mocks);
   1190  receiver.SetRemoteSSRC(kSenderSsrc);
   1191  receiver.SetNonSenderRttMeasurement(true);
   1192 
   1193  Random rand(0x0123456789abcdef);
   1194  const TimeDelta kRtt = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
   1195  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
   1196  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1197  NtpTime now = mocks.clock.CurrentNtpTime();
   1198  uint32_t sent_ntp = CompactNtp(now);
   1199  mocks.clock.AdvanceTime(kRtt + kDelay);
   1200 
   1201  rtcp::ExtendedReports xr;
   1202  xr.SetSenderSsrc(kSenderSsrc);
   1203  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
   1204 
   1205  receiver.IncomingPacket(xr.Build());
   1206 
   1207  // Generate an XR report for another SSRC.
   1208  const TimeDelta kRtt2 = TimeDelta::Millis(rand.Rand(1, 9 * 3600 * 1000));
   1209  const uint32_t kDelayNtp2 = rand.Rand(0, 0x7fffffff);
   1210  const TimeDelta kDelay2 = CompactNtpRttToTimeDelta(kDelayNtp2);
   1211  NtpTime now2 = mocks.clock.CurrentNtpTime();
   1212  uint32_t sent_ntp2 = CompactNtp(now2);
   1213  mocks.clock.AdvanceTime(kRtt2 + kDelay2);
   1214 
   1215  rtcp::ExtendedReports xr2;
   1216  xr2.SetSenderSsrc(kSenderSsrc + 1);
   1217  xr2.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp2, kDelayNtp2));
   1218 
   1219  receiver.IncomingPacket(xr2.Build());
   1220 
   1221  // Check that the non-sender RTT stats match the first XR.
   1222  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats =
   1223      receiver.GetNonSenderRTT();
   1224  EXPECT_TRUE(non_sender_rtt_stats.round_trip_time().has_value());
   1225  EXPECT_NEAR(non_sender_rtt_stats.round_trip_time()->ms(), kRtt.ms(), 1);
   1226  EXPECT_FALSE(non_sender_rtt_stats.total_round_trip_time().IsZero());
   1227  EXPECT_GT(non_sender_rtt_stats.round_trip_time_measurements(), 0);
   1228 
   1229  // Change the remote SSRC and check that the stats match the second XR.
   1230  receiver.SetRemoteSSRC(kSenderSsrc + 1);
   1231  RTCPReceiver::NonSenderRttStats non_sender_rtt_stats2 =
   1232      receiver.GetNonSenderRTT();
   1233  EXPECT_TRUE(non_sender_rtt_stats2.round_trip_time().has_value());
   1234  EXPECT_NEAR(non_sender_rtt_stats2.round_trip_time()->ms(), kRtt2.ms(), 1);
   1235  EXPECT_FALSE(non_sender_rtt_stats2.total_round_trip_time().IsZero());
   1236  EXPECT_GT(non_sender_rtt_stats2.round_trip_time_measurements(), 0);
   1237 }
   1238 
   1239 TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfoInitiallyEmpty) {
   1240  ReceiverMocks mocks;
   1241  RTCPReceiver receiver = Create(mocks);
   1242  receiver.SetRemoteSSRC(kSenderSsrc);
   1243 
   1244  EXPECT_THAT(receiver.ConsumeReceivedXrReferenceTimeInfo(), IsEmpty());
   1245 }
   1246 
   1247 TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfo) {
   1248  ReceiverMocks mocks;
   1249  RTCPReceiver receiver = Create(mocks);
   1250  receiver.SetRemoteSSRC(kSenderSsrc);
   1251 
   1252  const NtpTime kNtp(0x10203, 0x40506);
   1253  const uint32_t kNtpMid = CompactNtp(kNtp);
   1254 
   1255  rtcp::Rrtr rrtr;
   1256  rrtr.SetNtp(kNtp);
   1257  rtcp::ExtendedReports xr;
   1258  xr.SetSenderSsrc(kSenderSsrc);
   1259  xr.SetRrtr(rrtr);
   1260 
   1261  receiver.IncomingPacket(xr.Build());
   1262 
   1263  mocks.clock.AdvanceTimeMilliseconds(1000);
   1264 
   1265  std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis =
   1266      receiver.ConsumeReceivedXrReferenceTimeInfo();
   1267  ASSERT_THAT(last_xr_rtis, SizeIs(1));
   1268  EXPECT_EQ(kSenderSsrc, last_xr_rtis[0].ssrc);
   1269  EXPECT_EQ(kNtpMid, last_xr_rtis[0].last_rr);
   1270  EXPECT_EQ(65536U, last_xr_rtis[0].delay_since_last_rr);
   1271 }
   1272 
   1273 TEST(RtcpReceiverTest,
   1274     ReceivedRrtrFromSameSsrcUpdatesReceivedReferenceTimeInfo) {
   1275  ReceiverMocks mocks;
   1276  RTCPReceiver receiver = Create(mocks);
   1277  receiver.SetRemoteSSRC(kSenderSsrc);
   1278 
   1279  const NtpTime kNtp1(0x10203, 0x40506);
   1280  const NtpTime kNtp2(0x11223, 0x44556);
   1281  const int64_t kDelayMs = 2000;
   1282 
   1283  rtcp::ExtendedReports xr;
   1284  xr.SetSenderSsrc(kSenderSsrc);
   1285  rtcp::Rrtr rrtr1;
   1286  rrtr1.SetNtp(kNtp1);
   1287  xr.SetRrtr(rrtr1);
   1288  receiver.IncomingPacket(xr.Build());
   1289  mocks.clock.AdvanceTimeMilliseconds(kDelayMs);
   1290  rtcp::Rrtr rrtr2;
   1291  rrtr2.SetNtp(kNtp2);
   1292  xr.SetRrtr(rrtr2);
   1293  receiver.IncomingPacket(xr.Build());
   1294  mocks.clock.AdvanceTimeMilliseconds(kDelayMs);
   1295 
   1296  std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis =
   1297      receiver.ConsumeReceivedXrReferenceTimeInfo();
   1298  ASSERT_THAT(last_xr_rtis, SizeIs(1));
   1299  EXPECT_EQ(kSenderSsrc, last_xr_rtis[0].ssrc);
   1300  EXPECT_EQ(CompactNtp(kNtp2), last_xr_rtis[0].last_rr);
   1301  EXPECT_EQ(kDelayMs * 65536 / 1000, last_xr_rtis[0].delay_since_last_rr);
   1302 }
   1303 
   1304 TEST(RtcpReceiverTest, StoresLastReceivedRrtrPerSsrc) {
   1305  ReceiverMocks mocks;
   1306  RTCPReceiver receiver = Create(mocks);
   1307  receiver.SetRemoteSSRC(kSenderSsrc);
   1308 
   1309  const size_t kNumBufferedReports = 1;
   1310  const size_t kNumReports =
   1311      rtcp::ExtendedReports::kMaxNumberOfDlrrItems + kNumBufferedReports;
   1312  for (size_t i = 0; i < kNumReports; ++i) {
   1313    rtcp::ExtendedReports xr;
   1314    xr.SetSenderSsrc(i * 100);
   1315    rtcp::Rrtr rrtr;
   1316    rrtr.SetNtp(NtpTime(i * 200, i * 300));
   1317    xr.SetRrtr(rrtr);
   1318    receiver.IncomingPacket(xr.Build());
   1319    mocks.clock.AdvanceTimeMilliseconds(1000);
   1320  }
   1321 
   1322  std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis =
   1323      receiver.ConsumeReceivedXrReferenceTimeInfo();
   1324  ASSERT_THAT(last_xr_rtis,
   1325              SizeIs(rtcp::ExtendedReports::kMaxNumberOfDlrrItems));
   1326  for (size_t i = 0; i < rtcp::ExtendedReports::kMaxNumberOfDlrrItems; ++i) {
   1327    EXPECT_EQ(i * 100, last_xr_rtis[i].ssrc);
   1328    EXPECT_EQ(CompactNtp(NtpTime(i * 200, i * 300)), last_xr_rtis[i].last_rr);
   1329    EXPECT_EQ(65536U * (kNumReports - i), last_xr_rtis[i].delay_since_last_rr);
   1330  }
   1331 
   1332  last_xr_rtis = receiver.ConsumeReceivedXrReferenceTimeInfo();
   1333  ASSERT_THAT(last_xr_rtis, SizeIs(kNumBufferedReports));
   1334 }
   1335 
   1336 TEST(RtcpReceiverTest, ReceiveReportTimeout) {
   1337  ReceiverMocks mocks;
   1338  RTCPReceiver receiver = Create(mocks);
   1339  receiver.SetRemoteSSRC(kSenderSsrc);
   1340 
   1341  const uint16_t kSequenceNumber = 1234;
   1342  mocks.clock.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
   1343 
   1344  // No RR received, shouldn't trigger a timeout.
   1345  EXPECT_FALSE(receiver.RtcpRrTimeout());
   1346  EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout());
   1347 
   1348  // Add a RR and advance the clock just enough to not trigger a timeout.
   1349  rtcp::ReportBlock rb1;
   1350  rb1.SetMediaSsrc(kReceiverMainSsrc);
   1351  rb1.SetExtHighestSeqNum(kSequenceNumber);
   1352  rtcp::ReceiverReport rr1;
   1353  rr1.SetSenderSsrc(kSenderSsrc);
   1354  rr1.AddReportBlock(rb1);
   1355 
   1356  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1357  receiver.IncomingPacket(rr1.Build());
   1358 
   1359  mocks.clock.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1);
   1360  EXPECT_FALSE(receiver.RtcpRrTimeout());
   1361  EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout());
   1362 
   1363  // Add a RR with the same extended max as the previous RR to trigger a
   1364  // sequence number timeout, but not a RR timeout.
   1365  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1366  receiver.IncomingPacket(rr1.Build());
   1367 
   1368  mocks.clock.AdvanceTimeMilliseconds(2);
   1369  EXPECT_FALSE(receiver.RtcpRrTimeout());
   1370  EXPECT_TRUE(receiver.RtcpRrSequenceNumberTimeout());
   1371 
   1372  // Advance clock enough to trigger an RR timeout too.
   1373  mocks.clock.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
   1374  EXPECT_TRUE(receiver.RtcpRrTimeout());
   1375 
   1376  // We should only get one timeout even though we still haven't received a new
   1377  // RR.
   1378  EXPECT_FALSE(receiver.RtcpRrTimeout());
   1379  EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout());
   1380 
   1381  // Add a new RR with increase sequence number to reset timers.
   1382  rtcp::ReportBlock rb2;
   1383  rb2.SetMediaSsrc(kReceiverMainSsrc);
   1384  rb2.SetExtHighestSeqNum(kSequenceNumber + 1);
   1385  rtcp::ReceiverReport rr2;
   1386  rr2.SetSenderSsrc(kSenderSsrc);
   1387  rr2.AddReportBlock(rb2);
   1388 
   1389  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1390  receiver.IncomingPacket(rr2.Build());
   1391 
   1392  EXPECT_FALSE(receiver.RtcpRrTimeout());
   1393  EXPECT_FALSE(receiver.RtcpRrSequenceNumberTimeout());
   1394 
   1395  // Verify we can get a timeout again once we've received new RR.
   1396  mocks.clock.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
   1397  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1398  receiver.IncomingPacket(rr2.Build());
   1399 
   1400  mocks.clock.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1);
   1401  EXPECT_FALSE(receiver.RtcpRrTimeout());
   1402  EXPECT_TRUE(receiver.RtcpRrSequenceNumberTimeout());
   1403 
   1404  mocks.clock.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
   1405  EXPECT_TRUE(receiver.RtcpRrTimeout());
   1406 }
   1407 
   1408 TEST(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) {
   1409  ReceiverMocks mocks;
   1410  RTCPReceiver receiver = Create(mocks);
   1411  receiver.SetRemoteSSRC(kSenderSsrc);
   1412 
   1413  EXPECT_THAT(receiver.TmmbrReceived(), IsEmpty());
   1414 }
   1415 
   1416 TEST(RtcpReceiverTest, TmmbrPacketAccepted) {
   1417  ReceiverMocks mocks;
   1418  RTCPReceiver receiver = Create(mocks);
   1419  receiver.SetRemoteSSRC(kSenderSsrc);
   1420 
   1421  const DataRate kBitrate = DataRate::BitsPerSec(30'000);
   1422  auto tmmbr = std::make_unique<rtcp::Tmmbr>();
   1423  tmmbr->SetSenderSsrc(kSenderSsrc);
   1424  tmmbr->AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, kBitrate.bps(), 0));
   1425  auto sr = std::make_unique<rtcp::SenderReport>();
   1426  sr->SetSenderSsrc(kSenderSsrc);
   1427  rtcp::CompoundPacket compound;
   1428  compound.Append(std::move(sr));
   1429  compound.Append(std::move(tmmbr));
   1430 
   1431  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1432  EXPECT_CALL(mocks.rtp_rtcp_impl, SetTmmbn(SizeIs(1)));
   1433  EXPECT_CALL(mocks.network_link_rtcp_observer,
   1434              OnReceiverEstimatedMaxBitrate(_, kBitrate));
   1435  receiver.IncomingPacket(compound.Build());
   1436 
   1437  EXPECT_THAT(
   1438      receiver.TmmbrReceived(),
   1439      ElementsAre(AllOf(
   1440          Property(&rtcp::TmmbItem::bitrate_bps, Eq(kBitrate.bps<uint64_t>())),
   1441          Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc)))));
   1442 }
   1443 
   1444 TEST(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) {
   1445  ReceiverMocks mocks;
   1446  RTCPReceiver receiver = Create(mocks);
   1447  receiver.SetRemoteSSRC(kSenderSsrc);
   1448 
   1449  const uint32_t kBitrateBps = 30000;
   1450  auto tmmbr = std::make_unique<rtcp::Tmmbr>();
   1451  tmmbr->SetSenderSsrc(kSenderSsrc);
   1452  tmmbr->AddTmmbr(rtcp::TmmbItem(kNotToUsSsrc, kBitrateBps, 0));
   1453 
   1454  auto sr = std::make_unique<rtcp::SenderReport>();
   1455  sr->SetSenderSsrc(kSenderSsrc);
   1456  rtcp::CompoundPacket compound;
   1457  compound.Append(std::move(sr));
   1458  compound.Append(std::move(tmmbr));
   1459 
   1460  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1461  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReceiverEstimatedMaxBitrate)
   1462      .Times(0);
   1463  receiver.IncomingPacket(compound.Build());
   1464 
   1465  EXPECT_EQ(0u, receiver.TmmbrReceived().size());
   1466 }
   1467 
   1468 TEST(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) {
   1469  ReceiverMocks mocks;
   1470  RTCPReceiver receiver = Create(mocks);
   1471  receiver.SetRemoteSSRC(kSenderSsrc);
   1472 
   1473  auto tmmbr = std::make_unique<rtcp::Tmmbr>();
   1474  tmmbr->SetSenderSsrc(kSenderSsrc);
   1475  tmmbr->AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 0, 0));
   1476  auto sr = std::make_unique<rtcp::SenderReport>();
   1477  sr->SetSenderSsrc(kSenderSsrc);
   1478  rtcp::CompoundPacket compound;
   1479  compound.Append(std::move(sr));
   1480  compound.Append(std::move(tmmbr));
   1481 
   1482  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1483  EXPECT_CALL(mocks.network_link_rtcp_observer, OnReceiverEstimatedMaxBitrate)
   1484      .Times(0);
   1485  receiver.IncomingPacket(compound.Build());
   1486 
   1487  EXPECT_EQ(0u, receiver.TmmbrReceived().size());
   1488 }
   1489 
   1490 TEST(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) {
   1491  ReceiverMocks mocks;
   1492  RTCPReceiver receiver = Create(mocks);
   1493  receiver.SetRemoteSSRC(kSenderSsrc);
   1494 
   1495  // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2.
   1496  // The times of arrival are starttime + 0, starttime + 5 and starttime + 10.
   1497  for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) {
   1498    auto tmmbr = std::make_unique<rtcp::Tmmbr>();
   1499    tmmbr->SetSenderSsrc(ssrc);
   1500    tmmbr->AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 30000, 0));
   1501    auto sr = std::make_unique<rtcp::SenderReport>();
   1502    sr->SetSenderSsrc(ssrc);
   1503    rtcp::CompoundPacket compound;
   1504    compound.Append(std::move(sr));
   1505    compound.Append(std::move(tmmbr));
   1506 
   1507    EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1508    EXPECT_CALL(mocks.rtp_rtcp_impl, SetTmmbn);
   1509    EXPECT_CALL(mocks.network_link_rtcp_observer,
   1510                OnReceiverEstimatedMaxBitrate);
   1511    receiver.IncomingPacket(compound.Build());
   1512 
   1513    // 5 seconds between each packet.
   1514    mocks.clock.AdvanceTimeMilliseconds(5000);
   1515  }
   1516  // It is now starttime + 15.
   1517  EXPECT_THAT(receiver.TmmbrReceived(),
   1518              AllOf(SizeIs(3),
   1519                    Each(Property(&rtcp::TmmbItem::bitrate_bps, Eq(30'000U)))));
   1520 
   1521  // We expect the timeout to be 25 seconds. Advance the clock by 12
   1522  // seconds, timing out the first packet.
   1523  mocks.clock.AdvanceTimeMilliseconds(12000);
   1524  EXPECT_THAT(receiver.TmmbrReceived(),
   1525              UnorderedElementsAre(
   1526                  Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc + 1)),
   1527                  Property(&rtcp::TmmbItem::ssrc, Eq(kSenderSsrc + 2))));
   1528 }
   1529 
   1530 TEST(RtcpReceiverTest,
   1531     VerifyBlockAndTimestampObtainedFromReportBlockDataObserver) {
   1532  ReceiverMocks mocks;
   1533  MockReportBlockDataObserverImpl observer;
   1534  mocks.config.report_block_data_observer = &observer;
   1535  RTCPReceiver receiver = Create(mocks);
   1536  receiver.SetRemoteSSRC(kSenderSsrc);
   1537 
   1538  const uint8_t kFractionLoss = 3;
   1539  const uint32_t kCumulativeLoss = 7;
   1540  const uint32_t kJitter = 9;
   1541  const uint16_t kSequenceNumber = 1234;
   1542  const Timestamp kUtcNow = Clock::NtpToUtc(mocks.clock.CurrentNtpTime());
   1543 
   1544  rtcp::ReportBlock rtcp_block;
   1545  rtcp_block.SetMediaSsrc(kReceiverMainSsrc);
   1546  rtcp_block.SetExtHighestSeqNum(kSequenceNumber);
   1547  rtcp_block.SetFractionLost(kFractionLoss);
   1548  rtcp_block.SetCumulativeLost(kCumulativeLoss);
   1549  rtcp_block.SetJitter(kJitter);
   1550 
   1551  rtcp::ReceiverReport rtcp_report;
   1552  rtcp_report.SetSenderSsrc(kSenderSsrc);
   1553  rtcp_report.AddReportBlock(rtcp_block);
   1554  EXPECT_CALL(observer, OnReportBlockDataUpdated)
   1555      .WillOnce([&](ReportBlockData report_block) {
   1556        EXPECT_EQ(rtcp_block.source_ssrc(), report_block.source_ssrc());
   1557        EXPECT_EQ(kSenderSsrc, report_block.sender_ssrc());
   1558        EXPECT_EQ(rtcp_block.fraction_lost(), report_block.fraction_lost_raw());
   1559        EXPECT_EQ(rtcp_block.cumulative_lost(), report_block.cumulative_lost());
   1560        EXPECT_EQ(rtcp_block.extended_high_seq_num(),
   1561                  report_block.extended_highest_sequence_number());
   1562        EXPECT_EQ(rtcp_block.jitter(), report_block.jitter());
   1563        EXPECT_EQ(report_block.report_block_timestamp_utc(), kUtcNow);
   1564        // No RTT is calculated in this test.
   1565        EXPECT_EQ(0u, report_block.num_rtts());
   1566      });
   1567  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1568  receiver.IncomingPacket(rtcp_report.Build());
   1569 }
   1570 
   1571 TEST(RtcpReceiverTest, VerifyRttObtainedFromReportBlockDataObserver) {
   1572  ReceiverMocks mocks;
   1573  MockReportBlockDataObserverImpl observer;
   1574  mocks.config.report_block_data_observer = &observer;
   1575  RTCPReceiver receiver = Create(mocks);
   1576  receiver.SetRemoteSSRC(kSenderSsrc);
   1577 
   1578  // To avoid issues with rounding due to different way to represent time units,
   1579  // use RTT that can be precisly represented both with
   1580  // TimeDelta units (i.e. integer number of microseconds), and
   1581  // ntp units (i.e. integer number of 2^(-32) seconds)
   1582  const TimeDelta kRtt = TimeDelta::Millis(125);
   1583  const uint32_t kDelayNtp = 123'000;
   1584  const TimeDelta kDelay = CompactNtpRttToTimeDelta(kDelayNtp);
   1585 
   1586  uint32_t sent_ntp = CompactNtp(mocks.clock.CurrentNtpTime());
   1587  mocks.clock.AdvanceTime(kRtt + kDelay);
   1588 
   1589  rtcp::SenderReport sr;
   1590  sr.SetSenderSsrc(kSenderSsrc);
   1591  rtcp::ReportBlock block;
   1592  block.SetMediaSsrc(kReceiverMainSsrc);
   1593  block.SetLastSr(sent_ntp);
   1594  block.SetDelayLastSr(kDelayNtp);
   1595  sr.AddReportBlock(block);
   1596  block.SetMediaSsrc(kReceiverExtraSsrc);
   1597  block.SetLastSr(0);
   1598  sr.AddReportBlock(block);
   1599 
   1600  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1601  InSequence sequence;
   1602  EXPECT_CALL(observer, OnReportBlockDataUpdated)
   1603      .WillOnce([&](ReportBlockData report_block_data) {
   1604        EXPECT_EQ(kReceiverMainSsrc, report_block_data.source_ssrc());
   1605        EXPECT_EQ(1u, report_block_data.num_rtts());
   1606        EXPECT_EQ(kRtt, report_block_data.sum_rtts());
   1607        EXPECT_EQ(kRtt, report_block_data.last_rtt());
   1608      });
   1609  EXPECT_CALL(observer, OnReportBlockDataUpdated)
   1610      .WillOnce([](ReportBlockData report_block_data) {
   1611        EXPECT_EQ(kReceiverExtraSsrc, report_block_data.source_ssrc());
   1612        EXPECT_EQ(0u, report_block_data.num_rtts());
   1613      });
   1614  receiver.IncomingPacket(sr.Build());
   1615 }
   1616 
   1617 TEST(RtcpReceiverTest, GetReportBlockDataAfterOneReportBlock) {
   1618  ReceiverMocks mocks;
   1619  RTCPReceiver receiver = Create(mocks);
   1620  receiver.SetRemoteSSRC(kSenderSsrc);
   1621 
   1622  const uint16_t kSequenceNumber = 1234;
   1623 
   1624  rtcp::ReportBlock rtcp_block;
   1625  rtcp_block.SetMediaSsrc(kReceiverMainSsrc);
   1626  rtcp_block.SetExtHighestSeqNum(kSequenceNumber);
   1627 
   1628  rtcp::ReceiverReport rtcp_report;
   1629  rtcp_report.SetSenderSsrc(kSenderSsrc);
   1630  rtcp_report.AddReportBlock(rtcp_block);
   1631  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1632  receiver.IncomingPacket(rtcp_report.Build());
   1633 
   1634  auto report_block_datas = receiver.GetLatestReportBlockData();
   1635  ASSERT_THAT(report_block_datas, SizeIs(1));
   1636  EXPECT_EQ(kReceiverMainSsrc, report_block_datas[0].source_ssrc());
   1637  EXPECT_EQ(kSequenceNumber,
   1638            report_block_datas[0].extended_highest_sequence_number());
   1639 }
   1640 
   1641 TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfSameSsrc) {
   1642  ReceiverMocks mocks;
   1643  RTCPReceiver receiver = Create(mocks);
   1644  receiver.SetRemoteSSRC(kSenderSsrc);
   1645 
   1646  const uint16_t kSequenceNumber1 = 1234;
   1647  const uint16_t kSequenceNumber2 = 1235;
   1648 
   1649  rtcp::ReportBlock rtcp_block1;
   1650  rtcp_block1.SetMediaSsrc(kReceiverMainSsrc);
   1651  rtcp_block1.SetExtHighestSeqNum(kSequenceNumber1);
   1652 
   1653  rtcp::ReceiverReport rtcp_report1;
   1654  rtcp_report1.SetSenderSsrc(kSenderSsrc);
   1655  rtcp_report1.AddReportBlock(rtcp_block1);
   1656  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1657  receiver.IncomingPacket(rtcp_report1.Build());
   1658 
   1659  // Inject a report block with an increased the sequence number for the same
   1660  // source SSRC.
   1661  rtcp::ReportBlock rtcp_block2;
   1662  rtcp_block2.SetMediaSsrc(kReceiverMainSsrc);
   1663  rtcp_block2.SetExtHighestSeqNum(kSequenceNumber2);
   1664 
   1665  rtcp::ReceiverReport rtcp_report2;
   1666  rtcp_report2.SetSenderSsrc(kSenderSsrc);
   1667  rtcp_report2.AddReportBlock(rtcp_block2);
   1668  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1669  receiver.IncomingPacket(rtcp_report2.Build());
   1670 
   1671  // Only the latest block should be returned.
   1672  auto report_block_datas = receiver.GetLatestReportBlockData();
   1673  ASSERT_THAT(report_block_datas, SizeIs(1));
   1674  EXPECT_EQ(kReceiverMainSsrc, report_block_datas[0].source_ssrc());
   1675  EXPECT_EQ(kSequenceNumber2,
   1676            report_block_datas[0].extended_highest_sequence_number());
   1677 }
   1678 
   1679 TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfDifferentSsrcs) {
   1680  ReceiverMocks mocks;
   1681  RTCPReceiver receiver = Create(mocks);
   1682  receiver.SetRemoteSSRC(kSenderSsrc);
   1683 
   1684  const uint16_t kSequenceNumber1 = 1234;
   1685  const uint16_t kSequenceNumber2 = 42;
   1686 
   1687  rtcp::ReportBlock rtcp_block1;
   1688  rtcp_block1.SetMediaSsrc(kReceiverMainSsrc);
   1689  rtcp_block1.SetExtHighestSeqNum(kSequenceNumber1);
   1690 
   1691  rtcp::ReceiverReport rtcp_report1;
   1692  rtcp_report1.SetSenderSsrc(kSenderSsrc);
   1693  rtcp_report1.AddReportBlock(rtcp_block1);
   1694  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1695  receiver.IncomingPacket(rtcp_report1.Build());
   1696 
   1697  // Inject a report block for a different source SSRC.
   1698  rtcp::ReportBlock rtcp_block2;
   1699  rtcp_block2.SetMediaSsrc(kReceiverExtraSsrc);
   1700  rtcp_block2.SetExtHighestSeqNum(kSequenceNumber2);
   1701 
   1702  rtcp::ReceiverReport rtcp_report2;
   1703  rtcp_report2.SetSenderSsrc(kSenderSsrc);
   1704  rtcp_report2.AddReportBlock(rtcp_block2);
   1705  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedRtcpReportBlocks);
   1706  receiver.IncomingPacket(rtcp_report2.Build());
   1707 
   1708  // Both report blocks should be returned.
   1709  auto report_block_datas = receiver.GetLatestReportBlockData();
   1710  ASSERT_THAT(report_block_datas, SizeIs(2));
   1711  EXPECT_EQ(kReceiverMainSsrc, report_block_datas[0].source_ssrc());
   1712  EXPECT_EQ(kSequenceNumber1,
   1713            report_block_datas[0].extended_highest_sequence_number());
   1714  EXPECT_EQ(kReceiverExtraSsrc, report_block_datas[1].source_ssrc());
   1715  EXPECT_EQ(kSequenceNumber2,
   1716            report_block_datas[1].extended_highest_sequence_number());
   1717 }
   1718 
   1719 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnTransportFeedback) {
   1720  ReceiverMocks mocks;
   1721  RTCPReceiver receiver = Create(mocks);
   1722  receiver.SetRemoteSSRC(kSenderSsrc);
   1723 
   1724  rtcp::TransportFeedback packet;
   1725  packet.SetMediaSsrc(mocks.config.local_media_ssrc);
   1726  packet.SetSenderSsrc(kSenderSsrc);
   1727  packet.SetBase(123, Timestamp::Millis(1));
   1728  packet.AddReceivedPacket(123, Timestamp::Millis(1));
   1729 
   1730  EXPECT_CALL(
   1731      mocks.network_link_rtcp_observer,
   1732      OnTransportFeedback(
   1733          mocks.clock.CurrentTime(),
   1734          AllOf(Property(&rtcp::TransportFeedback::GetBaseSequence, 123),
   1735                Property(&rtcp::TransportFeedback::GetReceivedPackets,
   1736                         SizeIs(1)))));
   1737 
   1738  receiver.IncomingPacket(packet.Build());
   1739 }
   1740 
   1741 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) {
   1742  ReceiverMocks mocks;
   1743  mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
   1744  RTCPReceiver receiver = Create(mocks);
   1745 
   1746  rtcp::CongestionControlFeedback packet(
   1747      {{
   1748          .ssrc = mocks.config.local_media_ssrc,
   1749          .sequence_number = 1,
   1750      }},
   1751      /*report_timestamp_compact_ntp=*/324);
   1752  packet.SetSenderSsrc(kSenderSsrc);
   1753 
   1754  EXPECT_CALL(
   1755      mocks.network_link_rtcp_observer,
   1756      OnCongestionControlFeedback(
   1757          mocks.clock.CurrentTime(),
   1758          Property(&rtcp::CongestionControlFeedback::packets, SizeIs(1))));
   1759  receiver.IncomingPacket(packet.Build());
   1760 }
   1761 
   1762 TEST(RtcpReceiverTest, FiltersCongestionControlFeedbackOnFirstSsrc) {
   1763  ReceiverMocks mocks_1;
   1764  mocks_1.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
   1765  RTCPReceiver receiver_1 = Create(mocks_1);
   1766 
   1767  ReceiverMocks mocks_2;
   1768  mocks_2.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
   1769  mocks_2.config.local_media_ssrc = 789;
   1770  mocks_2.config.rtx_send_ssrc = 345;
   1771  RTCPReceiver receiver_2 = Create(mocks_2);
   1772 
   1773  rtcp::CongestionControlFeedback packet(
   1774      {{
   1775          .ssrc = mocks_2.config.local_media_ssrc,
   1776          .sequence_number = 1,
   1777      }},
   1778      /*report_timestamp_compact_ntp=*/324);
   1779  packet.SetSenderSsrc(kSenderSsrc);
   1780 
   1781  EXPECT_CALL(mocks_1.network_link_rtcp_observer, OnCongestionControlFeedback)
   1782      .Times(0);
   1783  EXPECT_CALL(mocks_2.network_link_rtcp_observer, OnCongestionControlFeedback)
   1784      .Times(1);
   1785  receiver_1.IncomingPacket(packet.Build());
   1786  receiver_2.IncomingPacket(packet.Build());
   1787 }
   1788 
   1789 TEST(RtcpReceiverTest,
   1790     NotifiesNetworkStateEstimateObserverOnRemoteNetworkEstimate) {
   1791  ReceiverMocks mocks;
   1792  RTCPReceiver receiver = Create(mocks);
   1793  receiver.SetRemoteSSRC(kSenderSsrc);
   1794 
   1795  NetworkStateEstimate estimate;
   1796  estimate.link_capacity_lower = DataRate::BitsPerSec(1000);
   1797  estimate.link_capacity_upper = DataRate::BitsPerSec(10000);
   1798  rtcp::RemoteEstimate remote_estimate;
   1799  remote_estimate.SetEstimate(estimate);
   1800 
   1801  EXPECT_CALL(mocks.network_state_estimate_observer,
   1802              OnRemoteNetworkEstimate(
   1803                  AllOf(Field(&NetworkStateEstimate::link_capacity_lower,
   1804                              DataRate::BitsPerSec(1000)),
   1805                        Field(&NetworkStateEstimate::link_capacity_upper,
   1806                              DataRate::BitsPerSec(10000)))));
   1807 
   1808  receiver.IncomingPacket(remote_estimate.Build());
   1809 }
   1810 
   1811 TEST(RtcpReceiverTest,
   1812     NotifiesNetworkStateEstimateObserverBeforeNetworkLinkObserver) {
   1813  ReceiverMocks mocks;
   1814  RTCPReceiver receiver = Create(mocks);
   1815  receiver.SetRemoteSSRC(kSenderSsrc);
   1816 
   1817  NetworkStateEstimate estimate;
   1818  estimate.link_capacity_lower = DataRate::BitsPerSec(1000);
   1819  estimate.link_capacity_upper = DataRate::BitsPerSec(10000);
   1820  std::unique_ptr<rtcp::RemoteEstimate> remote_estimate =
   1821      std::make_unique<rtcp::RemoteEstimate>();
   1822  remote_estimate->SetEstimate(estimate);
   1823  std::unique_ptr<rtcp::TransportFeedback> feedback_packet =
   1824      std::make_unique<rtcp::TransportFeedback>();
   1825  feedback_packet->SetMediaSsrc(mocks.config.local_media_ssrc);
   1826  feedback_packet->SetSenderSsrc(kSenderSsrc);
   1827  feedback_packet->SetBase(123, Timestamp::Millis(1));
   1828  feedback_packet->AddReceivedPacket(123, Timestamp::Millis(1));
   1829  rtcp::CompoundPacket compound;
   1830  compound.Append(std::move(remote_estimate));
   1831  compound.Append(std::move(feedback_packet));
   1832 
   1833  InSequence s;
   1834  EXPECT_CALL(mocks.network_state_estimate_observer, OnRemoteNetworkEstimate);
   1835  EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback);
   1836  receiver.IncomingPacket(compound.Build());
   1837 }
   1838 
   1839 TEST(RtcpReceiverTest, HandlesInvalidCongestionControlFeedback) {
   1840  ReceiverMocks mocks;
   1841  mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
   1842  RTCPReceiver receiver = Create(mocks);
   1843  receiver.SetRemoteSSRC(kSenderSsrc);
   1844 
   1845  rtcp::CongestionControlFeedback packet({{
   1846                                             .ssrc = 123,
   1847                                             .sequence_number = 1,
   1848                                         }},
   1849                                         /*report_timestamp_compact_ntp=*/324);
   1850  packet.SetSenderSsrc(kSenderSsrc);
   1851  Buffer built_packet = packet.Build();
   1852  // Modify the CongestionControlFeedback packet so that it is invalid.
   1853  const size_t kNumReportsOffset = 14;
   1854  ByteWriter<uint16_t>::WriteBigEndian(&built_packet.data()[kNumReportsOffset],
   1855                                       42);
   1856 
   1857  EXPECT_CALL(mocks.network_link_rtcp_observer, OnCongestionControlFeedback)
   1858      .Times(0);
   1859  receiver.IncomingPacket(built_packet);
   1860 }
   1861 
   1862 TEST(RtcpReceiverTest,
   1863     NotifiesNetworkLinkObserverOnTransportFeedbackOnRtxSsrc) {
   1864  ReceiverMocks mocks;
   1865  RTCPReceiver receiver = Create(mocks);
   1866  receiver.SetRemoteSSRC(kSenderSsrc);
   1867 
   1868  rtcp::TransportFeedback packet;
   1869  packet.SetMediaSsrc(*mocks.config.rtx_send_ssrc);
   1870  packet.SetSenderSsrc(kSenderSsrc);
   1871  packet.SetBase(1, Timestamp::Millis(1));
   1872  packet.AddReceivedPacket(1, Timestamp::Millis(1));
   1873 
   1874  EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback);
   1875  receiver.IncomingPacket(packet.Build());
   1876 }
   1877 
   1878 TEST(RtcpReceiverTest,
   1879     DoesNotNotifyNetworkLinkObserverOnTransportFeedbackForUnregistedSsrc) {
   1880  ReceiverMocks mocks;
   1881  RTCPReceiver receiver = Create(mocks);
   1882  receiver.SetRemoteSSRC(kSenderSsrc);
   1883 
   1884  rtcp::TransportFeedback packet;
   1885  packet.SetMediaSsrc(kNotToUsSsrc);
   1886  packet.SetSenderSsrc(kSenderSsrc);
   1887  packet.SetBase(1, Timestamp::Millis(1));
   1888  packet.AddReceivedPacket(1, Timestamp::Millis(1));
   1889 
   1890  EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback).Times(0);
   1891  receiver.IncomingPacket(packet.Build());
   1892 }
   1893 
   1894 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnRemb) {
   1895  ReceiverMocks mocks;
   1896  RTCPReceiver receiver = Create(mocks);
   1897  receiver.SetRemoteSSRC(kSenderSsrc);
   1898 
   1899  rtcp::Remb remb;
   1900  remb.SetSenderSsrc(kSenderSsrc);
   1901  remb.SetBitrateBps(500'000);
   1902 
   1903  EXPECT_CALL(mocks.network_link_rtcp_observer,
   1904              OnReceiverEstimatedMaxBitrate(mocks.clock.CurrentTime(),
   1905                                            DataRate::BitsPerSec(500'000)));
   1906  receiver.IncomingPacket(remb.Build());
   1907 }
   1908 
   1909 TEST(RtcpReceiverTest, HandlesInvalidTransportFeedback) {
   1910  ReceiverMocks mocks;
   1911  RTCPReceiver receiver = Create(mocks);
   1912  receiver.SetRemoteSSRC(kSenderSsrc);
   1913 
   1914  // Send a compound packet with a TransportFeedback followed by something else.
   1915  auto packet = std::make_unique<rtcp::TransportFeedback>();
   1916  packet->SetMediaSsrc(kReceiverMainSsrc);
   1917  packet->SetSenderSsrc(kSenderSsrc);
   1918  packet->SetBase(1, Timestamp::Millis(1));
   1919  packet->AddReceivedPacket(1, Timestamp::Millis(1));
   1920 
   1921  static constexpr DataRate kBitrate = DataRate::BitsPerSec(50'000);
   1922  auto remb = std::make_unique<rtcp::Remb>();
   1923  remb->SetSenderSsrc(kSenderSsrc);
   1924  remb->SetBitrateBps(kBitrate.bps());
   1925  rtcp::CompoundPacket compound;
   1926  compound.Append(std::move(packet));
   1927  compound.Append(std::move(remb));
   1928  Buffer built_packet = compound.Build();
   1929 
   1930  // Modify the TransportFeedback packet so that it is invalid.
   1931  const size_t kStatusCountOffset = 14;
   1932  ByteWriter<uint16_t>::WriteBigEndian(&built_packet.data()[kStatusCountOffset],
   1933                                       42);
   1934 
   1935  // Stress no transport feedback is expected.
   1936  EXPECT_CALL(mocks.network_link_rtcp_observer, OnTransportFeedback).Times(0);
   1937  // But remb should be processed and cause a callback
   1938  EXPECT_CALL(mocks.network_link_rtcp_observer,
   1939              OnReceiverEstimatedMaxBitrate(_, kBitrate));
   1940  receiver.IncomingPacket(built_packet);
   1941 }
   1942 
   1943 TEST(RtcpReceiverTest, Nack) {
   1944  ReceiverMocks mocks;
   1945  RTCPReceiver receiver = Create(mocks);
   1946  receiver.SetRemoteSSRC(kSenderSsrc);
   1947 
   1948  const uint16_t kNackList1[] = {1, 2, 3, 5};
   1949  const uint16_t kNackList23[] = {5, 7, 30, 40, 41, 58, 59, 61, 63};
   1950  const size_t kNackListLength2 = 4;
   1951  const size_t kNackListLength3 = std::size(kNackList23) - kNackListLength2;
   1952  std::set<uint16_t> nack_set;
   1953  nack_set.insert(std::begin(kNackList1), std::end(kNackList1));
   1954  nack_set.insert(std::begin(kNackList23), std::end(kNackList23));
   1955 
   1956  auto nack1 = std::make_unique<rtcp::Nack>();
   1957  nack1->SetSenderSsrc(kSenderSsrc);
   1958  nack1->SetMediaSsrc(kReceiverMainSsrc);
   1959  nack1->SetPacketIds(kNackList1, std::size(kNackList1));
   1960 
   1961  EXPECT_CALL(mocks.rtp_rtcp_impl,
   1962              OnReceivedNack(ElementsAreArray(kNackList1)));
   1963  EXPECT_CALL(mocks.packet_type_counter_observer,
   1964              RtcpPacketTypesCounterUpdated(
   1965                  kReceiverMainSsrc,
   1966                  AllOf(Field(&RtcpPacketTypeCounter::nack_requests,
   1967                              std::size(kNackList1)),
   1968                        Field(&RtcpPacketTypeCounter::unique_nack_requests,
   1969                              std::size(kNackList1)))));
   1970  receiver.IncomingPacket(nack1->Build());
   1971 
   1972  auto nack2 = std::make_unique<rtcp::Nack>();
   1973  nack2->SetSenderSsrc(kSenderSsrc);
   1974  nack2->SetMediaSsrc(kReceiverMainSsrc);
   1975  nack2->SetPacketIds(kNackList23, kNackListLength2);
   1976 
   1977  auto nack3 = std::make_unique<rtcp::Nack>();
   1978  nack3->SetSenderSsrc(kSenderSsrc);
   1979  nack3->SetMediaSsrc(kReceiverMainSsrc);
   1980  nack3->SetPacketIds(kNackList23 + kNackListLength2, kNackListLength3);
   1981 
   1982  rtcp::CompoundPacket two_nacks;
   1983  two_nacks.Append(std::move(nack2));
   1984  two_nacks.Append(std::move(nack3));
   1985 
   1986  EXPECT_CALL(mocks.rtp_rtcp_impl,
   1987              OnReceivedNack(ElementsAreArray(kNackList23)));
   1988  EXPECT_CALL(mocks.packet_type_counter_observer,
   1989              RtcpPacketTypesCounterUpdated(
   1990                  kReceiverMainSsrc,
   1991                  AllOf(Field(&RtcpPacketTypeCounter::nack_requests,
   1992                              std::size(kNackList1) + std::size(kNackList23)),
   1993                        Field(&RtcpPacketTypeCounter::unique_nack_requests,
   1994                              nack_set.size()))));
   1995  receiver.IncomingPacket(two_nacks.Build());
   1996 }
   1997 
   1998 TEST(RtcpReceiverTest, NackNotForUsIgnored) {
   1999  ReceiverMocks mocks;
   2000  RTCPReceiver receiver = Create(mocks);
   2001  receiver.SetRemoteSSRC(kSenderSsrc);
   2002 
   2003  const uint16_t kNackList1[] = {1, 2, 3, 5};
   2004  const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
   2005 
   2006  rtcp::Nack nack;
   2007  nack.SetSenderSsrc(kSenderSsrc);
   2008  nack.SetMediaSsrc(kNotToUsSsrc);
   2009  nack.SetPacketIds(kNackList1, kNackListLength1);
   2010 
   2011  EXPECT_CALL(mocks.packet_type_counter_observer,
   2012              RtcpPacketTypesCounterUpdated(
   2013                  _, Field(&RtcpPacketTypeCounter::nack_requests, 0)));
   2014  receiver.IncomingPacket(nack.Build());
   2015 }
   2016 
   2017 TEST(RtcpReceiverTest, ForceSenderReport) {
   2018  ReceiverMocks mocks;
   2019  RTCPReceiver receiver = Create(mocks);
   2020  receiver.SetRemoteSSRC(kSenderSsrc);
   2021 
   2022  rtcp::RapidResyncRequest rr;
   2023  rr.SetSenderSsrc(kSenderSsrc);
   2024  rr.SetMediaSsrc(kReceiverMainSsrc);
   2025 
   2026  EXPECT_CALL(mocks.rtp_rtcp_impl, OnRequestSendReport());
   2027  receiver.IncomingPacket(rr.Build());
   2028 }
   2029 
   2030 TEST(RtcpReceiverTest, ReceivesTargetBitrate) {
   2031  ReceiverMocks mocks;
   2032  RTCPReceiver receiver = Create(mocks);
   2033  receiver.SetRemoteSSRC(kSenderSsrc);
   2034 
   2035  VideoBitrateAllocation expected_allocation;
   2036  expected_allocation.SetBitrate(0, 0, 10000);
   2037  expected_allocation.SetBitrate(0, 1, 20000);
   2038  expected_allocation.SetBitrate(1, 0, 40000);
   2039  expected_allocation.SetBitrate(1, 1, 80000);
   2040 
   2041  rtcp::TargetBitrate bitrate;
   2042  bitrate.AddTargetBitrate(0, 0, expected_allocation.GetBitrate(0, 0) / 1000);
   2043  bitrate.AddTargetBitrate(0, 1, expected_allocation.GetBitrate(0, 1) / 1000);
   2044  bitrate.AddTargetBitrate(1, 0, expected_allocation.GetBitrate(1, 0) / 1000);
   2045  bitrate.AddTargetBitrate(1, 1, expected_allocation.GetBitrate(1, 1) / 1000);
   2046 
   2047  rtcp::ExtendedReports xr;
   2048  xr.SetTargetBitrate(bitrate);
   2049 
   2050  // Wrong sender ssrc, target bitrate should be discarded.
   2051  xr.SetSenderSsrc(kSenderSsrc + 1);
   2052  EXPECT_CALL(mocks.bitrate_allocation_observer,
   2053              OnBitrateAllocationUpdated(expected_allocation))
   2054      .Times(0);
   2055  receiver.IncomingPacket(xr.Build());
   2056 
   2057  // Set correct ssrc, callback should be called once.
   2058  xr.SetSenderSsrc(kSenderSsrc);
   2059  EXPECT_CALL(mocks.bitrate_allocation_observer,
   2060              OnBitrateAllocationUpdated(expected_allocation));
   2061  receiver.IncomingPacket(xr.Build());
   2062 }
   2063 
   2064 TEST(RtcpReceiverTest, HandlesIncorrectTargetBitrate) {
   2065  ReceiverMocks mocks;
   2066  RTCPReceiver receiver = Create(mocks);
   2067  receiver.SetRemoteSSRC(kSenderSsrc);
   2068 
   2069  VideoBitrateAllocation expected_allocation;
   2070  expected_allocation.SetBitrate(0, 0, 10000);
   2071 
   2072  rtcp::TargetBitrate bitrate;
   2073  bitrate.AddTargetBitrate(0, 0, expected_allocation.GetBitrate(0, 0) / 1000);
   2074  bitrate.AddTargetBitrate(0, kMaxTemporalStreams, 20000);
   2075  bitrate.AddTargetBitrate(kMaxSpatialLayers, 0, 40000);
   2076 
   2077  rtcp::ExtendedReports xr;
   2078  xr.SetTargetBitrate(bitrate);
   2079  xr.SetSenderSsrc(kSenderSsrc);
   2080 
   2081  EXPECT_CALL(mocks.bitrate_allocation_observer,
   2082              OnBitrateAllocationUpdated(expected_allocation));
   2083  receiver.IncomingPacket(xr.Build());
   2084 }
   2085 
   2086 TEST(RtcpReceiverTest, ChangeLocalMediaSsrc) {
   2087  ReceiverMocks mocks;
   2088  // Construct a receiver with `kReceiverMainSsrc` (default) local media ssrc.
   2089  RTCPReceiver receiver = Create(mocks);
   2090  receiver.SetRemoteSSRC(kSenderSsrc);
   2091 
   2092  constexpr uint32_t kSecondarySsrc = kReceiverMainSsrc + 1;
   2093 
   2094  // Expect to only get the `OnReceivedNack()` callback once since we'll
   2095  // configure it for the `kReceiverMainSsrc` media ssrc.
   2096  EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedNack);
   2097 
   2098  // We'll get two callbacks to RtcpPacketTypesCounterUpdated, one for each
   2099  // call to `IncomingPacket`, differentiated by the local media ssrc.
   2100  EXPECT_CALL(mocks.packet_type_counter_observer,
   2101              RtcpPacketTypesCounterUpdated(kReceiverMainSsrc, _));
   2102  EXPECT_CALL(mocks.packet_type_counter_observer,
   2103              RtcpPacketTypesCounterUpdated(kSecondarySsrc, _));
   2104 
   2105  // Construct a test nack packet with media ssrc set to `kReceiverMainSsrc`.
   2106  rtcp::Nack nack;
   2107  nack.SetSenderSsrc(kSenderSsrc);
   2108  nack.SetMediaSsrc(kReceiverMainSsrc);
   2109  const uint16_t kNackList[] = {1, 2, 3, 5};
   2110  nack.SetPacketIds(kNackList, std::size(kNackList));
   2111 
   2112  // Deliver the first callback.
   2113  receiver.IncomingPacket(nack.Build());
   2114 
   2115  // Change the set local media ssrc.
   2116  receiver.set_local_media_ssrc(kSecondarySsrc);
   2117 
   2118  // Deliver another packet - this time there will be no callback to
   2119  // OnReceivedNack due to the ssrc not matching.
   2120  receiver.IncomingPacket(nack.Build());
   2121 }
   2122 
   2123 }  // namespace webrtc