tor-browser

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

pacing_controller_unittest.cc (99401B)


      1 /*
      2 *  Copyright (c) 2019 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/pacing_controller.h"
     12 
     13 #include <algorithm>
     14 #include <cmath>
     15 #include <cstddef>
     16 #include <cstdint>
     17 #include <cstdlib>
     18 #include <memory>
     19 #include <optional>
     20 #include <utility>
     21 #include <vector>
     22 
     23 #include "api/array_view.h"
     24 #include "api/field_trials.h"
     25 #include "api/transport/network_types.h"
     26 #include "api/units/data_rate.h"
     27 #include "api/units/data_size.h"
     28 #include "api/units/time_delta.h"
     29 #include "api/units/timestamp.h"
     30 #include "modules/pacing/bitrate_prober.h"
     31 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
     32 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
     33 #include "system_wrappers/include/clock.h"
     34 #include "test/create_test_field_trials.h"
     35 #include "test/gmock.h"
     36 #include "test/gtest.h"
     37 
     38 using ::testing::_;
     39 using ::testing::AnyNumber;
     40 using ::testing::Field;
     41 using ::testing::NiceMock;
     42 using ::testing::Pointee;
     43 using ::testing::Property;
     44 using ::testing::Return;
     45 using ::testing::WithoutArgs;
     46 
     47 namespace webrtc {
     48 namespace {
     49 constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec(900);
     50 constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec(1800);
     51 
     52 // The error stems from truncating the time interval of probe packets to integer
     53 // values. This results in probing slightly higher than the target bitrate.
     54 // For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
     55 constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec(150);
     56 
     57 constexpr float kPaceMultiplier = 2.5f;
     58 
     59 constexpr uint32_t kAudioSsrc = 12345;
     60 constexpr uint32_t kVideoSsrc = 234565;
     61 
     62 constexpr DataRate kTargetRate = DataRate::KilobitsPerSec(800);
     63 
     64 std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketMediaType type,
     65                                             uint32_t ssrc,
     66                                             uint16_t sequence_number,
     67                                             int64_t capture_time_ms,
     68                                             size_t payload_size) {
     69  auto packet = std::make_unique<RtpPacketToSend>(nullptr);
     70  packet->set_packet_type(type);
     71  packet->SetSsrc(ssrc);
     72  packet->SetSequenceNumber(sequence_number);
     73  packet->set_capture_time(Timestamp::Millis(capture_time_ms));
     74  packet->SetPayloadSize(payload_size);
     75  return packet;
     76 }
     77 
     78 class MediaStream {
     79 public:
     80  MediaStream(SimulatedClock& clock,
     81              RtpPacketMediaType type,
     82              uint32_t ssrc,
     83              size_t packet_size)
     84      : clock_(clock), type_(type), ssrc_(ssrc), packet_size_(packet_size) {}
     85 
     86  std::unique_ptr<RtpPacketToSend> BuildNextPacket() {
     87    return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
     88                       packet_size_);
     89  }
     90  std::unique_ptr<RtpPacketToSend> BuildNextPacket(size_t size) {
     91    return BuildPacket(type_, ssrc_, seq_num_++, clock_.TimeInMilliseconds(),
     92                       size);
     93  }
     94 
     95 private:
     96  SimulatedClock& clock_;
     97  const RtpPacketMediaType type_;
     98  const uint32_t ssrc_;
     99  const size_t packet_size_;
    100  uint16_t seq_num_ = 1000;
    101 };
    102 
    103 // Mock callback proxy, where both new and old api redirects to common mock
    104 // methods that focus on core aspects.
    105 class MockPacingControllerCallback : public PacingController::PacketSender {
    106 public:
    107  void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
    108                  const PacedPacketInfo& /* cluster_info */) override {
    109    SendPacket(packet->Ssrc(), packet->SequenceNumber(),
    110               packet->capture_time().ms(),
    111               packet->packet_type() == RtpPacketMediaType::kRetransmission,
    112               packet->packet_type() == RtpPacketMediaType::kPadding);
    113  }
    114 
    115  std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
    116      DataSize target_size) override {
    117    std::vector<std::unique_ptr<RtpPacketToSend>> ret;
    118    size_t padding_size = SendPadding(target_size.bytes());
    119    if (padding_size > 0) {
    120      auto packet = std::make_unique<RtpPacketToSend>(nullptr);
    121      packet->SetPayloadSize(padding_size);
    122      packet->set_packet_type(RtpPacketMediaType::kPadding);
    123      ret.emplace_back(std::move(packet));
    124    }
    125    return ret;
    126  }
    127 
    128  MOCK_METHOD(void,
    129              SendPacket,
    130              (uint32_t ssrc,
    131               uint16_t sequence_number,
    132               int64_t capture_timestamp,
    133               bool retransmission,
    134               bool padding));
    135  MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
    136              FetchFec,
    137              (),
    138              (override));
    139  MOCK_METHOD(size_t, SendPadding, (size_t target_size));
    140  MOCK_METHOD(void,
    141              OnAbortedRetransmissions,
    142              (uint32_t, ArrayView<const uint16_t>),
    143              (override));
    144  MOCK_METHOD(std::optional<uint32_t>,
    145              GetRtxSsrcForMedia,
    146              (uint32_t),
    147              (const, override));
    148  MOCK_METHOD(void, OnBatchComplete, (), (override));
    149 };
    150 
    151 // Mock callback implementing the raw api.
    152 class MockPacketSender : public PacingController::PacketSender {
    153 public:
    154  MOCK_METHOD(void,
    155              SendPacket,
    156              (std::unique_ptr<RtpPacketToSend> packet,
    157               const PacedPacketInfo& cluster_info),
    158              (override));
    159  MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
    160              FetchFec,
    161              (),
    162              (override));
    163 
    164  MOCK_METHOD(std::vector<std::unique_ptr<RtpPacketToSend>>,
    165              GeneratePadding,
    166              (DataSize target_size),
    167              (override));
    168  MOCK_METHOD(void,
    169              OnAbortedRetransmissions,
    170              (uint32_t, ArrayView<const uint16_t>),
    171              (override));
    172  MOCK_METHOD(std::optional<uint32_t>,
    173              GetRtxSsrcForMedia,
    174              (uint32_t),
    175              (const, override));
    176  MOCK_METHOD(void, OnBatchComplete, (), (override));
    177 };
    178 
    179 class PacingControllerPadding : public PacingController::PacketSender {
    180 public:
    181  static const size_t kPaddingPacketSize = 224;
    182 
    183  PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
    184 
    185  void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
    186                  const PacedPacketInfo& /* pacing_info */) override {
    187    total_bytes_sent_ += packet->payload_size();
    188  }
    189 
    190  std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
    191    return {};
    192  }
    193 
    194  std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
    195      DataSize target_size) override {
    196    size_t num_packets =
    197        (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
    198    std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    199    for (size_t i = 0; i < num_packets; ++i) {
    200      packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
    201      packets.back()->SetPadding(kPaddingPacketSize);
    202      packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
    203      padding_sent_ += kPaddingPacketSize;
    204    }
    205    return packets;
    206  }
    207 
    208  void OnAbortedRetransmissions(uint32_t, ArrayView<const uint16_t>) override {}
    209  std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
    210    return std::nullopt;
    211  }
    212 
    213  void OnBatchComplete() override {}
    214 
    215  size_t padding_sent() { return padding_sent_; }
    216  size_t total_bytes_sent() { return total_bytes_sent_; }
    217 
    218 private:
    219  size_t padding_sent_;
    220  size_t total_bytes_sent_;
    221 };
    222 
    223 class PacingControllerProbing : public PacingController::PacketSender {
    224 public:
    225  PacingControllerProbing() = default;
    226  // Controls if padding can be generated or not.
    227  // In real implementation, padding can only be generated after a sent
    228  // media packet, or if the sender support RTX.
    229  void SetCanGeneratePadding(bool can_generate) {
    230    can_generate_padding_ = can_generate;
    231  }
    232 
    233  void SendPacket(std::unique_ptr<RtpPacketToSend> packet,
    234                  const PacedPacketInfo& pacing_info) override {
    235    if (packet->packet_type() != RtpPacketMediaType::kPadding) {
    236      ++packets_sent_;
    237    } else {
    238      ++padding_packets_sent_;
    239    }
    240    last_pacing_info_ = pacing_info;
    241  }
    242 
    243  std::vector<std::unique_ptr<RtpPacketToSend>> FetchFec() override {
    244    return {};
    245  }
    246 
    247  std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
    248      DataSize target_size) override {
    249    if (!can_generate_padding_) {
    250      return {};
    251    }
    252    // From RTPSender:
    253    // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
    254    const DataSize kMaxPadding = DataSize::Bytes(224);
    255 
    256    std::vector<std::unique_ptr<RtpPacketToSend>> packets;
    257    while (target_size > DataSize::Zero()) {
    258      DataSize padding_size = std::min(kMaxPadding, target_size);
    259      packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
    260      packets.back()->SetPadding(padding_size.bytes());
    261      packets.back()->set_packet_type(RtpPacketMediaType::kPadding);
    262      padding_sent_ += padding_size.bytes();
    263      target_size -= padding_size;
    264    }
    265    return packets;
    266  }
    267 
    268  void OnAbortedRetransmissions(uint32_t, ArrayView<const uint16_t>) override {}
    269  std::optional<uint32_t> GetRtxSsrcForMedia(uint32_t) const override {
    270    return std::nullopt;
    271  }
    272  void OnBatchComplete() override {}
    273 
    274  int packets_sent() const { return packets_sent_; }
    275  int padding_packets_sent() const { return padding_packets_sent_; }
    276  int padding_sent() const { return padding_sent_; }
    277  int total_packets_sent() const { return packets_sent_ + padding_sent_; }
    278  PacedPacketInfo last_pacing_info() const { return last_pacing_info_; }
    279 
    280 private:
    281  bool can_generate_padding_ = true;
    282  int packets_sent_ = 0;
    283  int padding_packets_sent_ = 0;
    284  int padding_sent_ = 0;
    285  PacedPacketInfo last_pacing_info_;
    286 };
    287 
    288 class PacingControllerTest : public ::testing::Test {
    289 protected:
    290  PacingControllerTest() : clock_(123456), trials_(CreateTestFieldTrials()) {}
    291 
    292  void SendAndExpectPacket(PacingController* pacer,
    293                           RtpPacketMediaType type,
    294                           uint32_t ssrc,
    295                           uint16_t sequence_number,
    296                           int64_t capture_time_ms,
    297                           size_t size) {
    298    pacer->EnqueuePacket(
    299        BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
    300 
    301    EXPECT_CALL(callback_,
    302                SendPacket(ssrc, sequence_number, capture_time_ms,
    303                           type == RtpPacketMediaType::kRetransmission, false));
    304  }
    305 
    306  void AdvanceTimeUntil(Timestamp time) {
    307    Timestamp now = clock_.CurrentTime();
    308    clock_.AdvanceTime(std::max(TimeDelta::Zero(), time - now));
    309  }
    310 
    311  void ConsumeInitialBudget(PacingController* pacer) {
    312    const uint32_t kSsrc = 54321;
    313    uint16_t sequence_number = 1234;
    314    int64_t capture_time_ms = clock_.TimeInMilliseconds();
    315    const size_t kPacketSize = 250;
    316 
    317    EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
    318 
    319    // Due to the multiplicative factor we can send 5 packets during a send
    320    // interval. (network capacity * multiplier / (8 bits per byte *
    321    // (packet size * #send intervals per second)
    322    const size_t packets_to_send_per_interval =
    323        kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
    324    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
    325      SendAndExpectPacket(pacer, RtpPacketMediaType::kVideo, kSsrc,
    326                          sequence_number++, capture_time_ms, kPacketSize);
    327    }
    328 
    329    while (pacer->QueueSizePackets() > 0) {
    330      AdvanceTimeUntil(pacer->NextSendTime());
    331      pacer->ProcessPackets();
    332    }
    333  }
    334 
    335  SimulatedClock clock_;
    336 
    337  MediaStream audio_ = MediaStream(clock_,
    338                                   /*type*/ RtpPacketMediaType::kAudio,
    339                                   /*ssrc*/ kAudioSsrc,
    340                                   /*packet_size*/ 100);
    341  MediaStream video_ = MediaStream(clock_,
    342                                   /*type*/ RtpPacketMediaType::kVideo,
    343                                   /*ssrc*/ kVideoSsrc,
    344                                   /*packet_size*/ 1000);
    345 
    346  ::testing::NiceMock<MockPacingControllerCallback> callback_;
    347  FieldTrials trials_;
    348 };
    349 
    350 TEST_F(PacingControllerTest, DefaultNoPaddingInSilence) {
    351  const FieldTrials trials = CreateTestFieldTrials();
    352  PacingController pacer(&clock_, &callback_, trials);
    353  pacer.SetPacingRates(kTargetRate, DataRate::Zero());
    354  // Video packet to reset last send time and provide padding data.
    355  pacer.EnqueuePacket(video_.BuildNextPacket());
    356  EXPECT_CALL(callback_, SendPacket).Times(1);
    357  clock_.AdvanceTimeMilliseconds(5);
    358  pacer.ProcessPackets();
    359  EXPECT_CALL(callback_, SendPadding).Times(0);
    360  // Waiting 500 ms should not trigger sending of padding.
    361  clock_.AdvanceTimeMilliseconds(500);
    362  pacer.ProcessPackets();
    363 }
    364 
    365 TEST_F(PacingControllerTest, PaddingInSilenceWithTrial) {
    366  const FieldTrials trials =
    367      CreateTestFieldTrials("WebRTC-Pacer-PadInSilence/Enabled/");
    368  PacingController pacer(&clock_, &callback_, trials);
    369  pacer.SetPacingRates(kTargetRate, DataRate::Zero());
    370  // Video packet to reset last send time and provide padding data.
    371  pacer.EnqueuePacket(video_.BuildNextPacket());
    372  EXPECT_CALL(callback_, SendPacket).Times(2);
    373  clock_.AdvanceTimeMilliseconds(5);
    374  pacer.ProcessPackets();
    375  EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
    376  // Waiting 500 ms should trigger sending of padding.
    377  clock_.AdvanceTimeMilliseconds(500);
    378  pacer.ProcessPackets();
    379 }
    380 
    381 TEST_F(PacingControllerTest, CongestionWindowAffectsAudioInTrial) {
    382  const FieldTrials trials =
    383      CreateTestFieldTrials("WebRTC-Pacer-BlockAudio/Enabled/");
    384  EXPECT_CALL(callback_, SendPadding).Times(0);
    385  PacingController pacer(&clock_, &callback_, trials);
    386  pacer.SetPacingRates(DataRate::KilobitsPerSec(10000), DataRate::Zero());
    387  // Video packet fills congestion window.
    388  pacer.EnqueuePacket(video_.BuildNextPacket());
    389  EXPECT_CALL(callback_, SendPacket).Times(1);
    390  AdvanceTimeUntil(pacer.NextSendTime());
    391  pacer.ProcessPackets();
    392  pacer.SetCongested(true);
    393  // Audio packet blocked due to congestion.
    394  pacer.EnqueuePacket(audio_.BuildNextPacket());
    395  EXPECT_CALL(callback_, SendPacket).Times(0);
    396  // Forward time to where we send keep-alive.
    397  EXPECT_CALL(callback_, SendPadding(1)).Times(2);
    398  AdvanceTimeUntil(pacer.NextSendTime());
    399  pacer.ProcessPackets();
    400  AdvanceTimeUntil(pacer.NextSendTime());
    401  pacer.ProcessPackets();
    402  // Audio packet unblocked when congestion window clear.
    403  ::testing::Mock::VerifyAndClearExpectations(&callback_);
    404  pacer.SetCongested(false);
    405  EXPECT_CALL(callback_, SendPacket).Times(1);
    406  AdvanceTimeUntil(pacer.NextSendTime());
    407  pacer.ProcessPackets();
    408 }
    409 
    410 TEST_F(PacingControllerTest, DefaultCongestionWindowDoesNotAffectAudio) {
    411  EXPECT_CALL(callback_, SendPadding).Times(0);
    412  const FieldTrials trials = CreateTestFieldTrials();
    413  PacingController pacer(&clock_, &callback_, trials);
    414  pacer.SetPacingRates(DataRate::BitsPerSec(10000000), DataRate::Zero());
    415  // Video packet fills congestion window.
    416  pacer.EnqueuePacket(video_.BuildNextPacket());
    417  EXPECT_CALL(callback_, SendPacket).Times(1);
    418  AdvanceTimeUntil(pacer.NextSendTime());
    419  pacer.ProcessPackets();
    420  pacer.SetCongested(true);
    421  // Audio not blocked due to congestion.
    422  pacer.EnqueuePacket(audio_.BuildNextPacket());
    423  EXPECT_CALL(callback_, SendPacket).Times(1);
    424  AdvanceTimeUntil(pacer.NextSendTime());
    425  pacer.ProcessPackets();
    426 }
    427 
    428 TEST_F(PacingControllerTest, BudgetAffectsAudioInTrial) {
    429  FieldTrials trials =
    430      CreateTestFieldTrials("WebRTC-Pacer-BlockAudio/Enabled/");
    431  PacingController pacer(&clock_, &callback_, trials);
    432  const size_t kPacketSize = 1000;
    433  const int kProcessIntervalsPerSecond = 1000 / 5;
    434  DataRate pacing_rate =
    435      DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond);
    436  pacer.SetPacingRates(pacing_rate, DataRate::Zero());
    437  pacer.SetSendBurstInterval(TimeDelta::Zero());
    438  // Video fills budget for following process periods.
    439  pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
    440  EXPECT_CALL(callback_, SendPacket).Times(1);
    441  AdvanceTimeUntil(pacer.NextSendTime());
    442  pacer.ProcessPackets();
    443  // Audio packet blocked due to budget limit.
    444  pacer.EnqueuePacket(audio_.BuildNextPacket());
    445  Timestamp wait_start_time = clock_.CurrentTime();
    446  Timestamp wait_end_time = Timestamp::MinusInfinity();
    447  EXPECT_CALL(callback_, SendPacket).WillOnce(WithoutArgs([&]() {
    448    wait_end_time = clock_.CurrentTime();
    449  }));
    450  while (!wait_end_time.IsFinite()) {
    451    AdvanceTimeUntil(pacer.NextSendTime());
    452    pacer.ProcessPackets();
    453  }
    454  const TimeDelta expected_wait_time =
    455      DataSize::Bytes(kPacketSize) / pacing_rate;
    456  // Verify delay is near expectation, within timing margin.
    457  EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
    458            PacingController::kMinSleepTime);
    459 }
    460 
    461 TEST_F(PacingControllerTest, DefaultBudgetDoesNotAffectAudio) {
    462  const size_t kPacketSize = 1000;
    463  EXPECT_CALL(callback_, SendPadding).Times(0);
    464  const FieldTrials trials = CreateTestFieldTrials();
    465  PacingController pacer(&clock_, &callback_, trials);
    466  const int kProcessIntervalsPerSecond = 1000 / 5;
    467  pacer.SetPacingRates(
    468      DataRate::BitsPerSec(kPacketSize / 3 * 8 * kProcessIntervalsPerSecond),
    469      DataRate::Zero());
    470  // Video fills budget for following process periods.
    471  pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize));
    472  EXPECT_CALL(callback_, SendPacket).Times(1);
    473  AdvanceTimeUntil(pacer.NextSendTime());
    474  pacer.ProcessPackets();
    475  // Audio packet not blocked due to budget limit.
    476  EXPECT_CALL(callback_, SendPacket).Times(1);
    477  pacer.EnqueuePacket(audio_.BuildNextPacket());
    478  AdvanceTimeUntil(pacer.NextSendTime());
    479  pacer.ProcessPackets();
    480 }
    481 
    482 TEST_F(PacingControllerTest, FirstSentPacketTimeIsSet) {
    483  const Timestamp kStartTime = clock_.CurrentTime();
    484  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    485  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    486 
    487  // No packet sent.
    488  EXPECT_FALSE(pacer->FirstSentPacketTime().has_value());
    489  pacer->EnqueuePacket(video_.BuildNextPacket());
    490  AdvanceTimeUntil(pacer->NextSendTime());
    491  pacer->ProcessPackets();
    492  EXPECT_EQ(kStartTime, pacer->FirstSentPacketTime());
    493 }
    494 
    495 TEST_F(PacingControllerTest, QueueAndPacePacketsWithZeroBurstPeriod) {
    496  const uint32_t kSsrc = 12345;
    497  uint16_t sequence_number = 1234;
    498  const DataSize kPackeSize = DataSize::Bytes(250);
    499  const TimeDelta kSendInterval = TimeDelta::Millis(5);
    500 
    501  // Due to the multiplicative factor we can send 5 packets during a 5ms send
    502  // interval. (send interval * network capacity * multiplier / packet size)
    503  const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
    504                                kPaceMultiplier / kPackeSize.bytes();
    505  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    506  pacer->SetSendBurstInterval(TimeDelta::Zero());
    507  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    508 
    509  for (size_t i = 0; i < kPacketsToSend; ++i) {
    510    SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
    511                        sequence_number++, clock_.TimeInMilliseconds(),
    512                        kPackeSize.bytes());
    513  }
    514  EXPECT_CALL(callback_, SendPadding).Times(0);
    515 
    516  // Enqueue one extra packet.
    517  int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
    518  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
    519                                   sequence_number, queued_packet_timestamp,
    520                                   kPackeSize.bytes()));
    521  EXPECT_EQ(kPacketsToSend + 1, pacer->QueueSizePackets());
    522 
    523  // Send packets until the initial kPacketsToSend packets are done.
    524  Timestamp start_time = clock_.CurrentTime();
    525  while (pacer->QueueSizePackets() > 1) {
    526    AdvanceTimeUntil(pacer->NextSendTime());
    527    pacer->ProcessPackets();
    528  }
    529  EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
    530 
    531  // Proceed till last packet can be sent.
    532  EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
    533                                    queued_packet_timestamp, false, false))
    534      .Times(1);
    535  AdvanceTimeUntil(pacer->NextSendTime());
    536  pacer->ProcessPackets();
    537  EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
    538  EXPECT_EQ(pacer->QueueSizePackets(), 0u);
    539 }
    540 
    541 TEST_F(PacingControllerTest, PaceQueuedPackets) {
    542  uint32_t ssrc = 12345;
    543  uint16_t sequence_number = 1234;
    544  const size_t kPacketSize = 250;
    545  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    546  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    547 
    548  const size_t packets_to_send_per_burst_interval =
    549      (kTargetRate * kPaceMultiplier * PacingController::kDefaultBurstInterval)
    550          .bytes() /
    551      kPacketSize;
    552  for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) {
    553    SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    554                        sequence_number++, clock_.TimeInMilliseconds(),
    555                        kPacketSize);
    556  }
    557 
    558  for (size_t j = 0; j < packets_to_send_per_burst_interval * 10; ++j) {
    559    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
    560                                     sequence_number++,
    561                                     clock_.TimeInMilliseconds(), kPacketSize));
    562  }
    563  EXPECT_EQ(packets_to_send_per_burst_interval +
    564                packets_to_send_per_burst_interval * 10,
    565            pacer->QueueSizePackets());
    566 
    567  while (pacer->QueueSizePackets() > packets_to_send_per_burst_interval * 10) {
    568    AdvanceTimeUntil(pacer->NextSendTime());
    569    pacer->ProcessPackets();
    570  }
    571  EXPECT_EQ(pacer->QueueSizePackets(), packets_to_send_per_burst_interval * 10);
    572  EXPECT_CALL(callback_, SendPadding).Times(0);
    573 
    574  EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
    575      .Times(pacer->QueueSizePackets());
    576  const TimeDelta expected_pace_time =
    577      DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
    578      (kPaceMultiplier * kTargetRate);
    579  Timestamp start_time = clock_.CurrentTime();
    580  while (pacer->QueueSizePackets() > 0) {
    581    AdvanceTimeUntil(pacer->NextSendTime());
    582    pacer->ProcessPackets();
    583  }
    584  const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
    585  EXPECT_LT((actual_pace_time - expected_pace_time).Abs(),
    586            PacingController::kMinSleepTime);
    587 
    588  EXPECT_EQ(0u, pacer->QueueSizePackets());
    589  AdvanceTimeUntil(pacer->NextSendTime());
    590  EXPECT_EQ(0u, pacer->QueueSizePackets());
    591  pacer->ProcessPackets();
    592 
    593  // Send some more packet, just show that we can..?
    594  for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) {
    595    SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    596                        sequence_number++, clock_.TimeInMilliseconds(), 250);
    597  }
    598  EXPECT_EQ(packets_to_send_per_burst_interval, pacer->QueueSizePackets());
    599  for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) {
    600    AdvanceTimeUntil(pacer->NextSendTime());
    601    pacer->ProcessPackets();
    602  }
    603  EXPECT_EQ(0u, pacer->QueueSizePackets());
    604 }
    605 
    606 TEST_F(PacingControllerTest, RepeatedRetransmissionsAllowed) {
    607  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    608  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    609 
    610  // Send one packet, then two retransmissions of that packet.
    611  for (size_t i = 0; i < 3; i++) {
    612    constexpr uint32_t ssrc = 333;
    613    constexpr uint16_t sequence_number = 444;
    614    constexpr size_t bytes = 250;
    615    bool is_retransmission = (i != 0);  // Original followed by retransmissions.
    616    SendAndExpectPacket(pacer.get(),
    617                        is_retransmission ? RtpPacketMediaType::kRetransmission
    618                                          : RtpPacketMediaType::kVideo,
    619                        ssrc, sequence_number, clock_.TimeInMilliseconds(),
    620                        bytes);
    621    clock_.AdvanceTimeMilliseconds(5);
    622  }
    623  while (pacer->QueueSizePackets() > 0) {
    624    AdvanceTimeUntil(pacer->NextSendTime());
    625    pacer->ProcessPackets();
    626  }
    627 }
    628 
    629 TEST_F(PacingControllerTest,
    630       CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
    631  uint32_t ssrc = 12345;
    632  uint16_t sequence_number = 1234;
    633  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    634  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    635 
    636  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    637                      sequence_number, clock_.TimeInMilliseconds(), 250);
    638 
    639  // Expect packet on second ssrc to be queued and sent as well.
    640  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc + 1,
    641                      sequence_number, clock_.TimeInMilliseconds(), 250);
    642 
    643  clock_.AdvanceTimeMilliseconds(1000);
    644  while (pacer->QueueSizePackets() > 0) {
    645    AdvanceTimeUntil(pacer->NextSendTime());
    646    pacer->ProcessPackets();
    647  }
    648 }
    649 
    650 TEST_F(PacingControllerTest, Padding) {
    651  uint32_t ssrc = 12345;
    652  uint16_t sequence_number = 1234;
    653  const size_t kPacketSize = 1000;
    654  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    655  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
    656 
    657  const size_t kPacketsToSend = 30;
    658  for (size_t i = 0; i < kPacketsToSend; ++i) {
    659    SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    660                        sequence_number++, clock_.TimeInMilliseconds(),
    661                        kPacketSize);
    662  }
    663 
    664  int expected_bursts =
    665      floor(DataSize::Bytes(pacer->QueueSizePackets() * kPacketSize) /
    666            (kPaceMultiplier * kTargetRate) /
    667            PacingController::kDefaultBurstInterval);
    668  const TimeDelta expected_pace_time =
    669      (expected_bursts - 1) * PacingController::kDefaultBurstInterval;
    670  EXPECT_CALL(callback_, SendPadding).Times(0);
    671  // Only the media packets should be sent.
    672  Timestamp start_time = clock_.CurrentTime();
    673  while (pacer->QueueSizePackets() > 0) {
    674    AdvanceTimeUntil(pacer->NextSendTime());
    675    pacer->ProcessPackets();
    676  }
    677  const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
    678  EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
    679            PacingController::kDefaultBurstInterval);
    680 
    681  // Pacing media happens at 2.5x, but padding was configured with 1.0x
    682  // factor. We have to wait until the padding debt is gone before we start
    683  // sending padding.
    684  const TimeDelta time_to_padding_debt_free =
    685      (expected_pace_time * kPaceMultiplier) - actual_pace_time;
    686  clock_.AdvanceTime(time_to_padding_debt_free -
    687                     PacingController::kMinSleepTime);
    688  pacer->ProcessPackets();
    689 
    690  // Send 10 padding packets.
    691  const size_t kPaddingPacketsToSend = 10;
    692  DataSize padding_sent = DataSize::Zero();
    693  size_t packets_sent = 0;
    694  Timestamp first_send_time = Timestamp::MinusInfinity();
    695  Timestamp last_send_time = Timestamp::MinusInfinity();
    696 
    697  EXPECT_CALL(callback_, SendPadding)
    698      .Times(kPaddingPacketsToSend)
    699      .WillRepeatedly([&](size_t target_size) {
    700        ++packets_sent;
    701        if (packets_sent < kPaddingPacketsToSend) {
    702          // Don't count bytes of last packet, instead just
    703          // use this as the time the last packet finished
    704          // sending.
    705          padding_sent += DataSize::Bytes(target_size);
    706        }
    707        if (first_send_time.IsInfinite()) {
    708          first_send_time = clock_.CurrentTime();
    709        } else {
    710          last_send_time = clock_.CurrentTime();
    711        }
    712        return target_size;
    713      });
    714  EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
    715      .Times(kPaddingPacketsToSend);
    716 
    717  while (packets_sent < kPaddingPacketsToSend) {
    718    AdvanceTimeUntil(pacer->NextSendTime());
    719    pacer->ProcessPackets();
    720  }
    721 
    722  // Verify rate of sent padding.
    723  TimeDelta padding_duration = last_send_time - first_send_time;
    724  DataRate padding_rate = padding_sent / padding_duration;
    725  EXPECT_EQ(padding_rate, kTargetRate);
    726 }
    727 
    728 TEST_F(PacingControllerTest, NoPaddingBeforeNormalPacket) {
    729  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    730  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
    731 
    732  EXPECT_CALL(callback_, SendPadding).Times(0);
    733 
    734  pacer->ProcessPackets();
    735  AdvanceTimeUntil(pacer->NextSendTime());
    736 
    737  pacer->ProcessPackets();
    738  AdvanceTimeUntil(pacer->NextSendTime());
    739 
    740  uint32_t ssrc = 12345;
    741  uint16_t sequence_number = 1234;
    742  int64_t capture_time_ms = 56789;
    743 
    744  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    745                      sequence_number++, capture_time_ms, 250);
    746  bool padding_sent = false;
    747  EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
    748    padding_sent = true;
    749    return padding;
    750  });
    751  EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
    752  while (!padding_sent) {
    753    AdvanceTimeUntil(pacer->NextSendTime());
    754    pacer->ProcessPackets();
    755  }
    756 }
    757 
    758 TEST_F(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
    759  uint32_t ssrc = 12345;
    760  uint16_t sequence_number = 1234;
    761  int64_t capture_time_ms = 56789;
    762  const TimeDelta kAveragingWindowLength = TimeDelta::Seconds(10);
    763  PacingControllerPadding callback;
    764  auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
    765  pacer->SetProbingEnabled(false);
    766  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
    767 
    768  Timestamp start_time = clock_.CurrentTime();
    769  size_t media_bytes = 0;
    770  while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
    771    // Maybe add some new media packets corresponding to expected send rate.
    772    int rand_value = rand();  // NOLINT (rand_r instead of rand)
    773    while (
    774        media_bytes <
    775        (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
    776      size_t media_payload = rand_value % 400 + 800;  // [400, 1200] bytes.
    777      pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
    778                                       sequence_number++, capture_time_ms,
    779                                       media_payload));
    780      media_bytes += media_payload;
    781    }
    782    AdvanceTimeUntil(std::min(clock_.CurrentTime() + TimeDelta::Millis(20),
    783                              pacer->NextSendTime()));
    784    pacer->ProcessPackets();
    785  }
    786 
    787  EXPECT_NEAR(
    788      kTargetRate.bps(),
    789      (DataSize::Bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
    790          .bps(),
    791      (kTargetRate * 0.01 /* 1% error marging */).bps());
    792 }
    793 
    794 TEST_F(PacingControllerTest, Priority) {
    795  uint32_t ssrc_low_priority = 12345;
    796  uint32_t ssrc = 12346;
    797  uint16_t sequence_number = 1234;
    798  int64_t capture_time_ms = 56789;
    799  int64_t capture_time_ms_low_priority = 1234567;
    800  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    801  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    802 
    803  ConsumeInitialBudget(pacer.get());
    804 
    805  // Expect normal and low priority to be queued and high to pass through.
    806  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
    807                                   ssrc_low_priority, sequence_number++,
    808                                   capture_time_ms_low_priority, 250));
    809 
    810  const size_t packets_to_send_per_interval =
    811      kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
    812  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
    813    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
    814                                     sequence_number++, capture_time_ms, 250));
    815  }
    816  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio, ssrc,
    817                                   sequence_number++, capture_time_ms, 250));
    818 
    819  // Expect all high and normal priority to be sent out first.
    820  EXPECT_CALL(callback_, SendPadding).Times(0);
    821  testing::Sequence s;
    822  EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
    823      .Times(packets_to_send_per_interval + 1)
    824      .InSequence(s);
    825  EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
    826                                    capture_time_ms_low_priority, _, _))
    827      .InSequence(s);
    828 
    829  while (pacer->QueueSizePackets() > 0) {
    830    AdvanceTimeUntil(pacer->NextSendTime());
    831    pacer->ProcessPackets();
    832  }
    833 }
    834 
    835 TEST_F(PacingControllerTest, RetransmissionPriority) {
    836  uint32_t ssrc = 12345;
    837  uint16_t sequence_number = 1234;
    838  int64_t capture_time_ms = 45678;
    839  int64_t capture_time_ms_retransmission = 56789;
    840  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    841  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    842 
    843  const size_t packets_to_send_per_burst_interval =
    844      (kTargetRate * kPaceMultiplier * PacingController::kDefaultBurstInterval)
    845          .bytes() /
    846      250;
    847  pacer->ProcessPackets();
    848  EXPECT_EQ(0u, pacer->QueueSizePackets());
    849 
    850  // Alternate retransmissions and normal packets.
    851  for (size_t i = 0; i < packets_to_send_per_burst_interval; ++i) {
    852    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
    853                                     sequence_number++, capture_time_ms, 250));
    854    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
    855                                     sequence_number++,
    856                                     capture_time_ms_retransmission, 250));
    857  }
    858  EXPECT_EQ(2 * packets_to_send_per_burst_interval, pacer->QueueSizePackets());
    859 
    860  // Expect all retransmissions to be sent out first despite having a later
    861  // capture time.
    862  EXPECT_CALL(callback_, SendPadding).Times(0);
    863  EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
    864  EXPECT_CALL(callback_,
    865              SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
    866      .Times(packets_to_send_per_burst_interval);
    867 
    868  while (pacer->QueueSizePackets() > packets_to_send_per_burst_interval) {
    869    AdvanceTimeUntil(pacer->NextSendTime());
    870    pacer->ProcessPackets();
    871  }
    872  EXPECT_EQ(packets_to_send_per_burst_interval, pacer->QueueSizePackets());
    873 
    874  // Expect the remaining (non-retransmission) packets to be sent.
    875  EXPECT_CALL(callback_, SendPadding).Times(0);
    876  EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
    877  EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
    878      .Times(packets_to_send_per_burst_interval);
    879 
    880  while (pacer->QueueSizePackets() > 0) {
    881    AdvanceTimeUntil(pacer->NextSendTime());
    882    pacer->ProcessPackets();
    883  }
    884  EXPECT_EQ(0u, pacer->QueueSizePackets());
    885 }
    886 
    887 TEST_F(PacingControllerTest, HighPrioDoesntAffectBudget) {
    888  const size_t kPacketSize = 250;
    889  uint32_t ssrc = 12346;
    890  uint16_t sequence_number = 1234;
    891  int64_t capture_time_ms = 56789;
    892  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    893  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    894 
    895  // As high prio packets doesn't affect the budget, we should be able to send
    896  // a high number of them at once.
    897  const size_t kNumAudioPackets = 25;
    898  for (size_t i = 0; i < kNumAudioPackets; ++i) {
    899    SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, ssrc,
    900                        sequence_number++, capture_time_ms, kPacketSize);
    901  }
    902  pacer->ProcessPackets();
    903  EXPECT_EQ(pacer->QueueSizePackets(), 0u);
    904  // Low prio packets does affect the budget.
    905  const size_t kPacketsToSendPerBurstInterval =
    906      (kTargetRate * kPaceMultiplier * PacingController::kDefaultBurstInterval)
    907          .bytes() /
    908      kPacketSize;
    909  for (size_t i = 0; i < kPacketsToSendPerBurstInterval; ++i) {
    910    SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    911                        sequence_number++, clock_.TimeInMilliseconds(),
    912                        kPacketSize);
    913  }
    914 
    915  // Send all packets and measure pace time.
    916  Timestamp start_time = clock_.CurrentTime();
    917  EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime());
    918  while (pacer->QueueSizePackets() > 0) {
    919    AdvanceTimeUntil(pacer->NextSendTime());
    920    pacer->ProcessPackets();
    921  }
    922 
    923  // Measure pacing time.
    924  TimeDelta pacing_time = clock_.CurrentTime() - start_time;
    925  // All packets sent in one burst since audio packets are not accounted for.
    926  TimeDelta expected_pacing_time = TimeDelta::Zero();
    927  EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
    928              PacingController::kMinSleepTime.us<double>());
    929 }
    930 
    931 TEST_F(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
    932  uint32_t ssrc = 202020;
    933  uint16_t sequence_number = 1000;
    934  int kPacketSize = 250;
    935  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    936  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    937 
    938  // Send an initial packet so we have a last send time.
    939  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
    940                      sequence_number++, clock_.TimeInMilliseconds(),
    941                      kPacketSize);
    942  AdvanceTimeUntil(pacer->NextSendTime());
    943  pacer->ProcessPackets();
    944  ::testing::Mock::VerifyAndClearExpectations(&callback_);
    945 
    946  // Set congested state, we should not send anything until the 500ms since
    947  // last send time limit for keep-alives is triggered.
    948  EXPECT_CALL(callback_, SendPacket).Times(0);
    949  EXPECT_CALL(callback_, SendPadding).Times(0);
    950  pacer->SetCongested(true);
    951  size_t blocked_packets = 0;
    952  int64_t expected_time_until_padding = 500;
    953  while (expected_time_until_padding > 5) {
    954    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
    955                                     sequence_number++,
    956                                     clock_.TimeInMilliseconds(), kPacketSize));
    957    blocked_packets++;
    958    clock_.AdvanceTimeMilliseconds(5);
    959    pacer->ProcessPackets();
    960    expected_time_until_padding -= 5;
    961  }
    962 
    963  ::testing::Mock::VerifyAndClearExpectations(&callback_);
    964  EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
    965  EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
    966  clock_.AdvanceTimeMilliseconds(5);
    967  pacer->ProcessPackets();
    968  EXPECT_EQ(blocked_packets, pacer->QueueSizePackets());
    969 }
    970 
    971 TEST_F(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
    972  uint32_t ssrc = 202020;
    973  uint16_t seq_num = 1000;
    974  int size = 1000;
    975  auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
    976  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
    977  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
    978  pacer->SetSendBurstInterval(TimeDelta::Zero());
    979  EXPECT_CALL(callback_, SendPadding).Times(0);
    980  // The pacing rate is low enough that the budget should not allow two packets
    981  // to be sent in a row.
    982  pacer->SetPacingRates(DataRate::BitsPerSec(400 * 8 * 1000 / 5),
    983                        DataRate::Zero());
    984  // Not yet budget limited or congested, packet is sent.
    985  pacer->EnqueuePacket(
    986      BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
    987  EXPECT_CALL(callback_, SendPacket).Times(1);
    988  clock_.AdvanceTimeMilliseconds(5);
    989  pacer->ProcessPackets();
    990  // Packet blocked due to congestion.
    991  pacer->SetCongested(true);
    992  pacer->EnqueuePacket(
    993      BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
    994  EXPECT_CALL(callback_, SendPacket).Times(0);
    995  clock_.AdvanceTimeMilliseconds(5);
    996  pacer->ProcessPackets();
    997  // Packet blocked due to congestion.
    998  pacer->EnqueuePacket(
    999      BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
   1000  EXPECT_CALL(callback_, SendPacket).Times(0);
   1001  clock_.AdvanceTimeMilliseconds(5);
   1002  pacer->ProcessPackets();
   1003  // Congestion removed and budget has recovered, packet is sent.
   1004  pacer->EnqueuePacket(
   1005      BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
   1006  EXPECT_CALL(callback_, SendPacket).Times(1);
   1007  clock_.AdvanceTimeMilliseconds(5);
   1008  pacer->SetCongested(false);
   1009  pacer->ProcessPackets();
   1010  // Should be blocked due to budget limitation as congestion has be removed.
   1011  pacer->EnqueuePacket(
   1012      BuildPacket(RtpPacketMediaType::kVideo, ssrc, seq_num++, now_ms(), size));
   1013  EXPECT_CALL(callback_, SendPacket).Times(0);
   1014  clock_.AdvanceTimeMilliseconds(5);
   1015  pacer->ProcessPackets();
   1016 }
   1017 
   1018 TEST_F(PacingControllerTest, Pause) {
   1019  uint32_t ssrc_low_priority = 12345;
   1020  uint32_t ssrc = 12346;
   1021  uint32_t ssrc_high_priority = 12347;
   1022  uint16_t sequence_number = 1234;
   1023  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1024  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
   1025 
   1026  EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
   1027 
   1028  ConsumeInitialBudget(pacer.get());
   1029 
   1030  pacer->Pause();
   1031 
   1032  int64_t capture_time_ms = clock_.TimeInMilliseconds();
   1033  const size_t packets_to_send_per_interval =
   1034      kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
   1035  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
   1036    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
   1037                                     ssrc_low_priority, sequence_number++,
   1038                                     capture_time_ms, 250));
   1039    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
   1040                                     sequence_number++, capture_time_ms, 250));
   1041    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
   1042                                     ssrc_high_priority, sequence_number++,
   1043                                     capture_time_ms, 250));
   1044  }
   1045  clock_.AdvanceTimeMilliseconds(10000);
   1046  int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
   1047  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
   1048    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
   1049                                     ssrc_low_priority, sequence_number++,
   1050                                     second_capture_time_ms, 250));
   1051    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission, ssrc,
   1052                                     sequence_number++, second_capture_time_ms,
   1053                                     250));
   1054    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kAudio,
   1055                                     ssrc_high_priority, sequence_number++,
   1056                                     second_capture_time_ms, 250));
   1057  }
   1058 
   1059  // Expect everything to be queued.
   1060  EXPECT_EQ(capture_time_ms, pacer->OldestPacketEnqueueTime().ms());
   1061 
   1062  // Process triggers keep-alive packet.
   1063  EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
   1064    return padding;
   1065  });
   1066  EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
   1067  pacer->ProcessPackets();
   1068 
   1069  // Verify no packets sent for the rest of the paused process interval.
   1070  const TimeDelta kProcessInterval = TimeDelta::Millis(5);
   1071  TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
   1072  EXPECT_CALL(callback_, SendPadding).Times(0);
   1073  while (expected_time_until_send >= kProcessInterval) {
   1074    pacer->ProcessPackets();
   1075    clock_.AdvanceTime(kProcessInterval);
   1076    expected_time_until_send -= kProcessInterval;
   1077  }
   1078 
   1079  // New keep-alive packet.
   1080  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   1081  EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
   1082    return padding;
   1083  });
   1084  EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
   1085  clock_.AdvanceTime(kProcessInterval);
   1086  pacer->ProcessPackets();
   1087  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   1088 
   1089  // Expect high prio packets to come out first followed by normal
   1090  // prio packets and low prio packets (all in capture order).
   1091  {
   1092    ::testing::InSequence sequence;
   1093    EXPECT_CALL(callback_,
   1094                SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
   1095        .Times(packets_to_send_per_interval);
   1096    EXPECT_CALL(callback_,
   1097                SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
   1098        .Times(packets_to_send_per_interval);
   1099 
   1100    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
   1101      EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
   1102          .Times(1);
   1103    }
   1104    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
   1105      EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
   1106          .Times(1);
   1107    }
   1108    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
   1109      EXPECT_CALL(callback_,
   1110                  SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
   1111          .Times(1);
   1112    }
   1113    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
   1114      EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
   1115                                        second_capture_time_ms, _, _))
   1116          .Times(1);
   1117    }
   1118  }
   1119  pacer->Resume();
   1120  while (pacer->QueueSizePackets() > 0) {
   1121    AdvanceTimeUntil(pacer->NextSendTime());
   1122    pacer->ProcessPackets();
   1123  }
   1124 
   1125  EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
   1126 }
   1127 
   1128 TEST_F(PacingControllerTest, InactiveFromStart) {
   1129  // Recreate the pacer without the inital time forwarding.
   1130  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1131  pacer->SetProbingEnabled(false);
   1132  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
   1133 
   1134  // No packets sent, there should be no keep-alives sent either.
   1135  EXPECT_CALL(callback_, SendPadding).Times(0);
   1136  EXPECT_CALL(callback_, SendPacket).Times(0);
   1137  pacer->ProcessPackets();
   1138 
   1139  const Timestamp start_time = clock_.CurrentTime();
   1140 
   1141  // Determine the margin need so we can advance to the last possible moment
   1142  // that will not cause a process event.
   1143  const TimeDelta time_margin =
   1144      PacingController::kMinSleepTime + TimeDelta::Micros(1);
   1145 
   1146  EXPECT_EQ(pacer->NextSendTime() - start_time,
   1147            PacingController::kPausedProcessInterval);
   1148  clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
   1149  pacer->ProcessPackets();
   1150  EXPECT_EQ(pacer->NextSendTime() - start_time,
   1151            PacingController::kPausedProcessInterval);
   1152 
   1153  clock_.AdvanceTime(time_margin);
   1154  pacer->ProcessPackets();
   1155  EXPECT_EQ(pacer->NextSendTime() - start_time,
   1156            2 * PacingController::kPausedProcessInterval);
   1157 }
   1158 
   1159 TEST_F(PacingControllerTest, QueueTimeGrowsOverTime) {
   1160  uint32_t ssrc = 12346;
   1161  uint16_t sequence_number = 1234;
   1162  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1163  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
   1164  EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
   1165 
   1166  pacer->SetPacingRates(DataRate::BitsPerSec(30000 * kPaceMultiplier),
   1167                        DataRate::Zero());
   1168  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
   1169                      sequence_number, clock_.TimeInMilliseconds(), 1200);
   1170 
   1171  clock_.AdvanceTimeMilliseconds(500);
   1172  EXPECT_EQ(clock_.TimeInMilliseconds() - 500,
   1173            pacer->OldestPacketEnqueueTime().ms());
   1174  pacer->ProcessPackets();
   1175  EXPECT_TRUE(pacer->OldestPacketEnqueueTime().IsInfinite());
   1176 }
   1177 
   1178 TEST_F(PacingControllerTest, ProbingWithInsertedPackets) {
   1179  const size_t kPacketSize = 1200;
   1180  const int kInitialBitrateBps = 300000;
   1181  uint32_t ssrc = 12346;
   1182  uint16_t sequence_number = 1234;
   1183 
   1184  PacingControllerProbing packet_sender;
   1185  auto pacer =
   1186      std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
   1187  std::vector<ProbeClusterConfig> probe_clusters = {
   1188      {.at_time = clock_.CurrentTime(),
   1189       .target_data_rate = kFirstClusterRate,
   1190       .target_duration = TimeDelta::Millis(15),
   1191       .target_probe_count = 5,
   1192       .id = 0},
   1193      {.at_time = clock_.CurrentTime(),
   1194       .target_data_rate = kSecondClusterRate,
   1195       .target_duration = TimeDelta::Millis(15),
   1196       .target_probe_count = 5,
   1197       .id = 1}};
   1198  pacer->CreateProbeClusters(probe_clusters);
   1199  pacer->SetPacingRates(
   1200      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1201      DataRate::Zero());
   1202 
   1203  for (int i = 0; i < 10; ++i) {
   1204    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
   1205                                     sequence_number++,
   1206                                     clock_.TimeInMilliseconds(), kPacketSize));
   1207  }
   1208 
   1209  int64_t start = clock_.TimeInMilliseconds();
   1210  while (packet_sender.packets_sent() < 5) {
   1211    AdvanceTimeUntil(pacer->NextSendTime());
   1212    pacer->ProcessPackets();
   1213  }
   1214  int packets_sent = packet_sender.packets_sent();
   1215  // Validate first cluster bitrate. Note that we have to account for number
   1216  // of intervals and hence (packets_sent - 1) on the first cluster.
   1217  EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
   1218                  (clock_.TimeInMilliseconds() - start),
   1219              kFirstClusterRate.bps(), kProbingErrorMargin.bps());
   1220  // Probing always starts with a small padding packet.
   1221  EXPECT_EQ(1, packet_sender.padding_sent());
   1222 
   1223  AdvanceTimeUntil(pacer->NextSendTime());
   1224  start = clock_.TimeInMilliseconds();
   1225  while (packet_sender.packets_sent() < 10) {
   1226    AdvanceTimeUntil(pacer->NextSendTime());
   1227    pacer->ProcessPackets();
   1228  }
   1229  packets_sent = packet_sender.packets_sent() - packets_sent;
   1230  // Validate second cluster bitrate.
   1231  EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
   1232                  (clock_.TimeInMilliseconds() - start),
   1233              kSecondClusterRate.bps(), kProbingErrorMargin.bps());
   1234 }
   1235 
   1236 TEST_F(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
   1237  const size_t kPacketSize = 1200;
   1238  const int kInitialBitrateBps = 300000;
   1239  const uint32_t ssrc = 12346;
   1240  const int kProbeClusterId = 3;
   1241 
   1242  uint16_t sequence_number = 1234;
   1243 
   1244  PacingControllerProbing packet_sender;
   1245 
   1246  const FieldTrials trials =
   1247      CreateTestFieldTrials("WebRTC-Bwe-ProbingBehavior/max_probe_delay:2ms/");
   1248  auto pacer =
   1249      std::make_unique<PacingController>(&clock_, &packet_sender, trials);
   1250  pacer->SetPacingRates(
   1251      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1252      DataRate::BitsPerSec(kInitialBitrateBps));
   1253 
   1254  for (int i = 0; i < 10; ++i) {
   1255    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
   1256                                     sequence_number++,
   1257                                     clock_.TimeInMilliseconds(), kPacketSize));
   1258  }
   1259  while (pacer->QueueSizePackets() > 0) {
   1260    AdvanceTimeUntil(pacer->NextSendTime());
   1261    pacer->ProcessPackets();
   1262  }
   1263 
   1264  // Probe at a very high rate.
   1265  std::vector<ProbeClusterConfig> probe_clusters = {
   1266      {.at_time = clock_.CurrentTime(),
   1267       .target_data_rate = DataRate::KilobitsPerSec(10000),  // 10 Mbps,
   1268       .target_duration = TimeDelta::Millis(15),
   1269       .target_probe_count = 5,
   1270       .id = kProbeClusterId}};
   1271  pacer->CreateProbeClusters(probe_clusters);
   1272 
   1273  // We need one packet to start the probe.
   1274  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
   1275                                   sequence_number++,
   1276                                   clock_.TimeInMilliseconds(), kPacketSize));
   1277  const int packets_sent_before_probe = packet_sender.packets_sent();
   1278  AdvanceTimeUntil(pacer->NextSendTime());
   1279  pacer->ProcessPackets();
   1280  EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
   1281 
   1282  // Figure out how long between probe packets.
   1283  Timestamp start_time = clock_.CurrentTime();
   1284  AdvanceTimeUntil(pacer->NextSendTime());
   1285  TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
   1286  // Advance that distance again + 1ms.
   1287  clock_.AdvanceTime(time_between_probes);
   1288 
   1289  // Send second probe packet.
   1290  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
   1291                                   sequence_number++,
   1292                                   clock_.TimeInMilliseconds(), kPacketSize));
   1293  pacer->ProcessPackets();
   1294  EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
   1295  PacedPacketInfo last_pacing_info = packet_sender.last_pacing_info();
   1296  EXPECT_EQ(last_pacing_info.probe_cluster_id, kProbeClusterId);
   1297 
   1298  // We're exactly where we should be for the next probe.
   1299  const Timestamp probe_time = clock_.CurrentTime();
   1300  EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime());
   1301 
   1302  BitrateProberConfig probing_config(&trials);
   1303  EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
   1304  // Advance to within max probe delay, should still return same target.
   1305  clock_.AdvanceTime(probing_config.max_probe_delay.Get());
   1306  EXPECT_EQ(pacer->NextSendTime(), probe_time);
   1307 
   1308  // Too high probe delay, drop it!
   1309  clock_.AdvanceTime(TimeDelta::Micros(1));
   1310 
   1311  int packets_sent_before_timeout = packet_sender.total_packets_sent();
   1312  // Expected next process time is unchanged, but calling should not
   1313  // generate new packets.
   1314  EXPECT_EQ(pacer->NextSendTime(), probe_time);
   1315  pacer->ProcessPackets();
   1316  EXPECT_EQ(packet_sender.total_packets_sent(), packets_sent_before_timeout);
   1317 
   1318  // Next packet sent is not part of probe.
   1319  AdvanceTimeUntil(pacer->NextSendTime());
   1320  pacer->ProcessPackets();
   1321  const int expected_probe_id = PacedPacketInfo::kNotAProbe;
   1322  EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
   1323            expected_probe_id);
   1324 }
   1325 
   1326 TEST_F(PacingControllerTest, ProbingWithPaddingSupport) {
   1327  const size_t kPacketSize = 1200;
   1328  const int kInitialBitrateBps = 300000;
   1329  uint32_t ssrc = 12346;
   1330  uint16_t sequence_number = 1234;
   1331 
   1332  PacingControllerProbing packet_sender;
   1333  auto pacer =
   1334      std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
   1335  std::vector<ProbeClusterConfig> probe_clusters = {
   1336      {.at_time = clock_.CurrentTime(),
   1337       .target_data_rate = kFirstClusterRate,
   1338       .target_duration = TimeDelta::Millis(15),
   1339       .target_probe_count = 5,
   1340       .id = 0}};
   1341  pacer->CreateProbeClusters(probe_clusters);
   1342 
   1343  pacer->SetPacingRates(
   1344      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1345      DataRate::Zero());
   1346 
   1347  for (int i = 0; i < 3; ++i) {
   1348    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
   1349                                     sequence_number++,
   1350                                     clock_.TimeInMilliseconds(), kPacketSize));
   1351  }
   1352 
   1353  int64_t start = clock_.TimeInMilliseconds();
   1354  int process_count = 0;
   1355  while (process_count < 5) {
   1356    AdvanceTimeUntil(pacer->NextSendTime());
   1357    pacer->ProcessPackets();
   1358    ++process_count;
   1359  }
   1360  int packets_sent = packet_sender.packets_sent();
   1361  int padding_sent = packet_sender.padding_sent();
   1362  EXPECT_GT(packets_sent, 0);
   1363  EXPECT_GT(padding_sent, 0);
   1364  // Note that the number of intervals here for kPacketSize is
   1365  // packets_sent due to padding in the same cluster.
   1366  EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
   1367                  (clock_.TimeInMilliseconds() - start),
   1368              kFirstClusterRate.bps(), kProbingErrorMargin.bps());
   1369 }
   1370 
   1371 TEST_F(PacingControllerTest, PaddingPacketCanTriggerProbe) {
   1372  const int kInitialBitrateBps = 300000;
   1373  PacingControllerProbing packet_sender;
   1374  auto pacer =
   1375      std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
   1376 
   1377  pacer->SetPacingRates(
   1378      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1379      /*padding_rate*/ DataRate::KilobitsPerSec(300));
   1380 
   1381  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo,
   1382                                   /*ssrc=*/123, /*sequence_number=*/1,
   1383                                   clock_.TimeInMilliseconds(),
   1384                                   /*payload_size=*/50));
   1385 
   1386  for (int i = 0; i < 5; ++i) {
   1387    AdvanceTimeUntil(pacer->NextSendTime());
   1388    pacer->ProcessPackets();
   1389    EXPECT_EQ(packet_sender.last_pacing_info().probe_cluster_id,
   1390              PacedPacketInfo::kNotAProbe);
   1391  }
   1392  ASSERT_GT(packet_sender.packets_sent(), 0);
   1393  ASSERT_GT(packet_sender.padding_sent(), 0);
   1394 
   1395  const int kProbeClusterId = 1;
   1396  std::vector<ProbeClusterConfig> probe_clusters = {
   1397      {.at_time = clock_.CurrentTime(),
   1398       .target_data_rate = DataRate::KilobitsPerSec(1000),
   1399       .target_duration = TimeDelta::Millis(15),
   1400       .target_probe_count = 5,
   1401       .id = kProbeClusterId}};
   1402  pacer->CreateProbeClusters(probe_clusters);
   1403  bool probe_packet_seen = false;
   1404  for (int i = 0; i < 5; ++i) {
   1405    AdvanceTimeUntil(pacer->NextSendTime());
   1406    pacer->ProcessPackets();
   1407    if (packet_sender.last_pacing_info().probe_cluster_id == kProbeClusterId) {
   1408      probe_packet_seen = true;
   1409      break;
   1410    }
   1411  }
   1412  EXPECT_TRUE(probe_packet_seen);
   1413 }
   1414 
   1415 TEST_F(PacingControllerTest, CanProbeWithPaddingBeforeFirstMediaPacket) {
   1416  // const size_t kPacketSize = 1200;
   1417  const int kInitialBitrateBps = 300000;
   1418 
   1419  PacingControllerProbing packet_sender;
   1420  auto pacer =
   1421      std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
   1422  pacer->SetAllowProbeWithoutMediaPacket(true);
   1423  std::vector<ProbeClusterConfig> probe_clusters = {
   1424      {.at_time = clock_.CurrentTime(),
   1425       .target_data_rate = kFirstClusterRate,
   1426       .target_duration = TimeDelta::Millis(15),
   1427       .target_probe_count = 5,
   1428       .id = 0}};
   1429  pacer->CreateProbeClusters(probe_clusters);
   1430 
   1431  pacer->SetPacingRates(
   1432      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1433      DataRate::Zero());
   1434 
   1435  Timestamp start = clock_.CurrentTime();
   1436  Timestamp next_process = pacer->NextSendTime();
   1437  while (clock_.CurrentTime() < start + TimeDelta::Millis(100) &&
   1438         next_process.IsFinite()) {
   1439    AdvanceTimeUntil(next_process);
   1440    pacer->ProcessPackets();
   1441    next_process = pacer->NextSendTime();
   1442  }
   1443  EXPECT_GT(packet_sender.padding_packets_sent(), 5);
   1444 }
   1445 
   1446 TEST_F(PacingControllerTest, ProbeSentAfterSetAllowProbeWithoutMediaPacket) {
   1447  const int kInitialBitrateBps = 300000;
   1448 
   1449  PacingControllerProbing packet_sender;
   1450  auto pacer =
   1451      std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
   1452  std::vector<ProbeClusterConfig> probe_clusters = {
   1453      {.at_time = clock_.CurrentTime(),
   1454       .target_data_rate = kFirstClusterRate,
   1455       .target_duration = TimeDelta::Millis(15),
   1456       .target_probe_count = 5,
   1457       .id = 0}};
   1458  pacer->CreateProbeClusters(probe_clusters);
   1459 
   1460  pacer->SetPacingRates(
   1461      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1462      DataRate::Zero());
   1463 
   1464  pacer->SetAllowProbeWithoutMediaPacket(true);
   1465 
   1466  Timestamp start = clock_.CurrentTime();
   1467  Timestamp next_process = pacer->NextSendTime();
   1468  while (clock_.CurrentTime() < start + TimeDelta::Millis(100) &&
   1469         next_process.IsFinite()) {
   1470    AdvanceTimeUntil(next_process);
   1471    pacer->ProcessPackets();
   1472    next_process = pacer->NextSendTime();
   1473  }
   1474  EXPECT_GT(packet_sender.padding_packets_sent(), 5);
   1475 }
   1476 
   1477 TEST_F(PacingControllerTest, CanNotProbeWithPaddingIfGeneratePaddingFails) {
   1478  // const size_t kPacketSize = 1200;
   1479  const int kInitialBitrateBps = 300000;
   1480 
   1481  PacingControllerProbing packet_sender;
   1482  packet_sender.SetCanGeneratePadding(false);
   1483  auto pacer =
   1484      std::make_unique<PacingController>(&clock_, &packet_sender, trials_);
   1485  pacer->SetAllowProbeWithoutMediaPacket(true);
   1486  std::vector<ProbeClusterConfig> probe_clusters = {
   1487      {.at_time = clock_.CurrentTime(),
   1488       .target_data_rate = kFirstClusterRate,
   1489       .target_duration = TimeDelta::Millis(15),
   1490       .target_probe_count = 5,
   1491       .id = 0}};
   1492  pacer->CreateProbeClusters(probe_clusters);
   1493 
   1494  pacer->SetPacingRates(
   1495      DataRate::BitsPerSec(kInitialBitrateBps * kPaceMultiplier),
   1496      DataRate::Zero());
   1497 
   1498  Timestamp start = clock_.CurrentTime();
   1499  int process_count = 0;
   1500  Timestamp next_process = pacer->NextSendTime();
   1501  while (clock_.CurrentTime() < start + TimeDelta::Millis(100) &&
   1502         next_process.IsFinite()) {
   1503    AdvanceTimeUntil(next_process);
   1504    pacer->ProcessPackets();
   1505    ++process_count;
   1506    next_process = pacer->NextSendTime();
   1507  }
   1508 
   1509  EXPECT_LT(process_count, 10);
   1510  EXPECT_EQ(packet_sender.padding_packets_sent(), 0);
   1511 }
   1512 
   1513 TEST_F(PacingControllerTest, PaddingOveruse) {
   1514  uint32_t ssrc = 12346;
   1515  uint16_t sequence_number = 1234;
   1516  const size_t kPacketSize = 1200;
   1517  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1518  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
   1519 
   1520  // Initially no padding rate.
   1521  pacer->ProcessPackets();
   1522  pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
   1523                        DataRate::Zero());
   1524 
   1525  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
   1526                      sequence_number++, clock_.TimeInMilliseconds(),
   1527                      kPacketSize);
   1528  pacer->ProcessPackets();
   1529 
   1530  // Add 30kbit padding. When increasing budget, media budget will increase from
   1531  // negative (overuse) while padding budget will increase from 0.
   1532  clock_.AdvanceTimeMilliseconds(5);
   1533  pacer->SetPacingRates(DataRate::BitsPerSec(60000 * kPaceMultiplier),
   1534                        DataRate::BitsPerSec(30000));
   1535 
   1536  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
   1537                      sequence_number++, clock_.TimeInMilliseconds(),
   1538                      kPacketSize);
   1539  EXPECT_LT(TimeDelta::Millis(5), pacer->ExpectedQueueTime());
   1540  // Don't send padding if queue is non-empty, even if padding budget > 0.
   1541  EXPECT_CALL(callback_, SendPadding).Times(0);
   1542  AdvanceTimeUntil(pacer->NextSendTime());
   1543  pacer->ProcessPackets();
   1544 }
   1545 
   1546 TEST_F(PacingControllerTest, ProvidesOnBatchCompleteToPacketSender) {
   1547  MockPacketSender callback;
   1548  auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
   1549  EXPECT_CALL(callback, OnBatchComplete);
   1550  pacer->ProcessPackets();
   1551 }
   1552 
   1553 TEST_F(PacingControllerTest, ProbeClusterId) {
   1554  MockPacketSender callback;
   1555  uint32_t ssrc = 12346;
   1556  uint16_t sequence_number = 1234;
   1557  const size_t kPacketSize = 1200;
   1558 
   1559  auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
   1560  pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
   1561      {{.at_time = clock_.CurrentTime(),
   1562        .target_data_rate = kFirstClusterRate,
   1563        .target_duration = TimeDelta::Millis(15),
   1564        .target_probe_count = 5,
   1565        .id = 0},
   1566       {.at_time = clock_.CurrentTime(),
   1567        .target_data_rate = kSecondClusterRate,
   1568        .target_duration = TimeDelta::Millis(15),
   1569        .target_probe_count = 5,
   1570        .id = 1}}));
   1571  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
   1572  pacer->SetProbingEnabled(true);
   1573  for (int i = 0; i < 10; ++i) {
   1574    pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, ssrc,
   1575                                     sequence_number++,
   1576                                     clock_.TimeInMilliseconds(), kPacketSize));
   1577  }
   1578 
   1579  // First probing cluster.
   1580  EXPECT_CALL(callback,
   1581              SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
   1582      .Times(5);
   1583 
   1584  for (int i = 0; i < 5; ++i) {
   1585    AdvanceTimeUntil(pacer->NextSendTime());
   1586    pacer->ProcessPackets();
   1587  }
   1588 
   1589  // Second probing cluster.
   1590  EXPECT_CALL(callback,
   1591              SendPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
   1592      .Times(5);
   1593 
   1594  for (int i = 0; i < 5; ++i) {
   1595    AdvanceTimeUntil(pacer->NextSendTime());
   1596    pacer->ProcessPackets();
   1597  }
   1598 
   1599  // Needed for the Field comparer below.
   1600  const int kNotAProbe = PacedPacketInfo::kNotAProbe;
   1601  // No more probing packets.
   1602  EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
   1603    std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
   1604    padding_packets.emplace_back(
   1605        BuildPacket(RtpPacketMediaType::kPadding, ssrc, sequence_number++,
   1606                    clock_.TimeInMilliseconds(), padding_size.bytes()));
   1607    return padding_packets;
   1608  });
   1609  bool non_probe_packet_seen = false;
   1610  EXPECT_CALL(callback, SendPacket)
   1611      .WillOnce([&](std::unique_ptr<RtpPacketToSend> /* packet */,
   1612                    const PacedPacketInfo& cluster_info) {
   1613        EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
   1614        non_probe_packet_seen = true;
   1615      });
   1616  while (!non_probe_packet_seen) {
   1617    AdvanceTimeUntil(pacer->NextSendTime());
   1618    pacer->ProcessPackets();
   1619  }
   1620 }
   1621 
   1622 TEST_F(PacingControllerTest, OwnedPacketPrioritizedOnType) {
   1623  MockPacketSender callback;
   1624  uint32_t ssrc = 123;
   1625 
   1626  auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
   1627  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
   1628 
   1629  // Insert a packet of each type, from low to high priority. Since priority
   1630  // is weighted higher than insert order, these should come out of the pacer
   1631  // in backwards order with the exception of FEC and Video.
   1632 
   1633  for (RtpPacketMediaType type :
   1634       {RtpPacketMediaType::kPadding,
   1635        RtpPacketMediaType::kForwardErrorCorrection, RtpPacketMediaType::kVideo,
   1636        RtpPacketMediaType::kRetransmission, RtpPacketMediaType::kAudio}) {
   1637    pacer->EnqueuePacket(BuildPacket(type, ++ssrc, /*sequence_number=*/123,
   1638                                     clock_.TimeInMilliseconds(),
   1639                                     /*size=*/150));
   1640  }
   1641 
   1642  ::testing::InSequence seq;
   1643  EXPECT_CALL(callback,
   1644              SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
   1645                                          RtpPacketMediaType::kAudio)),
   1646                         _));
   1647  EXPECT_CALL(callback,
   1648              SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
   1649                                          RtpPacketMediaType::kRetransmission)),
   1650                         _));
   1651 
   1652  // FEC and video actually have the same priority, so will come out in
   1653  // insertion order.
   1654  EXPECT_CALL(
   1655      callback,
   1656      SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
   1657                                  RtpPacketMediaType::kForwardErrorCorrection)),
   1658                 _));
   1659  EXPECT_CALL(callback,
   1660              SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
   1661                                          RtpPacketMediaType::kVideo)),
   1662                         _));
   1663 
   1664  EXPECT_CALL(callback,
   1665              SendPacket(Pointee(Property(&RtpPacketToSend::packet_type,
   1666                                          RtpPacketMediaType::kPadding)),
   1667                         _));
   1668 
   1669  while (pacer->QueueSizePackets() > 0) {
   1670    AdvanceTimeUntil(pacer->NextSendTime());
   1671    pacer->ProcessPackets();
   1672  }
   1673 }
   1674 
   1675 TEST_F(PacingControllerTest, SmallFirstProbePacket) {
   1676  MockPacketSender callback;
   1677  auto pacer = std::make_unique<PacingController>(&clock_, &callback, trials_);
   1678  std::vector<ProbeClusterConfig> probe_clusters = {
   1679      {.at_time = clock_.CurrentTime(),
   1680       .target_data_rate = kFirstClusterRate,
   1681       .target_duration = TimeDelta::Millis(15),
   1682       .target_probe_count = 5,
   1683       .id = 0}};
   1684  pacer->CreateProbeClusters(probe_clusters);
   1685 
   1686  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
   1687 
   1688  // Add high prio media.
   1689  pacer->EnqueuePacket(audio_.BuildNextPacket(234));
   1690 
   1691  // Expect small padding packet to be requested.
   1692  EXPECT_CALL(callback, GeneratePadding(DataSize::Bytes(1)))
   1693      .WillOnce([&](DataSize /* padding_size */) {
   1694        std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
   1695        padding_packets.emplace_back(
   1696            BuildPacket(RtpPacketMediaType::kPadding, kAudioSsrc, 1,
   1697                        clock_.TimeInMilliseconds(), 1));
   1698        return padding_packets;
   1699      });
   1700 
   1701  size_t packets_sent = 0;
   1702  bool media_seen = false;
   1703  EXPECT_CALL(callback, SendPacket)
   1704      .Times(AnyNumber())
   1705      .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
   1706                          const PacedPacketInfo& /* cluster_info */) {
   1707        if (packets_sent == 0) {
   1708          EXPECT_EQ(packet->packet_type(), RtpPacketMediaType::kPadding);
   1709        } else {
   1710          if (packet->packet_type() == RtpPacketMediaType::kAudio) {
   1711            media_seen = true;
   1712          }
   1713        }
   1714        packets_sent++;
   1715      });
   1716  while (!media_seen) {
   1717    pacer->ProcessPackets();
   1718    clock_.AdvanceTimeMilliseconds(5);
   1719  }
   1720 }
   1721 
   1722 TEST_F(PacingControllerTest, TaskLate) {
   1723  // Set a low send rate to more easily test timing issues.
   1724  DataRate kSendRate = DataRate::KilobitsPerSec(30);
   1725  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1726  pacer->SetPacingRates(kSendRate, DataRate::Zero());
   1727 
   1728  // Add four packets of equal size and priority.
   1729  pacer->EnqueuePacket(video_.BuildNextPacket(1000));
   1730  pacer->EnqueuePacket(video_.BuildNextPacket(1000));
   1731  pacer->EnqueuePacket(video_.BuildNextPacket(1000));
   1732  pacer->EnqueuePacket(video_.BuildNextPacket(1000));
   1733 
   1734  // Process packets, only first should be sent.
   1735  EXPECT_CALL(callback_, SendPacket).Times(1);
   1736  pacer->ProcessPackets();
   1737 
   1738  Timestamp next_send_time = pacer->NextSendTime();
   1739  // Determine time between packets (ca 62ms)
   1740  const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
   1741 
   1742  // Simulate a late process call, executed just before we allow sending the
   1743  // fourth packet.
   1744  const TimeDelta kOffset = TimeDelta::Millis(1);
   1745  clock_.AdvanceTime((time_between_packets * 3) - kOffset);
   1746 
   1747  EXPECT_CALL(callback_, SendPacket).Times(2);
   1748  pacer->ProcessPackets();
   1749 
   1750  // Check that next scheduled send time is in ca 1ms.
   1751  next_send_time = pacer->NextSendTime();
   1752  const TimeDelta time_left = next_send_time - clock_.CurrentTime();
   1753  EXPECT_EQ(time_left.RoundTo(TimeDelta::Millis(1)), kOffset);
   1754 
   1755  clock_.AdvanceTime(time_left);
   1756  EXPECT_CALL(callback_, SendPacket);
   1757  pacer->ProcessPackets();
   1758 }
   1759 
   1760 TEST_F(PacingControllerTest, NoProbingWhilePaused) {
   1761  uint32_t ssrc = 12345;
   1762  uint16_t sequence_number = 1234;
   1763  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1764  pacer->SetProbingEnabled(true);
   1765  pacer->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
   1766  pacer->CreateProbeClusters(std::vector<ProbeClusterConfig>(
   1767      {{.at_time = clock_.CurrentTime(),
   1768        .target_data_rate = kFirstClusterRate,
   1769        .target_duration = TimeDelta::Millis(15),
   1770        .target_probe_count = 5,
   1771        .id = 0},
   1772       {.at_time = clock_.CurrentTime(),
   1773        .target_data_rate = kSecondClusterRate,
   1774        .target_duration = TimeDelta::Millis(15),
   1775        .target_probe_count = 5,
   1776        .id = 1}}));
   1777 
   1778  // Send at least one packet so probing can initate.
   1779  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, ssrc,
   1780                      sequence_number, clock_.TimeInMilliseconds(), 250);
   1781  while (pacer->QueueSizePackets() > 0) {
   1782    AdvanceTimeUntil(pacer->NextSendTime());
   1783    pacer->ProcessPackets();
   1784  }
   1785 
   1786  // Trigger probing.
   1787  std::vector<ProbeClusterConfig> probe_clusters = {
   1788      {.at_time = clock_.CurrentTime(),
   1789       .target_data_rate = DataRate::KilobitsPerSec(10000),  // 10 Mbps.
   1790       .target_duration = TimeDelta::Millis(15),
   1791       .target_probe_count = 5,
   1792       .id = 3}};
   1793  pacer->CreateProbeClusters(probe_clusters);
   1794 
   1795  // Time to next send time should be small.
   1796  EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(),
   1797            PacingController::kPausedProcessInterval);
   1798 
   1799  // Pause pacer, time to next send time should now be the pause process
   1800  // interval.
   1801  pacer->Pause();
   1802 
   1803  EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
   1804            PacingController::kPausedProcessInterval);
   1805 }
   1806 
   1807 TEST_F(PacingControllerTest, AudioNotPacedEvenWhenAccountedFor) {
   1808  const uint32_t kSsrc = 12345;
   1809  uint16_t sequence_number = 1234;
   1810  const size_t kPacketSize = 123;
   1811  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1812 
   1813  // Account for audio - so that audio packets can cause pushback on other
   1814  // types such as video. Audio packet should still be immediated passed
   1815  // through though ("WebRTC-Pacer-BlockAudio" needs to be enabled in order
   1816  // to pace audio packets).
   1817  pacer->SetAccountForAudioPackets(true);
   1818 
   1819  // Set pacing rate to 1 packet/s, no padding.
   1820  pacer->SetPacingRates(DataSize::Bytes(kPacketSize) / TimeDelta::Seconds(1),
   1821                        DataRate::Zero());
   1822 
   1823  // Add and send an audio packet.
   1824  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
   1825                      sequence_number++, clock_.TimeInMilliseconds(),
   1826                      kPacketSize);
   1827  pacer->ProcessPackets();
   1828 
   1829  // Advance time, add another audio packet and process. It should be sent
   1830  // immediately.
   1831  clock_.AdvanceTimeMilliseconds(5);
   1832  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
   1833                      sequence_number++, clock_.TimeInMilliseconds(),
   1834                      kPacketSize);
   1835  pacer->ProcessPackets();
   1836 }
   1837 
   1838 TEST_F(PacingControllerTest,
   1839       PaddingResumesAfterSaturationEvenWithConcurrentAudio) {
   1840  const uint32_t kSsrc = 12345;
   1841  const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
   1842  const DataRate kPaddingDataRate = DataRate::KilobitsPerSec(100);
   1843  const TimeDelta kMaxBufferInTime = TimeDelta::Millis(500);
   1844  const DataSize kPacketSize = DataSize::Bytes(130);
   1845  const TimeDelta kAudioPacketInterval = TimeDelta::Millis(20);
   1846 
   1847  // In this test, we fist send a burst of video in order to saturate the
   1848  // padding debt level.
   1849  // We then proceed to send audio at a bitrate that is slightly lower than
   1850  // the padding rate, meaning there will be a period with audio but no
   1851  // padding sent while the debt is draining, then audio and padding will
   1852  // be interlieved.
   1853 
   1854  // Verify both with and without accounting for audio.
   1855  for (bool account_for_audio : {false, true}) {
   1856    uint16_t sequence_number = 1234;
   1857    MockPacketSender callback;
   1858    EXPECT_CALL(callback, SendPacket).Times(AnyNumber());
   1859    auto pacer =
   1860        std::make_unique<PacingController>(&clock_, &callback, trials_);
   1861    pacer->SetAccountForAudioPackets(account_for_audio);
   1862 
   1863    // First, saturate the padding budget.
   1864    pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
   1865 
   1866    const TimeDelta kPaddingSaturationTime =
   1867        kMaxBufferInTime * kPaddingDataRate /
   1868        (kPacingDataRate - kPaddingDataRate);
   1869    const DataSize kVideoToSend = kPaddingSaturationTime * kPacingDataRate;
   1870    const DataSize kVideoPacketSize = DataSize::Bytes(1200);
   1871    DataSize video_sent = DataSize::Zero();
   1872    while (video_sent < kVideoToSend) {
   1873      pacer->EnqueuePacket(
   1874          BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number++,
   1875                      clock_.TimeInMilliseconds(), kVideoPacketSize.bytes()));
   1876      video_sent += kVideoPacketSize;
   1877    }
   1878    while (pacer->QueueSizePackets() > 0) {
   1879      AdvanceTimeUntil(pacer->NextSendTime());
   1880      pacer->ProcessPackets();
   1881    }
   1882 
   1883    // Add a stream of audio packets at a rate slightly lower than the padding
   1884    // rate, once the padding debt is paid off we expect padding to be
   1885    // generated.
   1886    pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
   1887    bool padding_seen = false;
   1888    EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
   1889      padding_seen = true;
   1890      std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
   1891      padding_packets.emplace_back(
   1892          BuildPacket(RtpPacketMediaType::kPadding, kSsrc, sequence_number++,
   1893                      clock_.TimeInMilliseconds(), padding_size.bytes()));
   1894      return padding_packets;
   1895    });
   1896 
   1897    Timestamp start_time = clock_.CurrentTime();
   1898    Timestamp last_audio_time = start_time;
   1899    while (!padding_seen) {
   1900      Timestamp now = clock_.CurrentTime();
   1901      Timestamp next_send_time = pacer->NextSendTime();
   1902      TimeDelta sleep_time =
   1903          std::min(next_send_time, last_audio_time + kAudioPacketInterval) -
   1904          now;
   1905      clock_.AdvanceTime(sleep_time);
   1906      while (clock_.CurrentTime() >= last_audio_time + kAudioPacketInterval) {
   1907        pacer->EnqueuePacket(
   1908            BuildPacket(RtpPacketMediaType::kAudio, kSsrc, sequence_number++,
   1909                        clock_.TimeInMilliseconds(), kPacketSize.bytes()));
   1910        last_audio_time += kAudioPacketInterval;
   1911      }
   1912      pacer->ProcessPackets();
   1913    }
   1914 
   1915    // Verify how long it took to drain the padding debt. Allow 2% error margin.
   1916    const DataRate kAudioDataRate = kPacketSize / kAudioPacketInterval;
   1917    const TimeDelta expected_drain_time =
   1918        account_for_audio ? (kMaxBufferInTime * kPaddingDataRate /
   1919                             (kPaddingDataRate - kAudioDataRate))
   1920                          : kMaxBufferInTime;
   1921    const TimeDelta actual_drain_time = clock_.CurrentTime() - start_time;
   1922    EXPECT_NEAR(actual_drain_time.ms(), expected_drain_time.ms(),
   1923                expected_drain_time.ms() * 0.02)
   1924        << " where account_for_audio = "
   1925        << (account_for_audio ? "true" : "false");
   1926  }
   1927 }
   1928 
   1929 TEST_F(PacingControllerTest, AccountsForAudioEnqueueTime) {
   1930  const uint32_t kSsrc = 12345;
   1931  const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
   1932  const DataRate kPaddingDataRate = DataRate::Zero();
   1933  const DataSize kPacketSize = DataSize::Bytes(130);
   1934  const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
   1935  uint32_t sequnce_number = 1;
   1936  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1937  // Audio not paced, but still accounted for in budget.
   1938  pacer->SetAccountForAudioPackets(true);
   1939  pacer->SetPacingRates(kPacingDataRate, kPaddingDataRate);
   1940  pacer->SetSendBurstInterval(TimeDelta::Zero());
   1941 
   1942  // Enqueue two audio packets, advance clock to where one packet
   1943  // should have drained the buffer already, has they been sent
   1944  // immediately.
   1945  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
   1946                      sequnce_number++, clock_.TimeInMilliseconds(),
   1947                      kPacketSize.bytes());
   1948  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kAudio, kSsrc,
   1949                      sequnce_number++, clock_.TimeInMilliseconds(),
   1950                      kPacketSize.bytes());
   1951  clock_.AdvanceTime(kPacketPacingTime);
   1952  // Now process and make sure both packets were sent.
   1953  pacer->ProcessPackets();
   1954  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   1955 
   1956  // Add a video packet. I can't be sent until debt from audio
   1957  // packets have been drained.
   1958  pacer->EnqueuePacket(
   1959      BuildPacket(RtpPacketMediaType::kVideo, kSsrc + 1, sequnce_number++,
   1960                  clock_.TimeInMilliseconds(), kPacketSize.bytes()));
   1961  EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), kPacketPacingTime);
   1962 }
   1963 
   1964 TEST_F(PacingControllerTest, NextSendTimeAccountsForPadding) {
   1965  const uint32_t kSsrc = 12345;
   1966  const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
   1967  const DataSize kPacketSize = DataSize::Bytes(130);
   1968  const TimeDelta kPacketPacingTime = kPacketSize / kPacingDataRate;
   1969  uint32_t sequnce_number = 1;
   1970  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   1971 
   1972  // Start with no padding.
   1973  pacer->SetPacingRates(kPacingDataRate, DataRate::Zero());
   1974 
   1975  // Send a single packet.
   1976  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
   1977                      sequnce_number++, clock_.TimeInMilliseconds(),
   1978                      kPacketSize.bytes());
   1979  pacer->ProcessPackets();
   1980  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   1981 
   1982  // With current conditions, no need to wake until next keep-alive.
   1983  EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
   1984            PacingController::kPausedProcessInterval);
   1985 
   1986  // Enqueue a new packet, that can be sent immediately due to default burst
   1987  // rate is 40ms.
   1988  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
   1989                      sequnce_number++, clock_.TimeInMilliseconds(),
   1990                      kPacketSize.bytes());
   1991  EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(), TimeDelta::Zero());
   1992  pacer->ProcessPackets();
   1993  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   1994 
   1995  // With current conditions, again no need to wake until next keep-alive.
   1996  EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
   1997            PacingController::kPausedProcessInterval);
   1998 
   1999  // Set a non-zero padding rate. Padding also can't be sent until
   2000  // previous debt has cleared. Since padding was disabled before, there
   2001  // currently is no padding debt.
   2002  pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
   2003  EXPECT_EQ(pacer->QueueSizePackets(), 0u);
   2004  EXPECT_LT(pacer->NextSendTime() - clock_.CurrentTime(),
   2005            PacingController::kDefaultBurstInterval);
   2006 
   2007  // Advance time, expect padding.
   2008  EXPECT_CALL(callback_, SendPadding).WillOnce(Return(kPacketSize.bytes()));
   2009  clock_.AdvanceTime(pacer->NextSendTime() - clock_.CurrentTime());
   2010  pacer->ProcessPackets();
   2011  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   2012 
   2013  // Since padding rate is half of pacing rate, next time we can send
   2014  // padding is double the packet pacing time.
   2015  EXPECT_EQ(pacer->NextSendTime() - clock_.CurrentTime(),
   2016            kPacketPacingTime * 2);
   2017 
   2018  // Insert a packet to be sent, this take precedence again.
   2019  pacer->EnqueuePacket(
   2020      BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequnce_number++,
   2021                  clock_.TimeInMilliseconds(), kPacketSize.bytes()));
   2022  EXPECT_EQ(pacer->NextSendTime(), clock_.CurrentTime());
   2023 }
   2024 
   2025 TEST_F(PacingControllerTest, PaddingTargetAccountsForPaddingRate) {
   2026  // Target size for a padding packet is 5ms * padding rate.
   2027  const TimeDelta kPaddingTarget = TimeDelta::Millis(5);
   2028  srand(0);
   2029  // Need to initialize PacingController after we initialize clock.
   2030  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   2031 
   2032  const uint32_t kSsrc = 12345;
   2033  const DataRate kPacingDataRate = DataRate::KilobitsPerSec(125);
   2034  const DataSize kPacketSize = DataSize::Bytes(130);
   2035 
   2036  uint32_t sequnce_number = 1;
   2037 
   2038  // Start with pacing and padding rate equal.
   2039  pacer->SetPacingRates(kPacingDataRate, kPacingDataRate);
   2040 
   2041  // Send a single packet.
   2042  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
   2043                      sequnce_number++, clock_.TimeInMilliseconds(),
   2044                      kPacketSize.bytes());
   2045  AdvanceTimeUntil(pacer->NextSendTime());
   2046  pacer->ProcessPackets();
   2047  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   2048 
   2049  size_t expected_padding_target_bytes =
   2050      (kPaddingTarget * kPacingDataRate).bytes();
   2051  EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes))
   2052      .WillOnce(Return(expected_padding_target_bytes));
   2053  AdvanceTimeUntil(pacer->NextSendTime());
   2054  pacer->ProcessPackets();
   2055 
   2056  // Half the padding rate - expect half the padding target.
   2057  pacer->SetPacingRates(kPacingDataRate, kPacingDataRate / 2);
   2058  EXPECT_CALL(callback_, SendPadding(expected_padding_target_bytes / 2))
   2059      .WillOnce(Return(expected_padding_target_bytes / 2));
   2060  AdvanceTimeUntil(pacer->NextSendTime());
   2061  pacer->ProcessPackets();
   2062 }
   2063 
   2064 TEST_F(PacingControllerTest, SendsFecPackets) {
   2065  const uint32_t kSsrc = 12345;
   2066  const uint32_t kFlexSsrc = 54321;
   2067  uint16_t sequence_number = 1234;
   2068  uint16_t flexfec_sequence_number = 4321;
   2069  const size_t kPacketSize = 123;
   2070  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   2071 
   2072  // Set pacing rate to 1000 packet/s, no padding.
   2073  pacer->SetPacingRates(
   2074      DataSize::Bytes(1000 * kPacketSize) / TimeDelta::Seconds(1),
   2075      DataRate::Zero());
   2076 
   2077  int64_t now = clock_.TimeInMilliseconds();
   2078  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
   2079                                   sequence_number, now, kPacketSize));
   2080  EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number, now, false, false));
   2081  EXPECT_CALL(callback_, FetchFec).WillOnce([&]() {
   2082    EXPECT_CALL(callback_, SendPacket(kFlexSsrc, flexfec_sequence_number, now,
   2083                                      false, false));
   2084    EXPECT_CALL(callback_, FetchFec);
   2085    std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets;
   2086    fec_packets.push_back(
   2087        BuildPacket(RtpPacketMediaType::kForwardErrorCorrection, kFlexSsrc,
   2088                    flexfec_sequence_number, now, kPacketSize));
   2089    return fec_packets;
   2090  });
   2091  AdvanceTimeUntil(pacer->NextSendTime());
   2092  pacer->ProcessPackets();
   2093  AdvanceTimeUntil(pacer->NextSendTime());
   2094  pacer->ProcessPackets();
   2095 }
   2096 
   2097 TEST_F(PacingControllerTest, GapInPacingDoesntAccumulateBudget) {
   2098  const uint32_t kSsrc = 12345;
   2099  uint16_t sequence_number = 1234;
   2100  const DataSize kPackeSize = DataSize::Bytes(1000);
   2101  const TimeDelta kPacketSendTime = TimeDelta::Millis(25);
   2102  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   2103 
   2104  pacer->SetPacingRates(kPackeSize / kPacketSendTime,
   2105                        /*padding_rate=*/DataRate::Zero());
   2106 
   2107  // Send an initial packet.
   2108  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
   2109                      sequence_number++, clock_.TimeInMilliseconds(),
   2110                      kPackeSize.bytes());
   2111  pacer->ProcessPackets();
   2112  ::testing::Mock::VerifyAndClearExpectations(&callback_);
   2113 
   2114  // Advance time kPacketSendTime past where the media debt should be 0.
   2115  clock_.AdvanceTime(2 * kPacketSendTime);
   2116 
   2117  // Enqueue three new packets. Expect only two to be sent one ProcessPackets()
   2118  // since the default burst interval is 40ms.
   2119  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
   2120                      sequence_number++, clock_.TimeInMilliseconds(),
   2121                      kPackeSize.bytes());
   2122  SendAndExpectPacket(pacer.get(), RtpPacketMediaType::kVideo, kSsrc,
   2123                      sequence_number++, clock_.TimeInMilliseconds(),
   2124                      kPackeSize.bytes());
   2125  EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number + 1, _, _, _))
   2126      .Times(0);
   2127  pacer->EnqueuePacket(
   2128      BuildPacket(RtpPacketMediaType::kVideo, kSsrc, sequence_number + 1,
   2129                  clock_.TimeInMilliseconds(), kPackeSize.bytes()));
   2130 
   2131  pacer->ProcessPackets();
   2132 }
   2133 
   2134 TEST_F(PacingControllerTest, HandlesSubMicrosecondSendIntervals) {
   2135  static constexpr DataSize kPacketSize = DataSize::Bytes(1);
   2136  static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
   2137  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   2138  pacer->SetSendBurstInterval(TimeDelta::Zero());
   2139 
   2140  // Set pacing rate such that a packet is sent in 0.5us.
   2141  pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
   2142                        /*padding_rate=*/DataRate::Zero());
   2143 
   2144  // Enqueue three packets, the first two should be sent immediately - the third
   2145  // should cause a non-zero delta to the next process time.
   2146  EXPECT_CALL(callback_, SendPacket).Times(2);
   2147  for (int i = 0; i < 3; ++i) {
   2148    pacer->EnqueuePacket(BuildPacket(
   2149        RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/i,
   2150        clock_.TimeInMilliseconds(), kPacketSize.bytes()));
   2151  }
   2152  pacer->ProcessPackets();
   2153 
   2154  EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
   2155 }
   2156 
   2157 TEST_F(PacingControllerTest, HandlesSubMicrosecondPaddingInterval) {
   2158  static constexpr DataSize kPacketSize = DataSize::Bytes(1);
   2159  static constexpr TimeDelta kPacketSendTime = TimeDelta::Micros(1);
   2160  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials_);
   2161 
   2162  // Set both pacing and padding rates to 1 byte per 0.5us.
   2163  pacer->SetPacingRates(/*pacing_rate=*/2 * kPacketSize / kPacketSendTime,
   2164                        /*padding_rate=*/2 * kPacketSize / kPacketSendTime);
   2165 
   2166  // Enqueue and send one packet.
   2167  EXPECT_CALL(callback_, SendPacket);
   2168  pacer->EnqueuePacket(BuildPacket(
   2169      RtpPacketMediaType::kVideo, /*ssrc=*/12345, /*sequence_number=*/1234,
   2170      clock_.TimeInMilliseconds(), kPacketSize.bytes()));
   2171  pacer->ProcessPackets();
   2172 
   2173  // The padding debt is now 1 byte, and the pacing time for that is lower than
   2174  // the precision of a TimeStamp tick. Make sure the pacer still indicates a
   2175  // non-zero sleep time is needed until the next process.
   2176  EXPECT_GT(pacer->NextSendTime(), clock_.CurrentTime());
   2177 }
   2178 
   2179 TEST_F(PacingControllerTest, SendsPacketsInBurstImmediately) {
   2180  constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
   2181  PacingController pacer(&clock_, &callback_, trials_);
   2182  pacer.SetSendBurstInterval(kMaxDelay);
   2183  pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
   2184 
   2185  // Max allowed send burst size is 100000*20/1000) = 200byte
   2186  pacer.EnqueuePacket(video_.BuildNextPacket(100));
   2187  pacer.EnqueuePacket(video_.BuildNextPacket(100));
   2188  pacer.EnqueuePacket(video_.BuildNextPacket(100));
   2189  pacer.ProcessPackets();
   2190  EXPECT_EQ(pacer.QueueSizePackets(), 1u);
   2191  EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime() + kMaxDelay);
   2192 
   2193  AdvanceTimeUntil(pacer.NextSendTime());
   2194  pacer.ProcessPackets();
   2195  EXPECT_EQ(pacer.QueueSizePackets(), 0u);
   2196 }
   2197 
   2198 TEST_F(PacingControllerTest, SendsPacketsInBurstEvenIfNotEnqueedAtSameTime) {
   2199  constexpr TimeDelta kMaxDelay = TimeDelta::Millis(20);
   2200  PacingController pacer(&clock_, &callback_, trials_);
   2201  pacer.SetSendBurstInterval(kMaxDelay);
   2202  pacer.SetPacingRates(DataRate::BytesPerSec(10000), DataRate::Zero());
   2203  pacer.EnqueuePacket(video_.BuildNextPacket(200));
   2204  EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
   2205  pacer.ProcessPackets();
   2206  clock_.AdvanceTime(TimeDelta::Millis(1));
   2207  pacer.EnqueuePacket(video_.BuildNextPacket(200));
   2208  EXPECT_EQ(pacer.NextSendTime(), clock_.CurrentTime());
   2209  pacer.ProcessPackets();
   2210  EXPECT_EQ(pacer.QueueSizePackets(), 0u);
   2211 }
   2212 
   2213 TEST_F(PacingControllerTest, RespectsTargetRateWhenSendingPacketsInBursts) {
   2214  PacingController pacer(&clock_, &callback_, trials_);
   2215  pacer.SetSendBurstInterval(TimeDelta::Millis(20));
   2216  pacer.SetAccountForAudioPackets(true);
   2217  pacer.SetPacingRates(DataRate::KilobitsPerSec(1000), DataRate::Zero());
   2218  Timestamp start_time = clock_.CurrentTime();
   2219  // Inject 100 packets, with size 1000bytes over 100ms.
   2220  // Expect only 1Mbps / (8*1000) / 10 =  12 packets to be sent.
   2221  // Packets are sent in burst. Each burst is then 3 packets * 1000bytes at
   2222  // 1Mbits = 24ms long. Thus, expect 4 bursts.
   2223  EXPECT_CALL(callback_, SendPacket).Times(12);
   2224  int number_of_bursts = 0;
   2225  while (clock_.CurrentTime() < start_time + TimeDelta::Millis(100)) {
   2226    pacer.EnqueuePacket(video_.BuildNextPacket(1000));
   2227    pacer.EnqueuePacket(video_.BuildNextPacket(1000));
   2228    pacer.EnqueuePacket(video_.BuildNextPacket(1000));
   2229    pacer.EnqueuePacket(video_.BuildNextPacket(1000));
   2230    pacer.EnqueuePacket(video_.BuildNextPacket(1000));
   2231    if (pacer.NextSendTime() <= clock_.CurrentTime()) {
   2232      pacer.ProcessPackets();
   2233      ++number_of_bursts;
   2234    }
   2235    clock_.AdvanceTime(TimeDelta::Millis(5));
   2236  }
   2237  EXPECT_EQ(pacer.QueueSizePackets(), 88u);
   2238  EXPECT_EQ(number_of_bursts, 4);
   2239 }
   2240 
   2241 TEST_F(PacingControllerTest,
   2242       MaxBurstSizeLimitedAtHighPacingRateWhenSendingPacketsInBursts) {
   2243  NiceMock<MockPacketSender> callback;
   2244  PacingController pacer(&clock_, &callback, trials_);
   2245  pacer.SetSendBurstInterval(TimeDelta::Millis(100));
   2246  pacer.SetPacingRates(DataRate::KilobitsPerSec(10'000), DataRate::Zero());
   2247 
   2248  size_t sent_size_in_burst = 0;
   2249  EXPECT_CALL(callback, SendPacket)
   2250      .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
   2251                          const PacedPacketInfo& /* cluster_info */) {
   2252        sent_size_in_burst += packet->size();
   2253      });
   2254 
   2255  // Enqueue 200 packets from a 200Kb encoded frame.
   2256  for (int i = 0; i < 200; ++i) {
   2257    pacer.EnqueuePacket(video_.BuildNextPacket(1000));
   2258  }
   2259 
   2260  while (pacer.QueueSizePackets() > 70) {
   2261    pacer.ProcessPackets();
   2262    EXPECT_NEAR(sent_size_in_burst, PacingController::kMaxBurstSize.bytes(),
   2263                1000);
   2264    sent_size_in_burst = 0;
   2265    TimeDelta time_to_next = pacer.NextSendTime() - clock_.CurrentTime();
   2266    EXPECT_NEAR(time_to_next.ms(), 50, 2);
   2267    clock_.AdvanceTime(time_to_next);
   2268  }
   2269 }
   2270 
   2271 TEST_F(PacingControllerTest, RespectsQueueTimeLimit) {
   2272  static constexpr DataSize kPacketSize = DataSize::Bytes(100);
   2273  static constexpr DataRate kNominalPacingRate = DataRate::KilobitsPerSec(200);
   2274  static constexpr TimeDelta kPacketPacingTime =
   2275      kPacketSize / kNominalPacingRate;
   2276  static constexpr TimeDelta kQueueTimeLimit = TimeDelta::Millis(1000);
   2277 
   2278  PacingController pacer(&clock_, &callback_, trials_);
   2279  pacer.SetPacingRates(kNominalPacingRate, /*padding_rate=*/DataRate::Zero());
   2280  pacer.SetQueueTimeLimit(kQueueTimeLimit);
   2281 
   2282  // Fill pacer up to queue time limit.
   2283  static constexpr int kNumPackets = kQueueTimeLimit / kPacketPacingTime;
   2284  for (int i = 0; i < kNumPackets; ++i) {
   2285    pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
   2286  }
   2287  EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
   2288  EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
   2289 
   2290  // Double the amount of packets in the queue, the queue time limit should
   2291  // effectively double the pacing rate in response.
   2292  for (int i = 0; i < kNumPackets; ++i) {
   2293    pacer.EnqueuePacket(video_.BuildNextPacket(kPacketSize.bytes()));
   2294  }
   2295  EXPECT_EQ(pacer.ExpectedQueueTime(), kQueueTimeLimit);
   2296  EXPECT_EQ(pacer.pacing_rate(), 2 * kNominalPacingRate);
   2297 
   2298  // Send all the packets, should take as long as the queue time limit.
   2299  Timestamp start_time = clock_.CurrentTime();
   2300  while (pacer.QueueSizePackets() > 0) {
   2301    AdvanceTimeUntil(pacer.NextSendTime());
   2302    pacer.ProcessPackets();
   2303  }
   2304  EXPECT_EQ(clock_.CurrentTime() - start_time, kQueueTimeLimit);
   2305 
   2306  // We're back in a normal state - pacing rate should be back to previous
   2307  // levels.
   2308  EXPECT_EQ(pacer.pacing_rate(), kNominalPacingRate);
   2309 }
   2310 
   2311 TEST_F(PacingControllerTest, BudgetDoesNotAffectRetransmissionInsTrial) {
   2312  const DataSize kPacketSize = DataSize::Bytes(1000);
   2313 
   2314  EXPECT_CALL(callback_, SendPadding).Times(0);
   2315  const FieldTrials trials =
   2316      CreateTestFieldTrials("WebRTC-Pacer-FastRetransmissions/Enabled/");
   2317  PacingController pacer(&clock_, &callback_, trials);
   2318  pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero());
   2319 
   2320  // Send a video packet so that we have a bit debt.
   2321  pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
   2322                                  /*sequence_number=*/1,
   2323                                  /*capture_time_ms=*/1, kPacketSize.bytes()));
   2324  EXPECT_CALL(callback_, SendPacket);
   2325  pacer.ProcessPackets();
   2326  EXPECT_GT(pacer.NextSendTime(), clock_.CurrentTime());
   2327 
   2328  // A retransmission packet should still be immediately processed.
   2329  EXPECT_CALL(callback_, SendPacket);
   2330  pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kRetransmission,
   2331                                  kVideoSsrc,
   2332                                  /*sequence_number=*/1,
   2333                                  /*capture_time_ms=*/1, kPacketSize.bytes()));
   2334  pacer.ProcessPackets();
   2335 }
   2336 
   2337 TEST_F(PacingControllerTest, AbortsAfterReachingCircuitBreakLimit) {
   2338  const DataSize kPacketSize = DataSize::Bytes(1000);
   2339 
   2340  EXPECT_CALL(callback_, SendPadding).Times(0);
   2341  PacingController pacer(&clock_, &callback_, trials_);
   2342  pacer.SetPacingRates(kTargetRate, /*padding_rate=*/DataRate::Zero());
   2343 
   2344  // Set the circuit breaker to abort after one iteration of the main
   2345  // sending loop.
   2346  pacer.SetCircuitBreakerThreshold(1);
   2347  EXPECT_CALL(callback_, SendPacket).Times(1);
   2348 
   2349  // Send two packets.
   2350  pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
   2351                                  /*sequence_number=*/1,
   2352                                  /*capture_time_ms=*/1, kPacketSize.bytes()));
   2353  pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
   2354                                  /*sequence_number=*/2,
   2355                                  /*capture_time_ms=*/2, kPacketSize.bytes()));
   2356 
   2357  // Advance time to way past where both should be eligible for sending.
   2358  clock_.AdvanceTime(TimeDelta::Seconds(1));
   2359 
   2360  pacer.ProcessPackets();
   2361 }
   2362 
   2363 TEST_F(PacingControllerTest, DoesNotPadIfProcessThreadIsBorked) {
   2364  PacingControllerPadding callback;
   2365  PacingController pacer(&clock_, &callback, trials_);
   2366 
   2367  // Set both pacing and padding rate to be non-zero.
   2368  pacer.SetPacingRates(kTargetRate, /*padding_rate=*/kTargetRate);
   2369 
   2370  // Add one packet to the queue, but do not send it yet.
   2371  pacer.EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kVideoSsrc,
   2372                                  /*sequence_number=*/1,
   2373                                  /*capture_time_ms=*/1,
   2374                                  /*size=*/1000));
   2375 
   2376  // Advance time to waaay after the packet should have been sent.
   2377  clock_.AdvanceTime(TimeDelta::Seconds(42));
   2378 
   2379  // `ProcessPackets()` should send the delayed packet, followed by a small
   2380  // amount of missed padding.
   2381  pacer.ProcessPackets();
   2382 
   2383  // The max padding window is the max replay duration + the target padding
   2384  // duration.
   2385  const DataSize kMaxPadding = (PacingController::kMaxPaddingReplayDuration +
   2386                                PacingController::kTargetPaddingDuration) *
   2387                               kTargetRate;
   2388 
   2389  EXPECT_LE(callback.padding_sent(), kMaxPadding.bytes<size_t>());
   2390 }
   2391 
   2392 TEST_F(PacingControllerTest, FlushesPacketsOnKeyFrames) {
   2393  const uint32_t kSsrc = 12345;
   2394  const uint32_t kRtxSsrc = 12346;
   2395 
   2396  const FieldTrials trials =
   2397      CreateTestFieldTrials("WebRTC-Pacer-KeyframeFlushing/Enabled/");
   2398  auto pacer = std::make_unique<PacingController>(&clock_, &callback_, trials);
   2399  EXPECT_CALL(callback_, GetRtxSsrcForMedia(kSsrc))
   2400      .WillRepeatedly(Return(kRtxSsrc));
   2401  pacer->SetPacingRates(kTargetRate, DataRate::Zero());
   2402 
   2403  // Enqueue a video packet and a retransmission of that video stream.
   2404  pacer->EnqueuePacket(BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
   2405                                   /*sequence_number=*/1, /*capture_time_ms=*/1,
   2406                                   /*size_bytes=*/100));
   2407  pacer->EnqueuePacket(
   2408      BuildPacket(RtpPacketMediaType::kRetransmission, kRtxSsrc,
   2409                  /*sequence_number=*/10, /*capture_time_ms=*/1,
   2410                  /*size_bytes=*/100));
   2411  EXPECT_EQ(pacer->QueueSizePackets(), 2u);
   2412 
   2413  // Enqueue the first packet of a keyframe for said stream.
   2414  auto packet = BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
   2415                            /*sequence_number=*/2, /*capture_time_ms=*/2,
   2416                            /*size_bytes=*/1000);
   2417  packet->set_is_key_frame(true);
   2418  packet->set_first_packet_of_frame(true);
   2419  pacer->EnqueuePacket(std::move(packet));
   2420 
   2421  // Only they new keyframe packet should be left in the queue.
   2422  EXPECT_EQ(pacer->QueueSizePackets(), 1u);
   2423 
   2424  EXPECT_CALL(callback_, SendPacket(kSsrc, /*sequence_number=*/2,
   2425                                    /*timestamp=*/2, /*is_retrnamission=*/false,
   2426                                    /*is_padding=*/false));
   2427  AdvanceTimeUntil(pacer->NextSendTime());
   2428  pacer->ProcessPackets();
   2429 }
   2430 
   2431 TEST_F(PacingControllerTest, CanControlQueueSizeUsingTtl) {
   2432  const uint32_t kSsrc = 54321;
   2433  uint16_t sequence_number = 1234;
   2434 
   2435  PacingController::Configuration config;
   2436  config.drain_large_queues = false;
   2437  config.packet_queue_ttl.video = TimeDelta::Millis(500);
   2438  auto pacer =
   2439      std::make_unique<PacingController>(&clock_, &callback_, trials_, config);
   2440  pacer->SetPacingRates(DataRate::BitsPerSec(100'000), DataRate::Zero());
   2441 
   2442  Timestamp send_time = Timestamp::Zero();
   2443  for (int i = 0; i < 100; ++i) {
   2444    // Enqueue a new audio and video frame every 33ms.
   2445    if (clock_.CurrentTime() - send_time > TimeDelta::Millis(33)) {
   2446      for (int j = 0; j < 3; ++j) {
   2447        auto packet = BuildPacket(RtpPacketMediaType::kVideo, kSsrc,
   2448                                  /*sequence_number=*/++sequence_number,
   2449                                  /*capture_time_ms=*/2,
   2450                                  /*size_bytes=*/1000);
   2451        pacer->EnqueuePacket(std::move(packet));
   2452      }
   2453      auto packet = BuildPacket(RtpPacketMediaType::kAudio, kAudioSsrc,
   2454                                /*sequence_number=*/++sequence_number,
   2455                                /*capture_time_ms=*/2,
   2456                                /*size_bytes=*/100);
   2457      pacer->EnqueuePacket(std::move(packet));
   2458      send_time = clock_.CurrentTime();
   2459    }
   2460 
   2461    EXPECT_LE(clock_.CurrentTime() - pacer->OldestPacketEnqueueTime(),
   2462              TimeDelta::Millis(500));
   2463    clock_.AdvanceTime(pacer->NextSendTime() - clock_.CurrentTime());
   2464    pacer->ProcessPackets();
   2465  }
   2466 }
   2467 
   2468 }  // namespace
   2469 }  // namespace webrtc