tor-browser

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

packet_router_unittest.cc (32248B)


      1 /*
      2 *  Copyright (c) 2015 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/pacing/packet_router.h"
     12 
     13 #include <cstddef>
     14 #include <cstdint>
     15 #include <memory>
     16 #include <optional>
     17 #include <utility>
     18 #include <vector>
     19 
     20 #include "api/rtp_headers.h"
     21 #include "api/transport/network_types.h"
     22 #include "api/units/data_size.h"
     23 #include "api/units/time_delta.h"
     24 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
     25 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     26 #include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
     27 #include "modules/rtp_rtcp/source/rtcp_packet.h"
     28 #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
     29 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
     30 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
     31 #include "rtc_base/checks.h"
     32 #include "rtc_base/fake_clock.h"
     33 #include "test/gmock.h"
     34 #include "test/gtest.h"
     35 
     36 namespace webrtc {
     37 
     38 // TODO(eladalon): Restructure and/or replace the existing monolithic tests
     39 // (only some of the test are monolithic) according to the new
     40 // guidelines - small tests for one thing at a time.
     41 // (I'm not removing any tests during CL, so as to demonstrate no regressions.)
     42 
     43 namespace {
     44 
     45 using ::testing::_;
     46 using ::testing::ElementsAreArray;
     47 using ::testing::InSequence;
     48 using ::testing::MockFunction;
     49 using ::testing::NiceMock;
     50 using ::testing::Pointee;
     51 using ::testing::Property;
     52 using ::testing::Return;
     53 
     54 constexpr int kProbeMinProbes = 5;
     55 constexpr int kProbeMinBytes = 1000;
     56 
     57 }  // namespace
     58 
     59 class PacketRouterTest : public ::testing::Test {
     60 public:
     61  PacketRouterTest() {
     62    extension_manager.Register<TransportSequenceNumber>(/*id=*/1);
     63  }
     64 
     65 protected:
     66  std::unique_ptr<RtpPacketToSend> BuildRtpPacket(uint32_t ssrc) {
     67    std::unique_ptr<RtpPacketToSend> packet =
     68        std::make_unique<RtpPacketToSend>(&extension_manager);
     69    packet->SetSsrc(ssrc);
     70    return packet;
     71  }
     72 
     73  PacketRouter packet_router_;
     74  RtpHeaderExtensionMap extension_manager;
     75 };
     76 
     77 TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_GeneratePadding) {
     78  constexpr DataSize bytes = DataSize::Bytes(300);
     79  const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
     80 
     81  EXPECT_TRUE(packet_router_.GeneratePadding(bytes).empty());
     82 }
     83 
     84 TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
     85  const std::vector<uint32_t> ssrcs = {1, 2, 3};
     86  constexpr uint32_t bitrate_bps = 10000;
     87  // Expect not to crash
     88  packet_router_.SendRemb(bitrate_bps, ssrcs);
     89 }
     90 
     91 TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
     92  std::vector<std::unique_ptr<rtcp::RtcpPacket>> feedback;
     93  feedback.push_back(std::make_unique<rtcp::TransportFeedback>());
     94  // Expect not to crash
     95  packet_router_.SendCombinedRtcpPacket(std::move(feedback));
     96 }
     97 
     98 TEST_F(PacketRouterTest, GeneratePaddingPrioritizesRtx) {
     99  // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
    100  // should not be called.
    101  const uint16_t kSsrc1 = 1234;
    102  const uint16_t kSsrc2 = 4567;
    103 
    104  NiceMock<MockRtpRtcpInterface> rtp_1;
    105  ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
    106  ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
    107  ON_CALL(rtp_1, SupportsPadding).WillByDefault(Return(false));
    108 
    109  NiceMock<MockRtpRtcpInterface> rtp_2;
    110  ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
    111  ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
    112  ON_CALL(rtp_2, SupportsPadding).WillByDefault(Return(true));
    113 
    114  packet_router_.AddSendRtpModule(&rtp_1, false);
    115  packet_router_.AddSendRtpModule(&rtp_2, false);
    116 
    117  const size_t kPaddingSize = 123;
    118  const size_t kExpectedPaddingPackets = 1;
    119  EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
    120  EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize))
    121      .WillOnce([&](size_t /* padding_size */) {
    122        return std::vector<std::unique_ptr<RtpPacketToSend>>(
    123            kExpectedPaddingPackets);
    124      });
    125  auto generated_padding =
    126      packet_router_.GeneratePadding(DataSize::Bytes(kPaddingSize));
    127  EXPECT_EQ(generated_padding.size(), kExpectedPaddingPackets);
    128 
    129  packet_router_.RemoveSendRtpModule(&rtp_1);
    130  packet_router_.RemoveSendRtpModule(&rtp_2);
    131 }
    132 
    133 TEST_F(PacketRouterTest, SupportsRtxPayloadPaddingFalseIfNoRtxSendModule) {
    134  EXPECT_FALSE(packet_router_.SupportsRtxPayloadPadding());
    135 
    136  NiceMock<MockRtpRtcpInterface> none_rtx_module;
    137  ON_CALL(none_rtx_module, SupportsRtxPayloadPadding())
    138      .WillByDefault(Return(false));
    139 
    140  packet_router_.AddSendRtpModule(&none_rtx_module, false);
    141  EXPECT_FALSE(packet_router_.SupportsRtxPayloadPadding());
    142 
    143  packet_router_.RemoveSendRtpModule(&none_rtx_module);
    144  EXPECT_FALSE(packet_router_.SupportsRtxPayloadPadding());
    145 }
    146 
    147 TEST_F(PacketRouterTest, SupportsRtxPayloadPaddingTrueIfRtxSendModule) {
    148  NiceMock<MockRtpRtcpInterface> rtx_module;
    149  ON_CALL(rtx_module, SupportsRtxPayloadPadding()).WillByDefault(Return(true));
    150 
    151  packet_router_.AddSendRtpModule(&rtx_module, false);
    152  EXPECT_TRUE(packet_router_.SupportsRtxPayloadPadding());
    153 
    154  packet_router_.RemoveSendRtpModule(&rtx_module);
    155  EXPECT_FALSE(packet_router_.SupportsRtxPayloadPadding());
    156 }
    157 
    158 TEST_F(PacketRouterTest, GeneratePaddingPrioritizesVideo) {
    159  // Two RTP modules. Neither support RTX, both support padding,
    160  // but the first one is for audio and second for video.
    161  const uint16_t kSsrc1 = 1234;
    162  const uint16_t kSsrc2 = 4567;
    163  const size_t kPaddingSize = 123;
    164  const size_t kExpectedPaddingPackets = 1;
    165 
    166  auto generate_padding = [&](size_t /* padding_size */) {
    167    return std::vector<std::unique_ptr<RtpPacketToSend>>(
    168        kExpectedPaddingPackets);
    169  };
    170 
    171  NiceMock<MockRtpRtcpInterface> audio_module;
    172  ON_CALL(audio_module, RtxSendStatus()).WillByDefault(Return(kRtxOff));
    173  ON_CALL(audio_module, SSRC()).WillByDefault(Return(kSsrc1));
    174  ON_CALL(audio_module, SupportsPadding).WillByDefault(Return(true));
    175  ON_CALL(audio_module, IsAudioConfigured).WillByDefault(Return(true));
    176 
    177  NiceMock<MockRtpRtcpInterface> video_module;
    178  ON_CALL(video_module, RtxSendStatus()).WillByDefault(Return(kRtxOff));
    179  ON_CALL(video_module, SSRC()).WillByDefault(Return(kSsrc2));
    180  ON_CALL(video_module, SupportsPadding).WillByDefault(Return(true));
    181  ON_CALL(video_module, IsAudioConfigured).WillByDefault(Return(false));
    182 
    183  // First add only the audio module. Since this is the only choice we have,
    184  // padding should be sent on the audio ssrc.
    185  packet_router_.AddSendRtpModule(&audio_module, false);
    186  EXPECT_CALL(audio_module, GeneratePadding(kPaddingSize))
    187      .WillOnce(generate_padding);
    188  packet_router_.GeneratePadding(DataSize::Bytes(kPaddingSize));
    189 
    190  // Add the video module, this should now be prioritized since we cannot
    191  // guarantee that audio packets will be included in the BWE.
    192  packet_router_.AddSendRtpModule(&video_module, false);
    193  EXPECT_CALL(audio_module, GeneratePadding).Times(0);
    194  EXPECT_CALL(video_module, GeneratePadding(kPaddingSize))
    195      .WillOnce(generate_padding);
    196  packet_router_.GeneratePadding(DataSize::Bytes(kPaddingSize));
    197 
    198  // Remove and the add audio module again. Module order shouldn't matter;
    199  // video should still be prioritized.
    200  packet_router_.RemoveSendRtpModule(&audio_module);
    201  packet_router_.AddSendRtpModule(&audio_module, false);
    202  EXPECT_CALL(audio_module, GeneratePadding).Times(0);
    203  EXPECT_CALL(video_module, GeneratePadding(kPaddingSize))
    204      .WillOnce(generate_padding);
    205  packet_router_.GeneratePadding(DataSize::Bytes(kPaddingSize));
    206 
    207  // Remove and the video module, we should fall back to padding on the
    208  // audio module again.
    209  packet_router_.RemoveSendRtpModule(&video_module);
    210  EXPECT_CALL(audio_module, GeneratePadding(kPaddingSize))
    211      .WillOnce(generate_padding);
    212  packet_router_.GeneratePadding(DataSize::Bytes(kPaddingSize));
    213 
    214  packet_router_.RemoveSendRtpModule(&audio_module);
    215 }
    216 
    217 TEST_F(PacketRouterTest, PadsOnLastActiveMediaStream) {
    218  const uint16_t kSsrc1 = 1234;
    219  const uint16_t kSsrc2 = 4567;
    220  const uint16_t kSsrc3 = 8901;
    221 
    222  // First two rtp modules send media and have rtx.
    223  NiceMock<MockRtpRtcpInterface> rtp_1;
    224  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
    225  EXPECT_CALL(rtp_1, SupportsPadding).WillRepeatedly(Return(true));
    226  EXPECT_CALL(rtp_1, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
    227  EXPECT_CALL(rtp_1, CanSendPacket)
    228      .WillRepeatedly([&](const RtpPacketToSend& packet) {
    229        if (packet.Ssrc() == kSsrc1) {
    230          return true;
    231        }
    232        return false;
    233      });
    234 
    235  NiceMock<MockRtpRtcpInterface> rtp_2;
    236  EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
    237  EXPECT_CALL(rtp_2, SupportsPadding).WillRepeatedly(Return(true));
    238  EXPECT_CALL(rtp_2, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
    239  EXPECT_CALL(rtp_2, CanSendPacket)
    240      .WillRepeatedly([&](const RtpPacketToSend& packet) {
    241        if (packet.Ssrc() == kSsrc2) {
    242          return true;
    243        }
    244        return false;
    245      });
    246 
    247  // Third module is sending media, but does not support rtx.
    248  NiceMock<MockRtpRtcpInterface> rtp_3;
    249  EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
    250  EXPECT_CALL(rtp_3, SupportsPadding).WillRepeatedly(Return(true));
    251  EXPECT_CALL(rtp_3, SupportsRtxPayloadPadding).WillRepeatedly(Return(false));
    252  EXPECT_CALL(rtp_3, CanSendPacket)
    253      .WillRepeatedly([&](const RtpPacketToSend& packet) {
    254        if (packet.Ssrc() == kSsrc3) {
    255          return true;
    256        }
    257        return false;
    258      });
    259 
    260  packet_router_.AddSendRtpModule(&rtp_1, false);
    261  packet_router_.AddSendRtpModule(&rtp_2, false);
    262  packet_router_.AddSendRtpModule(&rtp_3, false);
    263 
    264  const size_t kPaddingBytes = 100;
    265 
    266  // Initially, padding will be sent on last added rtp module that sends media
    267  // and supports rtx.
    268  EXPECT_CALL(rtp_2, GeneratePadding(kPaddingBytes))
    269      .Times(1)
    270      .WillOnce([&](size_t /* target_size_bytes */) {
    271        std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    272        packets.push_back(BuildRtpPacket(kSsrc2));
    273        return packets;
    274      });
    275  packet_router_.GeneratePadding(DataSize::Bytes(kPaddingBytes));
    276 
    277  // Send media on first module. Padding should be sent on that module.
    278  packet_router_.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
    279 
    280  EXPECT_CALL(rtp_1, GeneratePadding(kPaddingBytes))
    281      .Times(1)
    282      .WillOnce([&](size_t /* target_size_bytes */) {
    283        std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    284        packets.push_back(BuildRtpPacket(kSsrc1));
    285        return packets;
    286      });
    287  packet_router_.GeneratePadding(DataSize::Bytes(kPaddingBytes));
    288 
    289  // Send media on second module. Padding should be sent there.
    290  packet_router_.SendPacket(BuildRtpPacket(kSsrc2), PacedPacketInfo());
    291 
    292  // If the last active module is removed, and no module sends media before
    293  // the next padding request, and arbitrary module will be selected.
    294  packet_router_.OnBatchComplete();
    295  packet_router_.RemoveSendRtpModule(&rtp_2);
    296 
    297  // Send on and then remove all remaining modules.
    298  RtpRtcpInterface* last_send_module;
    299  EXPECT_CALL(rtp_1, GeneratePadding(kPaddingBytes))
    300      .Times(1)
    301      .WillOnce([&](size_t /* target_size_bytes */) {
    302        last_send_module = &rtp_1;
    303        std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    304        packets.push_back(BuildRtpPacket(kSsrc1));
    305        return packets;
    306      });
    307  EXPECT_CALL(rtp_3, GeneratePadding(kPaddingBytes))
    308      .Times(1)
    309      .WillOnce([&](size_t /* target_size_bytes */) {
    310        last_send_module = &rtp_3;
    311        std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    312        packets.push_back(BuildRtpPacket(kSsrc3));
    313        return packets;
    314      });
    315 
    316  for (int i = 0; i < 2; ++i) {
    317    last_send_module = nullptr;
    318    packet_router_.GeneratePadding(DataSize::Bytes(kPaddingBytes));
    319    EXPECT_NE(last_send_module, nullptr);
    320    packet_router_.RemoveSendRtpModule(last_send_module);
    321  }
    322 }
    323 
    324 TEST_F(PacketRouterTest, AllocatesRtpSequenceNumbersIfPacketCanBeSent) {
    325  const uint16_t kSsrc1 = 1234;
    326  PacketRouter packet_router;
    327  NiceMock<MockRtpRtcpInterface> rtp;
    328  ON_CALL(rtp, SSRC()).WillByDefault(Return(kSsrc1));
    329 
    330  InSequence s;
    331  EXPECT_CALL(rtp, CanSendPacket).WillRepeatedly(Return(true));
    332  EXPECT_CALL(rtp, AssignSequenceNumber);
    333  packet_router.AddSendRtpModule(&rtp, false);
    334  packet_router.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
    335 
    336  packet_router.OnBatchComplete();
    337  packet_router.RemoveSendRtpModule(&rtp);
    338 }
    339 
    340 TEST_F(PacketRouterTest, DoNotAllocatesRtpSequenceNumbersIfPacketCanNotBeSent) {
    341  const uint16_t kSsrc1 = 1234;
    342  PacketRouter packet_router;
    343  NiceMock<MockRtpRtcpInterface> rtp;
    344  ON_CALL(rtp, SSRC()).WillByDefault(Return(kSsrc1));
    345 
    346  EXPECT_CALL(rtp, CanSendPacket).WillRepeatedly(Return(false));
    347  EXPECT_CALL(rtp, AssignSequenceNumber).Times(0);
    348  packet_router.AddSendRtpModule(&rtp, false);
    349  packet_router.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
    350 
    351  packet_router.OnBatchComplete();
    352  packet_router.RemoveSendRtpModule(&rtp);
    353 }
    354 
    355 TEST_F(PacketRouterTest, AllocatesTransportSequenceNumbers) {
    356  const uint16_t kSsrc1 = 1234;
    357 
    358  PacketRouter packet_router;
    359  testing::MockFunction<void(const RtpPacketToSend& packet,
    360                             const PacedPacketInfo& pacing_info)>
    361      notify_bwe_callback;
    362  NiceMock<MockRtpRtcpInterface> rtp_1;
    363  packet_router.RegisterNotifyBweCallback(notify_bwe_callback.AsStdFunction());
    364 
    365  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
    366  EXPECT_CALL(rtp_1, CanSendPacket).WillRepeatedly(Return(true));
    367 
    368  packet_router.AddSendRtpModule(&rtp_1, false);
    369 
    370  auto packet = BuildRtpPacket(kSsrc1);
    371  EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
    372  EXPECT_CALL(notify_bwe_callback, Call)
    373      .WillOnce([](const RtpPacketToSend& packet,
    374                   const PacedPacketInfo& /* pacing_info */) {
    375        EXPECT_EQ(packet.transport_sequence_number(), 1);
    376      });
    377  packet_router.SendPacket(std::move(packet), PacedPacketInfo());
    378 
    379  packet_router.OnBatchComplete();
    380  packet_router.RemoveSendRtpModule(&rtp_1);
    381 }
    382 
    383 TEST_F(PacketRouterTest,
    384       DoesNotAllocateTransportSequenceNumberWithoutExtension) {
    385  const uint16_t kSsrc1 = 1234;
    386 
    387  PacketRouter packet_router;
    388  testing::MockFunction<void(const RtpPacketToSend& packet,
    389                             const PacedPacketInfo& pacing_info)>
    390      notify_bwe_callback;
    391  NiceMock<MockRtpRtcpInterface> rtp_1;
    392  packet_router.RegisterNotifyBweCallback(notify_bwe_callback.AsStdFunction());
    393 
    394  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
    395  EXPECT_CALL(rtp_1, CanSendPacket).WillRepeatedly(Return(true));
    396 
    397  packet_router.AddSendRtpModule(&rtp_1, false);
    398 
    399  auto packet = BuildRtpPacket(kSsrc1);
    400  EXPECT_CALL(notify_bwe_callback, Call)
    401      .WillOnce([](const RtpPacketToSend& packet,
    402                   const PacedPacketInfo& /* pacing_info */) {
    403        EXPECT_EQ(packet.transport_sequence_number(), std::nullopt);
    404      });
    405  packet_router.SendPacket(std::move(packet), PacedPacketInfo());
    406 
    407  packet_router.OnBatchComplete();
    408  packet_router.RemoveSendRtpModule(&rtp_1);
    409 }
    410 
    411 TEST_F(PacketRouterTest,
    412       AllocateTransportSequenceNumberWithoutExtensionIfRfc8888Enabled) {
    413  const uint16_t kSsrc1 = 1234;
    414 
    415  PacketRouter packet_router;
    416  testing::MockFunction<void(const RtpPacketToSend& packet,
    417                             const PacedPacketInfo& pacing_info)>
    418      notify_bwe_callback;
    419  NiceMock<MockRtpRtcpInterface> rtp_1;
    420  packet_router.RegisterNotifyBweCallback(notify_bwe_callback.AsStdFunction());
    421 
    422  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
    423  EXPECT_CALL(rtp_1, CanSendPacket).WillRepeatedly(Return(true));
    424 
    425  packet_router.AddSendRtpModule(&rtp_1, false);
    426  packet_router.ConfigureForRfc8888Feedback(/*send_rtp_packets_as_ect1=*/false);
    427 
    428  auto packet = BuildRtpPacket(kSsrc1);
    429  EXPECT_CALL(notify_bwe_callback, Call)
    430      .WillOnce([](const RtpPacketToSend& packet,
    431                   const PacedPacketInfo& /* pacing_info */) {
    432        EXPECT_EQ(packet.transport_sequence_number(), 1);
    433      });
    434  packet_router.SendPacket(std::move(packet), PacedPacketInfo());
    435 
    436  packet_router.OnBatchComplete();
    437  packet_router.RemoveSendRtpModule(&rtp_1);
    438 }
    439 
    440 TEST_F(PacketRouterTest, SendPacketsAsEct1IfConfigured) {
    441  const uint16_t kSsrc1 = 1234;
    442  PacketRouter packet_router;
    443  NiceMock<MockRtpRtcpInterface> rtp_1;
    444  ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
    445  ON_CALL(rtp_1, CanSendPacket).WillByDefault(Return(kSsrc1));
    446 
    447  packet_router.AddSendRtpModule(&rtp_1, false);
    448  packet_router.ConfigureForRfc8888Feedback(/*send_rtp_packets_as_ect1=*/true);
    449 
    450  testing::Sequence s;
    451  EXPECT_CALL(
    452      rtp_1,
    453      SendPacket(Pointee(Property(&RtpPacketToSend::send_as_ect1, true)), _))
    454      .InSequence(s);
    455  EXPECT_CALL(
    456      rtp_1,
    457      SendPacket(Pointee(Property(&RtpPacketToSend::send_as_ect1, false)), _))
    458      .InSequence(s);
    459 
    460  packet_router.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
    461  packet_router.ConfigureForRfc8888Feedback(/*send_rtp_packets_as_ect1=*/false);
    462  packet_router.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
    463 
    464  packet_router.OnBatchComplete();
    465  packet_router.RemoveSendRtpModule(&rtp_1);
    466 }
    467 
    468 TEST_F(PacketRouterTest, SendTransportFeedback) {
    469  NiceMock<MockRtpRtcpInterface> rtp_1;
    470  NiceMock<MockRtpRtcpInterface> rtp_2;
    471 
    472  ON_CALL(rtp_1, RTCP()).WillByDefault(Return(RtcpMode::kCompound));
    473  ON_CALL(rtp_2, RTCP()).WillByDefault(Return(RtcpMode::kCompound));
    474 
    475  packet_router_.AddSendRtpModule(&rtp_1, false);
    476  packet_router_.AddReceiveRtpModule(&rtp_2, false);
    477 
    478  std::vector<std::unique_ptr<rtcp::RtcpPacket>> feedback;
    479  feedback.push_back(std::make_unique<rtcp::TransportFeedback>());
    480  EXPECT_CALL(rtp_1, SendCombinedRtcpPacket);
    481  packet_router_.SendCombinedRtcpPacket(std::move(feedback));
    482  packet_router_.RemoveSendRtpModule(&rtp_1);
    483  EXPECT_CALL(rtp_2, SendCombinedRtcpPacket);
    484  std::vector<std::unique_ptr<rtcp::RtcpPacket>> new_feedback;
    485  new_feedback.push_back(std::make_unique<rtcp::TransportFeedback>());
    486  packet_router_.SendCombinedRtcpPacket(std::move(new_feedback));
    487  packet_router_.RemoveReceiveRtpModule(&rtp_2);
    488 }
    489 
    490 TEST_F(PacketRouterTest, SendPacketWithoutTransportSequenceNumbers) {
    491  const uint16_t kSsrc1 = 1234;
    492  NiceMock<MockRtpRtcpInterface> rtp_1;
    493  ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
    494  ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
    495  ON_CALL(rtp_1, CanSendPacket).WillByDefault(Return(true));
    496  packet_router_.AddSendRtpModule(&rtp_1, false);
    497 
    498  // Send a packet without TransportSequenceNumber extension registered,
    499  // packets sent should not have the extension set.
    500  RtpHeaderExtensionMap extension_manager;
    501  auto packet = std::make_unique<RtpPacketToSend>(&extension_manager);
    502  packet->SetSsrc(kSsrc1);
    503  EXPECT_CALL(
    504      rtp_1,
    505      SendPacket(
    506          AllOf(Pointee(Property(
    507                    &RtpPacketToSend::HasExtension<TransportSequenceNumber>,
    508                    false)),
    509                Pointee(Property(&RtpPacketToSend::transport_sequence_number,
    510                                 std::nullopt))),
    511          _));
    512  packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
    513  packet_router_.OnBatchComplete();
    514  packet_router_.RemoveSendRtpModule(&rtp_1);
    515 }
    516 
    517 TEST_F(PacketRouterTest, DoesNotIncrementTransportSequenceNumberOnSendFailure) {
    518  NiceMock<MockRtpRtcpInterface> rtp;
    519  constexpr uint32_t kSsrc = 1234;
    520  ON_CALL(rtp, SSRC).WillByDefault(Return(kSsrc));
    521  packet_router_.AddSendRtpModule(&rtp, false);
    522 
    523  // Transport sequence numbers start at 1, for historical reasons.
    524  const uint16_t kStartTransportSequenceNumber = 1;
    525 
    526  // Build and send a packet - it should be assigned the start sequence number.
    527  // Return failure status code to make sure sequence number is not incremented.
    528  auto packet = BuildRtpPacket(kSsrc);
    529  EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
    530  EXPECT_CALL(rtp, CanSendPacket)
    531      .WillOnce([&](const RtpPacketToSend& /* packet */) { return false; });
    532  packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
    533 
    534  // Send another packet, verify transport sequence number is still at the
    535  // start state.
    536  packet = BuildRtpPacket(kSsrc);
    537  EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
    538 
    539  EXPECT_CALL(rtp, CanSendPacket).WillOnce(Return(true));
    540  EXPECT_CALL(rtp, SendPacket)
    541      .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
    542                    const PacedPacketInfo& /* pacing_info */) {
    543        EXPECT_EQ(packet->transport_sequence_number(),
    544                  kStartTransportSequenceNumber);
    545      });
    546  packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
    547 
    548  packet_router_.OnBatchComplete();
    549  packet_router_.RemoveSendRtpModule(&rtp);
    550 }
    551 
    552 TEST_F(PacketRouterTest, ForwardsAbortedRetransmissions) {
    553  NiceMock<MockRtpRtcpInterface> rtp_1;
    554  NiceMock<MockRtpRtcpInterface> rtp_2;
    555 
    556  const uint32_t kSsrc1 = 1234;
    557  const uint32_t kSsrc2 = 2345;
    558  const uint32_t kInvalidSsrc = 3456;
    559 
    560  ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
    561  ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
    562 
    563  packet_router_.AddSendRtpModule(&rtp_1, false);
    564  packet_router_.AddSendRtpModule(&rtp_2, false);
    565 
    566  // Sets of retransmission sequence numbers we wish to abort, per ssrc.
    567  const uint16_t kAbortedRetransmissionsOnSsrc1[] = {17, 42};
    568  const uint16_t kAbortedRetransmissionsOnSsrc2[] = {1337, 4711};
    569  const uint16_t kAbortedRetransmissionsOnSsrc3[] = {123};
    570 
    571  EXPECT_CALL(rtp_1, OnAbortedRetransmissions(
    572                         ElementsAreArray(kAbortedRetransmissionsOnSsrc1)));
    573  EXPECT_CALL(rtp_2, OnAbortedRetransmissions(
    574                         ElementsAreArray(kAbortedRetransmissionsOnSsrc2)));
    575 
    576  packet_router_.OnAbortedRetransmissions(kSsrc1,
    577                                          kAbortedRetransmissionsOnSsrc1);
    578  packet_router_.OnAbortedRetransmissions(kSsrc2,
    579                                          kAbortedRetransmissionsOnSsrc2);
    580 
    581  // Should be noop and not cause any issues.
    582  packet_router_.OnAbortedRetransmissions(kInvalidSsrc,
    583                                          kAbortedRetransmissionsOnSsrc3);
    584 
    585  packet_router_.RemoveSendRtpModule(&rtp_1);
    586  packet_router_.RemoveSendRtpModule(&rtp_2);
    587 }
    588 
    589 TEST_F(PacketRouterTest, ReportsRtxSsrc) {
    590  NiceMock<MockRtpRtcpInterface> rtp_1;
    591  NiceMock<MockRtpRtcpInterface> rtp_2;
    592 
    593  const uint32_t kSsrc1 = 1234;
    594  const uint32_t kRtxSsrc1 = 1235;
    595  const uint32_t kSsrc2 = 2345;
    596  const uint32_t kInvalidSsrc = 3456;
    597 
    598  ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
    599  ON_CALL(rtp_1, RtxSsrc).WillByDefault(Return(kRtxSsrc1));
    600  ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
    601 
    602  packet_router_.AddSendRtpModule(&rtp_1, false);
    603  packet_router_.AddSendRtpModule(&rtp_2, false);
    604 
    605  EXPECT_EQ(packet_router_.GetRtxSsrcForMedia(kSsrc1), kRtxSsrc1);
    606  EXPECT_EQ(packet_router_.GetRtxSsrcForMedia(kRtxSsrc1), std::nullopt);
    607  EXPECT_EQ(packet_router_.GetRtxSsrcForMedia(kSsrc2), std::nullopt);
    608  EXPECT_EQ(packet_router_.GetRtxSsrcForMedia(kInvalidSsrc), std::nullopt);
    609 
    610  packet_router_.RemoveSendRtpModule(&rtp_1);
    611  packet_router_.RemoveSendRtpModule(&rtp_2);
    612 }
    613 
    614 TEST_F(PacketRouterTest, RoutesBatchCompleteToActiveModules) {
    615  NiceMock<MockRtpRtcpInterface> rtp_1;
    616  NiceMock<MockRtpRtcpInterface> rtp_2;
    617  constexpr uint32_t kSsrc1 = 4711;
    618  constexpr uint32_t kSsrc2 = 1234;
    619  ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
    620  ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
    621  packet_router_.AddSendRtpModule(&rtp_1, false);
    622  packet_router_.AddSendRtpModule(&rtp_2, false);
    623  EXPECT_CALL(rtp_1, CanSendPacket).WillOnce(Return(true));
    624  packet_router_.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
    625  EXPECT_CALL(rtp_1, OnBatchComplete);
    626  EXPECT_CALL(rtp_2, OnBatchComplete).Times(0);
    627  packet_router_.OnBatchComplete();
    628  packet_router_.RemoveSendRtpModule(&rtp_1);
    629  packet_router_.RemoveSendRtpModule(&rtp_2);
    630 }
    631 
    632 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
    633 using PacketRouterDeathTest = PacketRouterTest;
    634 TEST_F(PacketRouterDeathTest, DoubleRegistrationOfSendModuleDisallowed) {
    635  NiceMock<MockRtpRtcpInterface> module;
    636 
    637  constexpr bool remb_candidate = false;  // Value irrelevant.
    638  packet_router_.AddSendRtpModule(&module, remb_candidate);
    639  EXPECT_DEATH(packet_router_.AddSendRtpModule(&module, remb_candidate), "");
    640 
    641  // Test tear-down
    642  packet_router_.RemoveSendRtpModule(&module);
    643 }
    644 
    645 TEST_F(PacketRouterDeathTest, DoubleRegistrationOfReceiveModuleDisallowed) {
    646  NiceMock<MockRtpRtcpInterface> module;
    647 
    648  constexpr bool remb_candidate = false;  // Value irrelevant.
    649  packet_router_.AddReceiveRtpModule(&module, remb_candidate);
    650  EXPECT_DEATH(packet_router_.AddReceiveRtpModule(&module, remb_candidate), "");
    651 
    652  // Test tear-down
    653  packet_router_.RemoveReceiveRtpModule(&module);
    654 }
    655 
    656 TEST_F(PacketRouterDeathTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
    657  NiceMock<MockRtpRtcpInterface> module;
    658 
    659  EXPECT_DEATH(packet_router_.RemoveReceiveRtpModule(&module), "");
    660 }
    661 #endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
    662 
    663 TEST_F(PacketRouterTest, RemovalOfNeverAddedSendModuleIgnored) {
    664  NiceMock<MockRtpRtcpInterface> module;
    665  packet_router_.RemoveSendRtpModule(&module);
    666 }
    667 
    668 TEST_F(PacketRouterTest, DuplicateRemovalOfSendModuleIgnored) {
    669  NiceMock<MockRtpRtcpInterface> module;
    670  packet_router_.AddSendRtpModule(&module, false);
    671  packet_router_.RemoveSendRtpModule(&module);
    672  packet_router_.RemoveSendRtpModule(&module);
    673 }
    674 
    675 TEST(PacketRouterRembTest, ChangeSendRtpModuleChangeRembSender) {
    676  ScopedFakeClock clock;
    677  NiceMock<MockRtpRtcpInterface> rtp_send;
    678  NiceMock<MockRtpRtcpInterface> rtp_recv;
    679  PacketRouter packet_router;
    680  packet_router.AddSendRtpModule(&rtp_send, true);
    681  packet_router.AddReceiveRtpModule(&rtp_recv, true);
    682 
    683  uint32_t bitrate_estimate = 456;
    684  std::vector<uint32_t> ssrcs = {1234, 5678};
    685 
    686  EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs));
    687  packet_router.SendRemb(bitrate_estimate, ssrcs);
    688 
    689  // Remove the sending module -> should get remb on the second module.
    690  packet_router.RemoveSendRtpModule(&rtp_send);
    691 
    692  EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs));
    693  packet_router.SendRemb(bitrate_estimate, ssrcs);
    694 
    695  packet_router.RemoveReceiveRtpModule(&rtp_recv);
    696 }
    697 
    698 // Only register receiving modules and make sure we fallback to trigger a REMB
    699 // packet on this one.
    700 TEST(PacketRouterRembTest, NoSendingRtpModule) {
    701  ScopedFakeClock clock;
    702  NiceMock<MockRtpRtcpInterface> rtp;
    703  PacketRouter packet_router;
    704 
    705  packet_router.AddReceiveRtpModule(&rtp, true);
    706 
    707  uint32_t bitrate_estimate = 456;
    708  const std::vector<uint32_t> ssrcs = {1234};
    709 
    710  EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs));
    711  packet_router.SendRemb(bitrate_estimate, ssrcs);
    712 
    713  // Lower the estimate to trigger a new packet REMB packet.
    714  EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs));
    715  packet_router.SendRemb(bitrate_estimate, ssrcs);
    716 
    717  EXPECT_CALL(rtp, UnsetRemb());
    718  packet_router.RemoveReceiveRtpModule(&rtp);
    719 }
    720 
    721 TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
    722  ScopedFakeClock clock;
    723  PacketRouter packet_router;
    724  NiceMock<MockRtpRtcpInterface> module;
    725 
    726  constexpr bool remb_candidate = false;
    727 
    728  packet_router.AddSendRtpModule(&module, remb_candidate);
    729 
    730  constexpr uint32_t bitrate_estimate = 456;
    731  const std::vector<uint32_t> ssrcs = {1234};
    732  EXPECT_CALL(module, SetRemb(_, _)).Times(0);
    733  packet_router.SendRemb(bitrate_estimate, ssrcs);
    734 
    735  // Test tear-down
    736  packet_router.RemoveSendRtpModule(&module);
    737 }
    738 
    739 TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
    740  ScopedFakeClock clock;
    741  PacketRouter packet_router;
    742  NiceMock<MockRtpRtcpInterface> module;
    743 
    744  constexpr bool remb_candidate = true;
    745 
    746  packet_router.AddSendRtpModule(&module, remb_candidate);
    747 
    748  constexpr uint32_t bitrate_estimate = 456;
    749  const std::vector<uint32_t> ssrcs = {1234};
    750  EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs));
    751  packet_router.SendRemb(bitrate_estimate, ssrcs);
    752 
    753  // Test tear-down
    754  packet_router.RemoveSendRtpModule(&module);
    755 }
    756 
    757 TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
    758  ScopedFakeClock clock;
    759  PacketRouter packet_router;
    760  NiceMock<MockRtpRtcpInterface> module;
    761 
    762  constexpr bool remb_candidate = false;
    763 
    764  packet_router.AddReceiveRtpModule(&module, remb_candidate);
    765 
    766  constexpr uint32_t bitrate_estimate = 456;
    767  const std::vector<uint32_t> ssrcs = {1234};
    768  EXPECT_CALL(module, SetRemb(_, _)).Times(0);
    769  packet_router.SendRemb(bitrate_estimate, ssrcs);
    770 
    771  // Test tear-down
    772  packet_router.RemoveReceiveRtpModule(&module);
    773 }
    774 
    775 TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
    776  ScopedFakeClock clock;
    777  PacketRouter packet_router;
    778  NiceMock<MockRtpRtcpInterface> module;
    779 
    780  constexpr bool remb_candidate = true;
    781 
    782  packet_router.AddReceiveRtpModule(&module, remb_candidate);
    783 
    784  constexpr uint32_t bitrate_estimate = 456;
    785  const std::vector<uint32_t> ssrcs = {1234};
    786  EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs));
    787  packet_router.SendRemb(bitrate_estimate, ssrcs);
    788 
    789  // Test tear-down
    790  packet_router.RemoveReceiveRtpModule(&module);
    791 }
    792 
    793 TEST(PacketRouterRembTest,
    794     SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
    795  ScopedFakeClock clock;
    796  PacketRouter packet_router;
    797  NiceMock<MockRtpRtcpInterface> send_module;
    798  NiceMock<MockRtpRtcpInterface> receive_module;
    799 
    800  constexpr bool remb_candidate = true;
    801 
    802  // Send module added - activated.
    803  packet_router.AddSendRtpModule(&send_module, remb_candidate);
    804 
    805  // Receive module added - the send module remains the active one.
    806  packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
    807 
    808  constexpr uint32_t bitrate_estimate = 456;
    809  const std::vector<uint32_t> ssrcs = {1234};
    810  EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs));
    811  EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
    812 
    813  packet_router.SendRemb(bitrate_estimate, ssrcs);
    814 
    815  // Test tear-down
    816  packet_router.RemoveReceiveRtpModule(&receive_module);
    817  packet_router.RemoveSendRtpModule(&send_module);
    818 }
    819 
    820 TEST(PacketRouterRembTest,
    821     SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
    822  ScopedFakeClock clock;
    823  PacketRouter packet_router;
    824  NiceMock<MockRtpRtcpInterface> send_module;
    825  NiceMock<MockRtpRtcpInterface> receive_module;
    826 
    827  constexpr bool remb_candidate = true;
    828 
    829  // Receive module added - activated.
    830  packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
    831 
    832  // Send module added - replaces receive module as active.
    833  packet_router.AddSendRtpModule(&send_module, remb_candidate);
    834 
    835  constexpr uint32_t bitrate_estimate = 456;
    836  const std::vector<uint32_t> ssrcs = {1234};
    837  EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs));
    838  EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
    839 
    840  clock.AdvanceTime(TimeDelta::Millis(1000));
    841  packet_router.SendRemb(bitrate_estimate, ssrcs);
    842 
    843  // Test tear-down
    844  packet_router.RemoveReceiveRtpModule(&receive_module);
    845  packet_router.RemoveSendRtpModule(&send_module);
    846 }
    847 
    848 TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
    849  ScopedFakeClock clock;
    850  PacketRouter packet_router;
    851  NiceMock<MockRtpRtcpInterface> send_module;
    852  NiceMock<MockRtpRtcpInterface> receive_module;
    853 
    854  constexpr bool remb_candidate = true;
    855 
    856  // Send module active, receive module inactive.
    857  packet_router.AddSendRtpModule(&send_module, remb_candidate);
    858  packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
    859 
    860  // Send module removed - receive module becomes active.
    861  packet_router.RemoveSendRtpModule(&send_module);
    862  constexpr uint32_t bitrate_estimate = 456;
    863  const std::vector<uint32_t> ssrcs = {1234};
    864  EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
    865  EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs));
    866  packet_router.SendRemb(bitrate_estimate, ssrcs);
    867 
    868  // Test tear-down
    869  packet_router.RemoveReceiveRtpModule(&receive_module);
    870 }
    871 
    872 }  // namespace webrtc