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