blob: e581e30492a6b0dac45e180c74cf0030dd7a6d2c [file] [log] [blame]
Erik Språngd05edec2019-08-14 10:43:47 +02001/*
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
Erik Språngd05edec2019-08-14 10:43:47 +020020#include "api/units/data_rate.h"
21#include "modules/pacing/packet_router.h"
22#include "system_wrappers/include/clock.h"
23#include "test/field_trial.h"
24#include "test/gmock.h"
25#include "test/gtest.h"
26
27using ::testing::_;
28using ::testing::Field;
29using ::testing::Pointee;
30using ::testing::Property;
31using ::testing::Return;
32
33namespace webrtc {
34namespace test {
35namespace {
36constexpr DataRate kFirstClusterRate = DataRate::KilobitsPerSec<900>();
37constexpr DataRate kSecondClusterRate = DataRate::KilobitsPerSec<1800>();
38
39// The error stems from truncating the time interval of probe packets to integer
40// values. This results in probing slightly higher than the target bitrate.
41// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
42constexpr DataRate kProbingErrorMargin = DataRate::KilobitsPerSec<150>();
43
44const float kPaceMultiplier = 2.5f;
45
46constexpr uint32_t kAudioSsrc = 12345;
47constexpr uint32_t kVideoSsrc = 234565;
48constexpr uint32_t kVideoRtxSsrc = 34567;
49constexpr uint32_t kFlexFecSsrc = 45678;
50
51constexpr DataRate kTargetRate = DataRate::KilobitsPerSec<800>();
52
Erik Språngd05edec2019-08-14 10:43:47 +020053std::unique_ptr<RtpPacketToSend> BuildPacket(RtpPacketToSend::Type type,
54 uint32_t ssrc,
55 uint16_t sequence_number,
56 int64_t capture_time_ms,
57 size_t size) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020058 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020059 packet->set_packet_type(type);
60 packet->SetSsrc(ssrc);
61 packet->SetSequenceNumber(sequence_number);
62 packet->set_capture_time_ms(capture_time_ms);
63 packet->SetPayloadSize(size);
64 return packet;
65}
66} // namespace
67
68// Mock callback proxy, where both new and old api redirects to common mock
69// methods that focus on core aspects.
70class MockPacingControllerCallback : public PacingController::PacketSender {
71 public:
Erik Språngd05edec2019-08-14 10:43:47 +020072 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
73 const PacedPacketInfo& cluster_info) override {
74 SendPacket(packet->Ssrc(), packet->SequenceNumber(),
75 packet->capture_time_ms(),
76 packet->packet_type() == RtpPacketToSend::Type::kRetransmission,
77 packet->packet_type() == RtpPacketToSend::Type::kPadding);
78 }
79
Erik Språngd05edec2019-08-14 10:43:47 +020080 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
81 DataSize target_size) override {
82 std::vector<std::unique_ptr<RtpPacketToSend>> ret;
83 size_t padding_size = SendPadding(target_size.bytes());
84 if (padding_size > 0) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +020085 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +020086 packet->SetPayloadSize(padding_size);
87 packet->set_packet_type(RtpPacketToSend::Type::kPadding);
88 ret.emplace_back(std::move(packet));
89 }
90 return ret;
91 }
92
93 MOCK_METHOD5(SendPacket,
94 void(uint32_t ssrc,
95 uint16_t sequence_number,
96 int64_t capture_timestamp,
97 bool retransmission,
98 bool padding));
99 MOCK_METHOD1(SendPadding, size_t(size_t target_size));
100};
101
102// Mock callback implementing the raw api.
103class MockPacketSender : public PacingController::PacketSender {
104 public:
Erik Språngd05edec2019-08-14 10:43:47 +0200105 MOCK_METHOD2(SendRtpPacket,
106 void(std::unique_ptr<RtpPacketToSend> packet,
107 const PacedPacketInfo& cluster_info));
108 MOCK_METHOD1(
109 GeneratePadding,
110 std::vector<std::unique_ptr<RtpPacketToSend>>(DataSize target_size));
111};
112
113class PacingControllerPadding : public PacingController::PacketSender {
114 public:
115 static const size_t kPaddingPacketSize = 224;
116
Erik Språngeb487992019-11-14 14:15:15 +0100117 PacingControllerPadding() : padding_sent_(0), total_bytes_sent_(0) {}
Erik Språngd05edec2019-08-14 10:43:47 +0200118
Erik Språngd05edec2019-08-14 10:43:47 +0200119 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
Erik Språngeb487992019-11-14 14:15:15 +0100120 const PacedPacketInfo& pacing_info) override {
121 total_bytes_sent_ += packet->payload_size();
122 }
Erik Språngd05edec2019-08-14 10:43:47 +0200123
Erik Språngd05edec2019-08-14 10:43:47 +0200124 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
125 DataSize target_size) override {
126 size_t num_packets =
127 (target_size.bytes() + kPaddingPacketSize - 1) / kPaddingPacketSize;
128 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
129 for (size_t i = 0; i < num_packets; ++i) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200130 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
Erik Språngd05edec2019-08-14 10:43:47 +0200131 packets.back()->SetPadding(kPaddingPacketSize);
132 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
133 padding_sent_ += kPaddingPacketSize;
134 }
135 return packets;
136 }
137
138 size_t padding_sent() { return padding_sent_; }
Erik Språngeb487992019-11-14 14:15:15 +0100139 size_t total_bytes_sent() { return total_bytes_sent_; }
Erik Språngd05edec2019-08-14 10:43:47 +0200140
141 private:
142 size_t padding_sent_;
Erik Språngeb487992019-11-14 14:15:15 +0100143 size_t total_bytes_sent_;
Erik Språngd05edec2019-08-14 10:43:47 +0200144};
145
146class PacingControllerProbing : public PacingController::PacketSender {
147 public:
148 PacingControllerProbing() : packets_sent_(0), padding_sent_(0) {}
149
Erik Språngd05edec2019-08-14 10:43:47 +0200150 void SendRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
151 const PacedPacketInfo& pacing_info) override {
152 if (packet->packet_type() != RtpPacketToSend::Type::kPadding) {
153 ++packets_sent_;
154 }
155 }
156
Erik Språngd05edec2019-08-14 10:43:47 +0200157 std::vector<std::unique_ptr<RtpPacketToSend>> GeneratePadding(
158 DataSize target_size) override {
Erik Språngb210eeb2019-11-05 11:21:48 +0100159 // From RTPSender:
160 // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
161 const DataSize kMaxPadding = DataSize::bytes(224);
162
Erik Språngd05edec2019-08-14 10:43:47 +0200163 std::vector<std::unique_ptr<RtpPacketToSend>> packets;
Erik Språngb210eeb2019-11-05 11:21:48 +0100164 while (target_size > DataSize::Zero()) {
165 DataSize padding_size = std::min(kMaxPadding, target_size);
166 packets.emplace_back(std::make_unique<RtpPacketToSend>(nullptr));
167 packets.back()->SetPadding(padding_size.bytes());
168 packets.back()->set_packet_type(RtpPacketToSend::Type::kPadding);
169 padding_sent_ += padding_size.bytes();
170 target_size -= padding_size;
171 }
Erik Språngd05edec2019-08-14 10:43:47 +0200172 return packets;
173 }
174
175 int packets_sent() const { return packets_sent_; }
176
177 int padding_sent() const { return padding_sent_; }
178
179 private:
180 int packets_sent_;
181 int padding_sent_;
182};
183
Erik Språngeb487992019-11-14 14:15:15 +0100184class PacingControllerTest
185 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200186 protected:
Erik Språngf5815fa2019-08-21 14:27:31 +0200187 PacingControllerTest() : clock_(123456) {
Erik Språngd05edec2019-08-14 10:43:47 +0200188 srand(0);
189 // Need to initialize PacingController after we initialize clock.
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200190 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +0100191 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200192 Init();
193 }
194
Erik Språngeb487992019-11-14 14:15:15 +0100195 bool PeriodicProcess() const {
196 return GetParam() == PacingController::ProcessMode::kPeriodic;
197 }
198
Erik Språngd05edec2019-08-14 10:43:47 +0200199 void Init() {
200 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
201 pacer_->CreateProbeCluster(kSecondClusterRate, /*cluster_id=*/1);
202 // Default to bitrate probing disabled for testing purposes. Probing tests
203 // have to enable probing, either by creating a new PacingController
204 // instance or by calling SetProbingEnabled(true).
205 pacer_->SetProbingEnabled(false);
206 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
207
208 clock_.AdvanceTime(TimeUntilNextProcess());
209 }
210
211 void Send(RtpPacketToSend::Type type,
212 uint32_t ssrc,
213 uint16_t sequence_number,
214 int64_t capture_time_ms,
215 size_t size) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200216 pacer_->EnqueuePacket(
217 BuildPacket(type, ssrc, sequence_number, capture_time_ms, size));
Erik Språngd05edec2019-08-14 10:43:47 +0200218 }
219
220 void SendAndExpectPacket(RtpPacketToSend::Type type,
221 uint32_t ssrc,
222 uint16_t sequence_number,
223 int64_t capture_time_ms,
224 size_t size) {
225 Send(type, ssrc, sequence_number, capture_time_ms, size);
226 EXPECT_CALL(
227 callback_,
228 SendPacket(ssrc, sequence_number, capture_time_ms,
229 type == RtpPacketToSend::Type::kRetransmission, false))
230 .Times(1);
231 }
232
Erik Språngd05edec2019-08-14 10:43:47 +0200233 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(RtpPacketToSend::Type type) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200234 auto packet = std::make_unique<RtpPacketToSend>(nullptr);
Erik Språngd05edec2019-08-14 10:43:47 +0200235 packet->set_packet_type(type);
236 switch (type) {
237 case RtpPacketToSend::Type::kAudio:
238 packet->SetSsrc(kAudioSsrc);
239 break;
240 case RtpPacketToSend::Type::kVideo:
241 packet->SetSsrc(kVideoSsrc);
242 break;
243 case RtpPacketToSend::Type::kRetransmission:
244 case RtpPacketToSend::Type::kPadding:
245 packet->SetSsrc(kVideoRtxSsrc);
246 break;
247 case RtpPacketToSend::Type::kForwardErrorCorrection:
248 packet->SetSsrc(kFlexFecSsrc);
249 break;
250 }
251
252 packet->SetPayloadSize(234);
253 return packet;
254 }
255
256 TimeDelta TimeUntilNextProcess() {
Erik Språngeb487992019-11-14 14:15:15 +0100257 Timestamp now = clock_.CurrentTime();
258 return std::max(pacer_->NextSendTime() - now, TimeDelta::Zero());
259 }
Erik Språngd05edec2019-08-14 10:43:47 +0200260
Erik Språngeb487992019-11-14 14:15:15 +0100261 void AdvanceTimeAndProcess() {
262 Timestamp now = clock_.CurrentTime();
263 Timestamp next_send_time = pacer_->NextSendTime();
264 clock_.AdvanceTime(std::max(TimeDelta::Zero(), next_send_time - now));
265 pacer_->ProcessPackets();
266 }
267
268 void ConsumeInitialBudget() {
269 const uint32_t kSsrc = 54321;
270 uint16_t sequence_number = 1234;
271 int64_t capture_time_ms = clock_.TimeInMilliseconds();
272 const size_t kPacketSize = 250;
273
274 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
275
276 // Due to the multiplicative factor we can send 5 packets during a send
277 // interval. (network capacity * multiplier / (8 bits per byte *
278 // (packet size * #send intervals per second)
279 const size_t packets_to_send_per_interval =
280 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
281 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
282 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, kSsrc,
283 sequence_number++, capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200284 }
285
Erik Språngeb487992019-11-14 14:15:15 +0100286 while (pacer_->QueueSizePackets() > 0) {
287 if (PeriodicProcess()) {
288 clock_.AdvanceTime(TimeUntilNextProcess());
289 pacer_->ProcessPackets();
290 } else {
291 AdvanceTimeAndProcess();
292 }
Erik Språngd05edec2019-08-14 10:43:47 +0200293 }
Erik Språngd05edec2019-08-14 10:43:47 +0200294 }
295
296 SimulatedClock clock_;
Erik Språngd05edec2019-08-14 10:43:47 +0200297 MockPacingControllerCallback callback_;
298 std::unique_ptr<PacingController> pacer_;
299};
300
Erik Språngeb487992019-11-14 14:15:15 +0100301class PacingControllerFieldTrialTest
302 : public ::testing::TestWithParam<PacingController::ProcessMode> {
Erik Språngd05edec2019-08-14 10:43:47 +0200303 protected:
304 struct MediaStream {
305 const RtpPacketToSend::Type type;
306 const uint32_t ssrc;
307 const size_t packet_size;
308 uint16_t seq_num;
309 };
310
311 const int kProcessIntervalsPerSecond = 1000 / 5;
312
313 PacingControllerFieldTrialTest() : clock_(123456) {}
314 void InsertPacket(PacingController* pacer, MediaStream* stream) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200315 pacer->EnqueuePacket(
316 BuildPacket(stream->type, stream->ssrc, stream->seq_num++,
317 clock_.TimeInMilliseconds(), stream->packet_size));
Erik Språngd05edec2019-08-14 10:43:47 +0200318 }
319 void ProcessNext(PacingController* pacer) {
Erik Språngeb487992019-11-14 14:15:15 +0100320 if (GetParam() == PacingController::ProcessMode::kPeriodic) {
321 TimeDelta process_interval = TimeDelta::ms(5);
322 clock_.AdvanceTime(process_interval);
323 pacer->ProcessPackets();
324 return;
325 }
326
327 Timestamp now = clock_.CurrentTime();
328 Timestamp next_send_time = pacer->NextSendTime();
329 TimeDelta wait_time = std::max(TimeDelta::Zero(), next_send_time - now);
330 clock_.AdvanceTime(wait_time);
Erik Språngd05edec2019-08-14 10:43:47 +0200331 pacer->ProcessPackets();
332 }
333 MediaStream audio{/*type*/ RtpPacketToSend::Type::kAudio,
334 /*ssrc*/ 3333, /*packet_size*/ 100, /*seq_num*/ 1000};
335 MediaStream video{/*type*/ RtpPacketToSend::Type::kVideo,
336 /*ssrc*/ 4444, /*packet_size*/ 1000, /*seq_num*/ 1000};
337 SimulatedClock clock_;
338 MockPacingControllerCallback callback_;
339};
340
Erik Språngeb487992019-11-14 14:15:15 +0100341TEST_P(PacingControllerFieldTrialTest, DefaultNoPaddingInSilence) {
342 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200343 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
344 // Video packet to reset last send time and provide padding data.
345 InsertPacket(&pacer, &video);
346 EXPECT_CALL(callback_, SendPacket).Times(1);
347 clock_.AdvanceTimeMilliseconds(5);
348 pacer.ProcessPackets();
349 EXPECT_CALL(callback_, SendPadding).Times(0);
350 // Waiting 500 ms should not trigger sending of padding.
351 clock_.AdvanceTimeMilliseconds(500);
352 pacer.ProcessPackets();
353}
354
Erik Språngeb487992019-11-14 14:15:15 +0100355TEST_P(PacingControllerFieldTrialTest, PaddingInSilenceWithTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200356 ScopedFieldTrials trial("WebRTC-Pacer-PadInSilence/Enabled/");
Erik Språngeb487992019-11-14 14:15:15 +0100357 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200358 pacer.SetPacingRates(kTargetRate, DataRate::Zero());
359 // Video packet to reset last send time and provide padding data.
360 InsertPacket(&pacer, &video);
Erik Språngf5815fa2019-08-21 14:27:31 +0200361 EXPECT_CALL(callback_, SendPacket).Times(2);
Erik Språngd05edec2019-08-14 10:43:47 +0200362 clock_.AdvanceTimeMilliseconds(5);
363 pacer.ProcessPackets();
364 EXPECT_CALL(callback_, SendPadding).WillOnce(Return(1000));
365 // Waiting 500 ms should trigger sending of padding.
366 clock_.AdvanceTimeMilliseconds(500);
367 pacer.ProcessPackets();
368}
369
Erik Språngeb487992019-11-14 14:15:15 +0100370TEST_P(PacingControllerFieldTrialTest, DefaultCongestionWindowAffectsAudio) {
Erik Språngd05edec2019-08-14 10:43:47 +0200371 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100372 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
373 pacer.SetPacingRates(DataRate::kbps(10000), DataRate::Zero());
374 pacer.SetCongestionWindow(DataSize::bytes(video.packet_size - 100));
Erik Språngd05edec2019-08-14 10:43:47 +0200375 pacer.UpdateOutstandingData(DataSize::Zero());
376 // Video packet fills congestion window.
377 InsertPacket(&pacer, &video);
378 EXPECT_CALL(callback_, SendPacket).Times(1);
379 ProcessNext(&pacer);
380 // Audio packet blocked due to congestion.
381 InsertPacket(&pacer, &audio);
382 EXPECT_CALL(callback_, SendPacket).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100383 if (GetParam() == PacingController::ProcessMode::kDynamic) {
384 // Without interval budget we'll forward time to where we send keep-alive.
385 EXPECT_CALL(callback_, SendPadding(1)).Times(2);
386 }
Erik Språngd05edec2019-08-14 10:43:47 +0200387 ProcessNext(&pacer);
388 ProcessNext(&pacer);
389 // Audio packet unblocked when congestion window clear.
390 ::testing::Mock::VerifyAndClearExpectations(&callback_);
391 pacer.UpdateOutstandingData(DataSize::Zero());
392 EXPECT_CALL(callback_, SendPacket).Times(1);
393 ProcessNext(&pacer);
394}
395
Erik Språngeb487992019-11-14 14:15:15 +0100396TEST_P(PacingControllerFieldTrialTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200397 CongestionWindowDoesNotAffectAudioInTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200398 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200399 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100400 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200401 pacer.SetPacingRates(DataRate::bps(10000000), DataRate::Zero());
402 pacer.SetCongestionWindow(DataSize::bytes(800));
403 pacer.UpdateOutstandingData(DataSize::Zero());
404 // Video packet fills congestion window.
405 InsertPacket(&pacer, &video);
406 EXPECT_CALL(callback_, SendPacket).Times(1);
407 ProcessNext(&pacer);
408 // Audio not blocked due to congestion.
409 InsertPacket(&pacer, &audio);
410 EXPECT_CALL(callback_, SendPacket).Times(1);
411 ProcessNext(&pacer);
412}
413
Erik Språngeb487992019-11-14 14:15:15 +0100414TEST_P(PacingControllerFieldTrialTest, DefaultBudgetAffectsAudio) {
415 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
416 DataRate pacing_rate =
417 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond);
418 pacer.SetPacingRates(pacing_rate, DataRate::Zero());
Erik Språngd05edec2019-08-14 10:43:47 +0200419 // Video fills budget for following process periods.
420 InsertPacket(&pacer, &video);
421 EXPECT_CALL(callback_, SendPacket).Times(1);
422 ProcessNext(&pacer);
423 // Audio packet blocked due to budget limit.
Erik Språngd05edec2019-08-14 10:43:47 +0200424 InsertPacket(&pacer, &audio);
Erik Språngeb487992019-11-14 14:15:15 +0100425 Timestamp wait_start_time = clock_.CurrentTime();
426 Timestamp wait_end_time = Timestamp::MinusInfinity();
427 EXPECT_CALL(callback_, SendPacket)
428 .WillOnce([&](uint32_t ssrc, uint16_t sequence_number,
429 int64_t capture_timestamp, bool retransmission,
430 bool padding) { wait_end_time = clock_.CurrentTime(); });
431 while (!wait_end_time.IsFinite()) {
432 ProcessNext(&pacer);
433 }
434 const TimeDelta expected_wait_time =
435 DataSize::bytes(video.packet_size) / pacing_rate;
436 // Verify delay is near expectation, within timing margin.
437 EXPECT_LT(((wait_end_time - wait_start_time) - expected_wait_time).Abs(),
438 GetParam() == PacingController::ProcessMode::kPeriodic
439 ? TimeDelta::ms(5)
440 : PacingController::kMinSleepTime);
Erik Språngd05edec2019-08-14 10:43:47 +0200441}
442
Erik Språngeb487992019-11-14 14:15:15 +0100443TEST_P(PacingControllerFieldTrialTest, BudgetDoesNotAffectAudioInTrial) {
Erik Språngf5815fa2019-08-21 14:27:31 +0200444 ScopedFieldTrials trial("WebRTC-Pacer-BlockAudio/Disabled/");
Erik Språngd05edec2019-08-14 10:43:47 +0200445 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100446 PacingController pacer(&clock_, &callback_, nullptr, nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200447 pacer.SetPacingRates(
448 DataRate::bps(video.packet_size / 3 * 8 * kProcessIntervalsPerSecond),
449 DataRate::Zero());
450 // Video fills budget for following process periods.
451 InsertPacket(&pacer, &video);
452 EXPECT_CALL(callback_, SendPacket).Times(1);
453 ProcessNext(&pacer);
454 // Audio packet not blocked due to budget limit.
455 EXPECT_CALL(callback_, SendPacket).Times(1);
456 InsertPacket(&pacer, &audio);
457 ProcessNext(&pacer);
458}
459
Erik Språngeb487992019-11-14 14:15:15 +0100460INSTANTIATE_TEST_SUITE_P(WithAndWithoutIntervalBudget,
461 PacingControllerFieldTrialTest,
462 ::testing::Values(false, true));
463
464TEST_P(PacingControllerTest, FirstSentPacketTimeIsSet) {
Erik Språngd05edec2019-08-14 10:43:47 +0200465 uint16_t sequence_number = 1234;
466 const uint32_t kSsrc = 12345;
467 const size_t kSizeBytes = 250;
468 const size_t kPacketToSend = 3;
469 const Timestamp kStartTime = clock_.CurrentTime();
470
471 // No packet sent.
472 EXPECT_FALSE(pacer_->FirstSentPacketTime().has_value());
473
474 for (size_t i = 0; i < kPacketToSend; ++i) {
475 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, kSsrc, sequence_number++,
476 clock_.TimeInMilliseconds(), kSizeBytes);
Erik Språngd05edec2019-08-14 10:43:47 +0200477 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +0100478 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200479 }
480 EXPECT_EQ(kStartTime, pacer_->FirstSentPacketTime());
481}
482
Erik Språngeb487992019-11-14 14:15:15 +0100483TEST_P(PacingControllerTest, QueuePacket) {
484 if (!PeriodicProcess()) {
485 // This test checks behavior applicable only when using interval budget.
486 return;
487 }
488
Erik Språngd05edec2019-08-14 10:43:47 +0200489 uint32_t ssrc = 12345;
490 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100491 // Due to the multiplicative factor we can send 5 packets during a 5ms send
Erik Språngd05edec2019-08-14 10:43:47 +0200492 // interval. (network capacity * multiplier / (8 bits per byte *
493 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +0100494 const size_t kPacketsToSend =
Erik Språngd05edec2019-08-14 10:43:47 +0200495 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngeb487992019-11-14 14:15:15 +0100496 for (size_t i = 0; i < kPacketsToSend; ++i) {
Erik Språngd05edec2019-08-14 10:43:47 +0200497 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
498 clock_.TimeInMilliseconds(), 250);
499 }
Erik Språngeb487992019-11-14 14:15:15 +0100500 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngd05edec2019-08-14 10:43:47 +0200501
Erik Språngeb487992019-11-14 14:15:15 +0100502 // Enqueue one extra packet.
Erik Språngd05edec2019-08-14 10:43:47 +0200503 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
504 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
505 queued_packet_timestamp, 250);
Erik Språngeb487992019-11-14 14:15:15 +0100506 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
507
508 // The first kPacketsToSend packets will be sent with budget from the
509 // initial 5ms interval.
Erik Språngd05edec2019-08-14 10:43:47 +0200510 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +0200511 EXPECT_EQ(1u, pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100512
513 // Advance time to next interval, make sure the last packet is sent.
514 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +0200515 EXPECT_CALL(callback_, SendPacket(ssrc, sequence_number++,
516 queued_packet_timestamp, false, false))
517 .Times(1);
518 pacer_->ProcessPackets();
519 sequence_number++;
520 EXPECT_EQ(0u, pacer_->QueueSizePackets());
521
522 // We can send packets_to_send -1 packets of size 250 during the current
523 // interval since one packet has already been sent.
Erik Språngeb487992019-11-14 14:15:15 +0100524 for (size_t i = 0; i < kPacketsToSend - 1; ++i) {
Erik Språngd05edec2019-08-14 10:43:47 +0200525 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
526 clock_.TimeInMilliseconds(), 250);
527 }
528 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
529 clock_.TimeInMilliseconds(), 250);
Erik Språngeb487992019-11-14 14:15:15 +0100530 EXPECT_EQ(kPacketsToSend, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200531 pacer_->ProcessPackets();
532 EXPECT_EQ(1u, pacer_->QueueSizePackets());
533}
534
Erik Språngeb487992019-11-14 14:15:15 +0100535TEST_P(PacingControllerTest, QueueAndPacePackets) {
536 if (PeriodicProcess()) {
537 // This test checks behavior when not using interval budget.
538 return;
539 }
540
541 const uint32_t kSsrc = 12345;
542 uint16_t sequence_number = 1234;
543 const DataSize kPackeSize = DataSize::bytes(250);
544 const TimeDelta kSendInterval = TimeDelta::ms(5);
545
546 // Due to the multiplicative factor we can send 5 packets during a 5ms send
547 // interval. (send interval * network capacity * multiplier / packet size)
548 const size_t kPacketsToSend = (kSendInterval * kTargetRate).bytes() *
549 kPaceMultiplier / kPackeSize.bytes();
550
551 for (size_t i = 0; i < kPacketsToSend; ++i) {
552 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, kSsrc, sequence_number++,
553 clock_.TimeInMilliseconds(), kPackeSize.bytes());
554 }
555 EXPECT_CALL(callback_, SendPadding).Times(0);
556
557 // Enqueue one extra packet.
558 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
559 Send(RtpPacketToSend::Type::kVideo, kSsrc, sequence_number,
560 queued_packet_timestamp, kPackeSize.bytes());
561 EXPECT_EQ(kPacketsToSend + 1, pacer_->QueueSizePackets());
562
563 // Send packets until the initial kPacketsToSend packets are done.
564 Timestamp start_time = clock_.CurrentTime();
565 while (pacer_->QueueSizePackets() > 1) {
566 AdvanceTimeAndProcess();
567 }
568 EXPECT_LT(clock_.CurrentTime() - start_time, kSendInterval);
569
570 // Proceed till last packet can be sent.
571 EXPECT_CALL(callback_, SendPacket(kSsrc, sequence_number,
572 queued_packet_timestamp, false, false))
573 .Times(1);
574 AdvanceTimeAndProcess();
575 EXPECT_GE(clock_.CurrentTime() - start_time, kSendInterval);
576 EXPECT_EQ(pacer_->QueueSizePackets(), 0u);
577}
578
579TEST_P(PacingControllerTest, PaceQueuedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +0200580 uint32_t ssrc = 12345;
581 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100582 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200583
584 // Due to the multiplicative factor we can send 5 packets during a send
585 // interval. (network capacity * multiplier / (8 bits per byte *
586 // (packet size * #send intervals per second)
587 const size_t packets_to_send_per_interval =
Erik Språngeb487992019-11-14 14:15:15 +0100588 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200589 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
590 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100591 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200592 }
593
594 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
595 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100596 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200597 }
598 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
599 pacer_->QueueSizePackets());
Erik Språngeb487992019-11-14 14:15:15 +0100600 if (PeriodicProcess()) {
Erik Språngd05edec2019-08-14 10:43:47 +0200601 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100602 } else {
603 while (pacer_->QueueSizePackets() > packets_to_send_per_interval * 10) {
604 AdvanceTimeAndProcess();
605 }
Erik Språngd05edec2019-08-14 10:43:47 +0200606 }
Erik Språngeb487992019-11-14 14:15:15 +0100607 EXPECT_EQ(pacer_->QueueSizePackets(), packets_to_send_per_interval * 10);
608 EXPECT_CALL(callback_, SendPadding).Times(0);
609
610 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, false))
611 .Times(pacer_->QueueSizePackets());
612 const TimeDelta expected_pace_time =
613 DataSize::bytes(pacer_->QueueSizePackets() * kPacketSize) /
614 (kPaceMultiplier * kTargetRate);
615 Timestamp start_time = clock_.CurrentTime();
616 while (pacer_->QueueSizePackets() > 0) {
617 if (PeriodicProcess()) {
618 clock_.AdvanceTime(TimeUntilNextProcess());
619 pacer_->ProcessPackets();
620 } else {
621 AdvanceTimeAndProcess();
622 }
623 }
624 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
625 EXPECT_LT(
626 (actual_pace_time - expected_pace_time).Abs(),
627 PeriodicProcess() ? TimeDelta::ms(5) : PacingController::kMinSleepTime);
628
Erik Språngd05edec2019-08-14 10:43:47 +0200629 EXPECT_EQ(0u, pacer_->QueueSizePackets());
630 clock_.AdvanceTime(TimeUntilNextProcess());
631 EXPECT_EQ(0u, pacer_->QueueSizePackets());
632 pacer_->ProcessPackets();
633
Erik Språngeb487992019-11-14 14:15:15 +0100634 // Send some more packet, just show that we can..?
Erik Språngd05edec2019-08-14 10:43:47 +0200635 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
636 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
637 clock_.TimeInMilliseconds(), 250);
638 }
Erik Språngeb487992019-11-14 14:15:15 +0100639 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
640 if (PeriodicProcess()) {
641 pacer_->ProcessPackets();
642 } else {
643 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
644 AdvanceTimeAndProcess();
645 }
646 }
647 EXPECT_EQ(0u, pacer_->QueueSizePackets());
Erik Språngd05edec2019-08-14 10:43:47 +0200648}
649
Erik Språngeb487992019-11-14 14:15:15 +0100650TEST_P(PacingControllerTest, RepeatedRetransmissionsAllowed) {
Erik Språngd05edec2019-08-14 10:43:47 +0200651 // Send one packet, then two retransmissions of that packet.
652 for (size_t i = 0; i < 3; i++) {
653 constexpr uint32_t ssrc = 333;
654 constexpr uint16_t sequence_number = 444;
655 constexpr size_t bytes = 250;
656 bool is_retransmission = (i != 0); // Original followed by retransmissions.
657 SendAndExpectPacket(
658 is_retransmission ? RtpPacketToSend::Type::kRetransmission
659 : RtpPacketToSend::Type::kVideo,
660 ssrc, sequence_number, clock_.TimeInMilliseconds(), bytes);
661 clock_.AdvanceTimeMilliseconds(5);
662 }
Erik Språngeb487992019-11-14 14:15:15 +0100663 if (PeriodicProcess()) {
664 pacer_->ProcessPackets();
665 } else {
666 while (pacer_->QueueSizePackets() > 0) {
667 AdvanceTimeAndProcess();
668 }
669 }
Erik Språngd05edec2019-08-14 10:43:47 +0200670}
671
Erik Språngeb487992019-11-14 14:15:15 +0100672TEST_P(PacingControllerTest,
Erik Språngd05edec2019-08-14 10:43:47 +0200673 CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
674 uint32_t ssrc = 12345;
675 uint16_t sequence_number = 1234;
676
677 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
678 clock_.TimeInMilliseconds(), 250);
679
680 // Expect packet on second ssrc to be queued and sent as well.
681 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc + 1, sequence_number,
682 clock_.TimeInMilliseconds(), 250);
683
684 clock_.AdvanceTimeMilliseconds(1000);
Erik Språngeb487992019-11-14 14:15:15 +0100685 if (PeriodicProcess()) {
686 pacer_->ProcessPackets();
687 } else {
688 while (pacer_->QueueSizePackets() > 0) {
689 AdvanceTimeAndProcess();
690 }
691 }
Erik Språngd05edec2019-08-14 10:43:47 +0200692}
693
Erik Språngeb487992019-11-14 14:15:15 +0100694TEST_P(PacingControllerTest, Padding) {
Erik Språngd05edec2019-08-14 10:43:47 +0200695 uint32_t ssrc = 12345;
696 uint16_t sequence_number = 1234;
Erik Språngeb487992019-11-14 14:15:15 +0100697 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200698
699 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
700
Erik Språngeb487992019-11-14 14:15:15 +0100701 if (PeriodicProcess()) {
702 ConsumeInitialBudget();
703
704 // 5 milliseconds later should not send padding since we filled the buffers
705 // initially.
706 EXPECT_CALL(callback_, SendPadding(kPacketSize)).Times(0);
707 clock_.AdvanceTime(TimeUntilNextProcess());
708 pacer_->ProcessPackets();
709
710 // 5 milliseconds later we have enough budget to send some padding.
711 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(kPacketSize));
712 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
713 clock_.AdvanceTime(TimeUntilNextProcess());
714 pacer_->ProcessPackets();
715 } else {
716 const size_t kPacketsToSend = 20;
717 for (size_t i = 0; i < kPacketsToSend; ++i) {
718 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc,
719 sequence_number++, clock_.TimeInMilliseconds(),
720 kPacketSize);
721 }
722 const TimeDelta expected_pace_time =
723 DataSize::bytes(pacer_->QueueSizePackets() * kPacketSize) /
724 (kPaceMultiplier * kTargetRate);
725 EXPECT_CALL(callback_, SendPadding).Times(0);
726 // Only the media packets should be sent.
727 Timestamp start_time = clock_.CurrentTime();
728 while (pacer_->QueueSizePackets() > 0) {
729 AdvanceTimeAndProcess();
730 }
731 const TimeDelta actual_pace_time = clock_.CurrentTime() - start_time;
732 EXPECT_LE((actual_pace_time - expected_pace_time).Abs(),
733 PacingController::kMinSleepTime);
734
Erik Språngb1ccae22019-11-25 18:22:09 +0100735 // Pacing media happens at 2.5x, but padding was configured with 1.0x
Erik Språngeb487992019-11-14 14:15:15 +0100736 // factor. We have to wait until the padding debt is gone before we start
737 // sending padding.
738 const TimeDelta time_to_padding_debt_free =
739 (expected_pace_time * kPaceMultiplier) - actual_pace_time;
Erik Språngb1ccae22019-11-25 18:22:09 +0100740 clock_.AdvanceTime(time_to_padding_debt_free -
741 PacingController::kMinSleepTime);
742 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +0100743
744 // Send 10 padding packets.
745 const size_t kPaddingPacketsToSend = 10;
746 DataSize padding_sent = DataSize::Zero();
Erik Språngb1ccae22019-11-25 18:22:09 +0100747 size_t packets_sent = 0;
748 Timestamp first_send_time = Timestamp::MinusInfinity();
749 Timestamp last_send_time = Timestamp::MinusInfinity();
750
Erik Språngeb487992019-11-14 14:15:15 +0100751 EXPECT_CALL(callback_, SendPadding)
752 .Times(kPaddingPacketsToSend)
753 .WillRepeatedly([&](size_t target_size) {
Erik Språngb1ccae22019-11-25 18:22:09 +0100754 ++packets_sent;
755 if (packets_sent < kPaddingPacketsToSend) {
756 // Don't count bytes of last packet, instead just
757 // use this as the time the last packet finished
758 // sending.
759 padding_sent += DataSize::bytes(target_size);
760 }
761 if (first_send_time.IsInfinite()) {
762 first_send_time = clock_.CurrentTime();
763 } else {
764 last_send_time = clock_.CurrentTime();
765 }
Erik Språngeb487992019-11-14 14:15:15 +0100766 return target_size;
767 });
768 EXPECT_CALL(callback_, SendPacket(_, _, _, false, true))
769 .Times(kPaddingPacketsToSend);
Erik Språngb1ccae22019-11-25 18:22:09 +0100770
771 while (packets_sent < kPaddingPacketsToSend) {
Erik Språngeb487992019-11-14 14:15:15 +0100772 AdvanceTimeAndProcess();
773 }
774
775 // Verify rate of sent padding.
Erik Språngb1ccae22019-11-25 18:22:09 +0100776 TimeDelta padding_duration = last_send_time - first_send_time;
Erik Språngeb487992019-11-14 14:15:15 +0100777 DataRate padding_rate = padding_sent / padding_duration;
778 EXPECT_EQ(padding_rate, kTargetRate);
Erik Språngd05edec2019-08-14 10:43:47 +0200779 }
Erik Språngd05edec2019-08-14 10:43:47 +0200780}
781
Erik Språngeb487992019-11-14 14:15:15 +0100782TEST_P(PacingControllerTest, NoPaddingBeforeNormalPacket) {
Erik Språngd05edec2019-08-14 10:43:47 +0200783 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
784
785 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +0100786
Erik Språngd05edec2019-08-14 10:43:47 +0200787 pacer_->ProcessPackets();
788 clock_.AdvanceTime(TimeUntilNextProcess());
789
790 pacer_->ProcessPackets();
791 clock_.AdvanceTime(TimeUntilNextProcess());
792
793 uint32_t ssrc = 12345;
794 uint16_t sequence_number = 1234;
795 int64_t capture_time_ms = 56789;
796
797 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
798 capture_time_ms, 250);
Erik Språngb1ccae22019-11-25 18:22:09 +0100799 bool padding_sent = false;
800 EXPECT_CALL(callback_, SendPadding).WillOnce([&](size_t padding) {
801 padding_sent = true;
Erik Språngeb487992019-11-14 14:15:15 +0100802 return padding;
803 });
Erik Språngf5815fa2019-08-21 14:27:31 +0200804 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100805 if (PeriodicProcess()) {
806 pacer_->ProcessPackets();
807 } else {
Erik Språngb1ccae22019-11-25 18:22:09 +0100808 while (!padding_sent) {
809 AdvanceTimeAndProcess();
810 }
Erik Språngeb487992019-11-14 14:15:15 +0100811 }
Erik Språngd05edec2019-08-14 10:43:47 +0200812}
813
Erik Språngeb487992019-11-14 14:15:15 +0100814TEST_P(PacingControllerTest, VerifyPaddingUpToBitrate) {
815 if (!PeriodicProcess()) {
816 // Already tested in PacingControllerTest.Padding.
817 return;
818 }
819
Erik Språngd05edec2019-08-14 10:43:47 +0200820 uint32_t ssrc = 12345;
821 uint16_t sequence_number = 1234;
822 int64_t capture_time_ms = 56789;
823 const int kTimeStep = 5;
824 const int64_t kBitrateWindow = 100;
825 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
826
827 int64_t start_time = clock_.TimeInMilliseconds();
828 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
829 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
830 capture_time_ms, 250);
831 EXPECT_CALL(callback_, SendPadding(250)).WillOnce(Return(250));
Erik Språngf5815fa2019-08-21 14:27:31 +0200832 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +0200833 pacer_->ProcessPackets();
834 clock_.AdvanceTimeMilliseconds(kTimeStep);
835 }
836}
837
Erik Språngeb487992019-11-14 14:15:15 +0100838TEST_P(PacingControllerTest, VerifyAverageBitrateVaryingMediaPayload) {
Erik Språngd05edec2019-08-14 10:43:47 +0200839 uint32_t ssrc = 12345;
840 uint16_t sequence_number = 1234;
841 int64_t capture_time_ms = 56789;
842 const int kTimeStep = 5;
Erik Språngeb487992019-11-14 14:15:15 +0100843 const TimeDelta kAveragingWindowLength = TimeDelta::seconds(10);
Erik Språngd05edec2019-08-14 10:43:47 +0200844 PacingControllerPadding callback;
Erik Språngeb487992019-11-14 14:15:15 +0100845 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
846 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +0200847 pacer_->SetProbingEnabled(false);
848 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
849
Erik Språngeb487992019-11-14 14:15:15 +0100850 Timestamp start_time = clock_.CurrentTime();
Erik Språngd05edec2019-08-14 10:43:47 +0200851 size_t media_bytes = 0;
Erik Språngeb487992019-11-14 14:15:15 +0100852 while (clock_.CurrentTime() - start_time < kAveragingWindowLength) {
853 // Maybe add some new media packets corresponding to expected send rate.
Erik Språngd05edec2019-08-14 10:43:47 +0200854 int rand_value = rand(); // NOLINT (rand_r instead of rand)
Erik Språngeb487992019-11-14 14:15:15 +0100855 while (
856 media_bytes <
857 (kTargetRate * (clock_.CurrentTime() - start_time)).bytes<size_t>()) {
858 size_t media_payload = rand_value % 400 + 800; // [400, 1200] bytes.
859 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
860 capture_time_ms, media_payload);
861 media_bytes += media_payload;
862 }
863
864 if (PeriodicProcess()) {
865 clock_.AdvanceTimeMilliseconds(kTimeStep);
866 pacer_->ProcessPackets();
867 } else {
868 AdvanceTimeAndProcess();
869 }
Erik Språngd05edec2019-08-14 10:43:47 +0200870 }
Erik Språngeb487992019-11-14 14:15:15 +0100871
872 EXPECT_NEAR(
873 kTargetRate.bps(),
874 (DataSize::bytes(callback.total_bytes_sent()) / kAveragingWindowLength)
875 .bps(),
876 (kTargetRate * 0.01 /* 1% error marging */).bps());
Erik Språngd05edec2019-08-14 10:43:47 +0200877}
878
Erik Språngeb487992019-11-14 14:15:15 +0100879TEST_P(PacingControllerTest, Priority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200880 uint32_t ssrc_low_priority = 12345;
881 uint32_t ssrc = 12346;
882 uint16_t sequence_number = 1234;
883 int64_t capture_time_ms = 56789;
884 int64_t capture_time_ms_low_priority = 1234567;
885
Erik Språngeb487992019-11-14 14:15:15 +0100886 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +0200887
888 // Expect normal and low priority to be queued and high to pass through.
889 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
890 capture_time_ms_low_priority, 250);
891
Erik Språngeb487992019-11-14 14:15:15 +0100892 const size_t packets_to_send_per_interval =
893 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +0200894 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
895 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
896 capture_time_ms, 250);
897 }
898 Send(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++, capture_time_ms,
899 250);
900
901 // Expect all high and normal priority to be sent out first.
902 EXPECT_CALL(callback_, SendPadding).Times(0);
903 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
904 .Times(packets_to_send_per_interval + 1);
905
Erik Språngeb487992019-11-14 14:15:15 +0100906 if (PeriodicProcess()) {
907 clock_.AdvanceTime(TimeUntilNextProcess());
908 pacer_->ProcessPackets();
909 } else {
910 while (pacer_->QueueSizePackets() > 1) {
911 AdvanceTimeAndProcess();
912 }
913 }
914
Erik Språngd05edec2019-08-14 10:43:47 +0200915 EXPECT_EQ(1u, pacer_->QueueSizePackets());
916
917 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
918 capture_time_ms_low_priority, _, _))
919 .Times(1);
Erik Språngeb487992019-11-14 14:15:15 +0100920 if (PeriodicProcess()) {
921 clock_.AdvanceTime(TimeUntilNextProcess());
922 pacer_->ProcessPackets();
923 } else {
924 AdvanceTimeAndProcess();
925 }
Erik Språngd05edec2019-08-14 10:43:47 +0200926}
927
Erik Språngeb487992019-11-14 14:15:15 +0100928TEST_P(PacingControllerTest, RetransmissionPriority) {
Erik Språngd05edec2019-08-14 10:43:47 +0200929 uint32_t ssrc = 12345;
930 uint16_t sequence_number = 1234;
931 int64_t capture_time_ms = 45678;
932 int64_t capture_time_ms_retransmission = 56789;
933
934 // Due to the multiplicative factor we can send 5 packets during a send
935 // interval. (network capacity * multiplier / (8 bits per byte *
936 // (packet size * #send intervals per second)
937 const size_t packets_to_send_per_interval =
938 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
939 pacer_->ProcessPackets();
940 EXPECT_EQ(0u, pacer_->QueueSizePackets());
941
942 // Alternate retransmissions and normal packets.
943 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
944 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
945 capture_time_ms, 250);
946 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
947 capture_time_ms_retransmission, 250);
948 }
949 EXPECT_EQ(2 * packets_to_send_per_interval, pacer_->QueueSizePackets());
950
951 // Expect all retransmissions to be sent out first despite having a later
952 // capture time.
953 EXPECT_CALL(callback_, SendPadding).Times(0);
954 EXPECT_CALL(callback_, SendPacket(_, _, _, false, _)).Times(0);
955 EXPECT_CALL(callback_,
956 SendPacket(ssrc, _, capture_time_ms_retransmission, true, _))
957 .Times(packets_to_send_per_interval);
958
Erik Språngeb487992019-11-14 14:15:15 +0100959 if (PeriodicProcess()) {
960 clock_.AdvanceTime(TimeUntilNextProcess());
961 pacer_->ProcessPackets();
962 } else {
963 while (pacer_->QueueSizePackets() > packets_to_send_per_interval) {
964 AdvanceTimeAndProcess();
965 }
966 }
Erik Språngd05edec2019-08-14 10:43:47 +0200967 EXPECT_EQ(packets_to_send_per_interval, pacer_->QueueSizePackets());
968
969 // Expect the remaining (non-retransmission) packets to be sent.
970 EXPECT_CALL(callback_, SendPadding).Times(0);
971 EXPECT_CALL(callback_, SendPacket(_, _, _, true, _)).Times(0);
972 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, false, _))
973 .Times(packets_to_send_per_interval);
974
Erik Språngeb487992019-11-14 14:15:15 +0100975 if (PeriodicProcess()) {
976 clock_.AdvanceTime(TimeUntilNextProcess());
977 pacer_->ProcessPackets();
978 } else {
979 while (pacer_->QueueSizePackets() > 0) {
980 AdvanceTimeAndProcess();
981 }
982 }
Erik Språngd05edec2019-08-14 10:43:47 +0200983
984 EXPECT_EQ(0u, pacer_->QueueSizePackets());
985}
986
Erik Språngeb487992019-11-14 14:15:15 +0100987TEST_P(PacingControllerTest, HighPrioDoesntAffectBudget) {
988 const size_t kPacketSize = 250;
Erik Språngd05edec2019-08-14 10:43:47 +0200989 uint32_t ssrc = 12346;
990 uint16_t sequence_number = 1234;
991 int64_t capture_time_ms = 56789;
992
993 // As high prio packets doesn't affect the budget, we should be able to send
994 // a high number of them at once.
Erik Språngeb487992019-11-14 14:15:15 +0100995 const size_t kNumAudioPackets = 25;
996 for (size_t i = 0; i < kNumAudioPackets; ++i) {
Erik Språngd05edec2019-08-14 10:43:47 +0200997 SendAndExpectPacket(RtpPacketToSend::Type::kAudio, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +0100998 capture_time_ms, kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +0200999 }
1000 pacer_->ProcessPackets();
1001 // Low prio packets does affect the budget.
1002 // Due to the multiplicative factor we can send 5 packets during a send
1003 // interval. (network capacity * multiplier / (8 bits per byte *
1004 // (packet size * #send intervals per second)
Erik Språngeb487992019-11-14 14:15:15 +01001005 const size_t kPacketsToSendPerInterval =
1006 kTargetRate.bps() * kPaceMultiplier / (8 * kPacketSize * 200);
1007 for (size_t i = 0; i < kPacketsToSendPerInterval; ++i) {
Erik Språngd05edec2019-08-14 10:43:47 +02001008 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
Erik Språngeb487992019-11-14 14:15:15 +01001009 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngd05edec2019-08-14 10:43:47 +02001010 }
Erik Språngeb487992019-11-14 14:15:15 +01001011
1012 // Send all packets and measure pace time.
1013 Timestamp start_time = clock_.CurrentTime();
1014 while (pacer_->QueueSizePackets() > 0) {
1015 if (PeriodicProcess()) {
1016 clock_.AdvanceTime(TimeUntilNextProcess());
1017 pacer_->ProcessPackets();
1018 } else {
1019 AdvanceTimeAndProcess();
1020 }
1021 }
1022
1023 // Measure pacing time. Expect only low-prio packets to affect this.
1024 TimeDelta pacing_time = clock_.CurrentTime() - start_time;
1025 TimeDelta expected_pacing_time =
1026 DataSize::bytes(kPacketsToSendPerInterval * kPacketSize) /
1027 (kTargetRate * kPaceMultiplier);
1028 EXPECT_NEAR(pacing_time.us<double>(), expected_pacing_time.us<double>(),
1029 PeriodicProcess() ? 5000.0
1030 : PacingController::kMinSleepTime.us<double>());
Erik Språngd05edec2019-08-14 10:43:47 +02001031}
1032
Erik Språngeb487992019-11-14 14:15:15 +01001033TEST_P(PacingControllerTest, SendsOnlyPaddingWhenCongested) {
Erik Språngd05edec2019-08-14 10:43:47 +02001034 uint32_t ssrc = 202020;
1035 uint16_t sequence_number = 1000;
1036 int kPacketSize = 250;
1037 int kCongestionWindow = kPacketSize * 10;
1038
1039 pacer_->UpdateOutstandingData(DataSize::Zero());
1040 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
1041 int sent_data = 0;
1042 while (sent_data < kCongestionWindow) {
1043 sent_data += kPacketSize;
1044 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1045 clock_.TimeInMilliseconds(), kPacketSize);
Erik Språngeb487992019-11-14 14:15:15 +01001046 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001047 }
1048 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1049 EXPECT_CALL(callback_, SendPacket).Times(0);
1050 EXPECT_CALL(callback_, SendPadding).Times(0);
1051
1052 size_t blocked_packets = 0;
1053 int64_t expected_time_until_padding = 500;
1054 while (expected_time_until_padding > 5) {
1055 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1056 clock_.TimeInMilliseconds(), kPacketSize);
1057 blocked_packets++;
1058 clock_.AdvanceTimeMilliseconds(5);
1059 pacer_->ProcessPackets();
1060 expected_time_until_padding -= 5;
1061 }
1062 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1063 EXPECT_CALL(callback_, SendPadding(1)).WillOnce(Return(1));
Erik Språngf5815fa2019-08-21 14:27:31 +02001064 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001065 clock_.AdvanceTimeMilliseconds(5);
1066 pacer_->ProcessPackets();
1067 EXPECT_EQ(blocked_packets, pacer_->QueueSizePackets());
1068}
1069
Erik Språngeb487992019-11-14 14:15:15 +01001070TEST_P(PacingControllerTest, DoesNotAllowOveruseAfterCongestion) {
Erik Språngd05edec2019-08-14 10:43:47 +02001071 uint32_t ssrc = 202020;
1072 uint16_t seq_num = 1000;
1073 int size = 1000;
1074 auto now_ms = [this] { return clock_.TimeInMilliseconds(); };
1075 EXPECT_CALL(callback_, SendPadding).Times(0);
1076 // The pacing rate is low enough that the budget should not allow two packets
1077 // to be sent in a row.
1078 pacer_->SetPacingRates(DataRate::bps(400 * 8 * 1000 / 5), DataRate::Zero());
1079 // The congestion window is small enough to only let one packet through.
1080 pacer_->SetCongestionWindow(DataSize::bytes(800));
1081 pacer_->UpdateOutstandingData(DataSize::Zero());
1082 // Not yet budget limited or congested, packet is sent.
1083 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
1084 EXPECT_CALL(callback_, SendPacket).Times(1);
1085 clock_.AdvanceTimeMilliseconds(5);
1086 pacer_->ProcessPackets();
1087 // Packet blocked due to congestion.
1088 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
1089 EXPECT_CALL(callback_, SendPacket).Times(0);
1090 clock_.AdvanceTimeMilliseconds(5);
1091 pacer_->ProcessPackets();
1092 // Packet blocked due to congestion.
1093 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
1094 EXPECT_CALL(callback_, SendPacket).Times(0);
1095 clock_.AdvanceTimeMilliseconds(5);
1096 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001097 // Congestion removed and budget has recovered, packet is sent.
1098 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
1099 EXPECT_CALL(callback_, SendPacket).Times(1);
1100 clock_.AdvanceTimeMilliseconds(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001101 pacer_->UpdateOutstandingData(DataSize::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001102 pacer_->ProcessPackets();
Erik Språngd05edec2019-08-14 10:43:47 +02001103 // Should be blocked due to budget limitation as congestion has be removed.
1104 Send(RtpPacketToSend::Type::kVideo, ssrc, seq_num++, now_ms(), size);
1105 EXPECT_CALL(callback_, SendPacket).Times(0);
1106 clock_.AdvanceTimeMilliseconds(5);
1107 pacer_->ProcessPackets();
1108}
1109
Erik Språngeb487992019-11-14 14:15:15 +01001110TEST_P(PacingControllerTest, ResumesSendingWhenCongestionEnds) {
Erik Språngd05edec2019-08-14 10:43:47 +02001111 uint32_t ssrc = 202020;
1112 uint16_t sequence_number = 1000;
1113 int64_t kPacketSize = 250;
1114 int64_t kCongestionCount = 10;
1115 int64_t kCongestionWindow = kPacketSize * kCongestionCount;
1116 int64_t kCongestionTimeMs = 1000;
1117
1118 pacer_->UpdateOutstandingData(DataSize::Zero());
1119 pacer_->SetCongestionWindow(DataSize::bytes(kCongestionWindow));
1120 int sent_data = 0;
1121 while (sent_data < kCongestionWindow) {
1122 sent_data += kPacketSize;
1123 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1124 clock_.TimeInMilliseconds(), kPacketSize);
1125 clock_.AdvanceTimeMilliseconds(5);
1126 pacer_->ProcessPackets();
1127 }
1128 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1129 EXPECT_CALL(callback_, SendPacket).Times(0);
1130 int unacked_packets = 0;
1131 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1132 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1133 clock_.TimeInMilliseconds(), kPacketSize);
1134 unacked_packets++;
1135 clock_.AdvanceTimeMilliseconds(5);
1136 pacer_->ProcessPackets();
1137 }
1138 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1139
1140 // First mark half of the congested packets as cleared and make sure that just
1141 // as many are sent
1142 int ack_count = kCongestionCount / 2;
1143 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _)).Times(ack_count);
1144 pacer_->UpdateOutstandingData(
1145 DataSize::bytes(kCongestionWindow - kPacketSize * ack_count));
1146
1147 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1148 clock_.AdvanceTimeMilliseconds(5);
1149 pacer_->ProcessPackets();
1150 }
1151 unacked_packets -= ack_count;
1152 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1153
1154 // Second make sure all packets are sent if sent packets are continuously
1155 // marked as acked.
1156 EXPECT_CALL(callback_, SendPacket(ssrc, _, _, false, _))
1157 .Times(unacked_packets);
1158 for (int duration = 0; duration < kCongestionTimeMs; duration += 5) {
1159 pacer_->UpdateOutstandingData(DataSize::Zero());
1160 clock_.AdvanceTimeMilliseconds(5);
1161 pacer_->ProcessPackets();
1162 }
1163}
1164
Erik Språngeb487992019-11-14 14:15:15 +01001165TEST_P(PacingControllerTest, Pause) {
Erik Språngd05edec2019-08-14 10:43:47 +02001166 uint32_t ssrc_low_priority = 12345;
1167 uint32_t ssrc = 12346;
1168 uint32_t ssrc_high_priority = 12347;
1169 uint16_t sequence_number = 1234;
Erik Språngd05edec2019-08-14 10:43:47 +02001170
1171 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1172
Erik Språngeb487992019-11-14 14:15:15 +01001173 ConsumeInitialBudget();
Erik Språngd05edec2019-08-14 10:43:47 +02001174
1175 pacer_->Pause();
1176
Erik Språngeb487992019-11-14 14:15:15 +01001177 int64_t capture_time_ms = clock_.TimeInMilliseconds();
1178 const size_t packets_to_send_per_interval =
1179 kTargetRate.bps() * kPaceMultiplier / (8 * 250 * 200);
Erik Språngd05edec2019-08-14 10:43:47 +02001180 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1181 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
1182 capture_time_ms, 250);
1183 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
1184 capture_time_ms, 250);
1185 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
1186 capture_time_ms, 250);
1187 }
1188 clock_.AdvanceTimeMilliseconds(10000);
1189 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
1190 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1191 Send(RtpPacketToSend::Type::kVideo, ssrc_low_priority, sequence_number++,
1192 second_capture_time_ms, 250);
1193 Send(RtpPacketToSend::Type::kRetransmission, ssrc, sequence_number++,
1194 second_capture_time_ms, 250);
1195 Send(RtpPacketToSend::Type::kAudio, ssrc_high_priority, sequence_number++,
1196 second_capture_time_ms, 250);
1197 }
1198
1199 // Expect everything to be queued.
1200 EXPECT_EQ(TimeDelta::ms(second_capture_time_ms - capture_time_ms),
1201 pacer_->OldestPacketWaitTime());
1202
Erik Språngeb487992019-11-14 14:15:15 +01001203 // Process triggers keep-alive packet.
1204 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1205 return padding;
1206 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001207 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngd05edec2019-08-14 10:43:47 +02001208 pacer_->ProcessPackets();
1209
Erik Språngeb487992019-11-14 14:15:15 +01001210 // Verify no packets sent for the rest of the paused process interval.
1211 const TimeDelta kProcessInterval = TimeDelta::ms(5);
1212 TimeDelta expected_time_until_send = PacingController::kPausedProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001213 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001214 while (expected_time_until_send >= kProcessInterval) {
Erik Språngd05edec2019-08-14 10:43:47 +02001215 pacer_->ProcessPackets();
Erik Språngeb487992019-11-14 14:15:15 +01001216 clock_.AdvanceTime(kProcessInterval);
1217 expected_time_until_send -= kProcessInterval;
Erik Språngd05edec2019-08-14 10:43:47 +02001218 }
1219
Erik Språngeb487992019-11-14 14:15:15 +01001220 // New keep-alive packet.
Erik Språngd05edec2019-08-14 10:43:47 +02001221 ::testing::Mock::VerifyAndClearExpectations(&callback_);
Erik Språngeb487992019-11-14 14:15:15 +01001222 EXPECT_CALL(callback_, SendPadding).WillOnce([](size_t padding) {
1223 return padding;
1224 });
Erik Språngf5815fa2019-08-21 14:27:31 +02001225 EXPECT_CALL(callback_, SendPacket(_, _, _, _, true)).Times(1);
Erik Språngeb487992019-11-14 14:15:15 +01001226 clock_.AdvanceTime(kProcessInterval);
Erik Språngd05edec2019-08-14 10:43:47 +02001227 pacer_->ProcessPackets();
1228 ::testing::Mock::VerifyAndClearExpectations(&callback_);
1229
1230 // Expect high prio packets to come out first followed by normal
1231 // prio packets and low prio packets (all in capture order).
1232 {
1233 ::testing::InSequence sequence;
1234 EXPECT_CALL(callback_,
1235 SendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
1236 .Times(packets_to_send_per_interval);
1237 EXPECT_CALL(callback_,
1238 SendPacket(ssrc_high_priority, _, second_capture_time_ms, _, _))
1239 .Times(packets_to_send_per_interval);
1240
1241 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1242 EXPECT_CALL(callback_, SendPacket(ssrc, _, capture_time_ms, _, _))
1243 .Times(1);
1244 }
1245 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1246 EXPECT_CALL(callback_, SendPacket(ssrc, _, second_capture_time_ms, _, _))
1247 .Times(1);
1248 }
1249 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1250 EXPECT_CALL(callback_,
1251 SendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
1252 .Times(1);
1253 }
1254 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
1255 EXPECT_CALL(callback_, SendPacket(ssrc_low_priority, _,
1256 second_capture_time_ms, _, _))
1257 .Times(1);
1258 }
1259 }
1260 pacer_->Resume();
1261
Erik Språngeb487992019-11-14 14:15:15 +01001262 if (PeriodicProcess()) {
1263 // The pacer was resumed directly after the previous process call finished.
1264 // It will therefore wait 5 ms until next process.
Erik Språngd05edec2019-08-14 10:43:47 +02001265 clock_.AdvanceTime(TimeUntilNextProcess());
Erik Språngeb487992019-11-14 14:15:15 +01001266
1267 for (size_t i = 0; i < 4; i++) {
1268 pacer_->ProcessPackets();
1269 clock_.AdvanceTime(TimeUntilNextProcess());
1270 }
1271 } else {
1272 while (pacer_->QueueSizePackets() > 0) {
1273 AdvanceTimeAndProcess();
1274 }
Erik Språngd05edec2019-08-14 10:43:47 +02001275 }
1276
1277 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1278}
1279
Erik Språngeb487992019-11-14 14:15:15 +01001280TEST_P(PacingControllerTest, InactiveFromStart) {
1281 // Recreate the pacer without the inital time forwarding.
1282 pacer_ = std::make_unique<PacingController>(&clock_, &callback_, nullptr,
1283 nullptr, GetParam());
1284 pacer_->SetProbingEnabled(false);
1285 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1286
1287 if (PeriodicProcess()) {
1288 // In period mode, pause the pacer to check the same idle behavior as
1289 // dynamic.
1290 pacer_->Pause();
1291 }
1292
1293 // No packets sent, there should be no keep-alives sent either.
1294 EXPECT_CALL(callback_, SendPadding).Times(0);
1295 EXPECT_CALL(callback_, SendPacket).Times(0);
1296 pacer_->ProcessPackets();
1297
1298 const Timestamp start_time = clock_.CurrentTime();
1299
1300 // Determine the margin need so we can advance to the last possible moment
1301 // that will not cause a process event.
1302 const TimeDelta time_margin =
1303 (GetParam() == PacingController::ProcessMode::kDynamic
1304 ? PacingController::kMinSleepTime
1305 : TimeDelta::Zero()) +
1306 TimeDelta::us(1);
1307
1308 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1309 PacingController::kPausedProcessInterval);
1310 clock_.AdvanceTime(PacingController::kPausedProcessInterval - time_margin);
1311 pacer_->ProcessPackets();
1312 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1313 PacingController::kPausedProcessInterval);
1314
1315 clock_.AdvanceTime(time_margin);
1316 pacer_->ProcessPackets();
1317 EXPECT_EQ(pacer_->NextSendTime() - start_time,
1318 2 * PacingController::kPausedProcessInterval);
1319}
1320
1321TEST_P(PacingControllerTest, ExpectedQueueTimeMs) {
Erik Språngd05edec2019-08-14 10:43:47 +02001322 uint32_t ssrc = 12346;
1323 uint16_t sequence_number = 1234;
1324 const size_t kNumPackets = 60;
1325 const size_t kPacketSize = 1200;
1326 const int32_t kMaxBitrate = kPaceMultiplier * 30000;
1327 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1328
1329 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1330 DataRate::Zero());
1331 for (size_t i = 0; i < kNumPackets; ++i) {
1332 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1333 clock_.TimeInMilliseconds(), kPacketSize);
1334 }
1335
1336 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
1337 TimeDelta queue_time =
1338 TimeDelta::ms(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
1339 EXPECT_EQ(queue_time, pacer_->ExpectedQueueTime());
1340
1341 const Timestamp time_start = clock_.CurrentTime();
1342 while (pacer_->QueueSizePackets() > 0) {
1343 clock_.AdvanceTime(TimeUntilNextProcess());
1344 pacer_->ProcessPackets();
1345 }
1346 TimeDelta duration = clock_.CurrentTime() - time_start;
1347
1348 EXPECT_EQ(TimeDelta::Zero(), pacer_->ExpectedQueueTime());
1349
1350 // Allow for aliasing, duration should be within one pack of max time limit.
1351 const TimeDelta deviation =
1352 duration - PacingController::kMaxExpectedQueueLength;
1353 EXPECT_LT(deviation.Abs(),
1354 TimeDelta::ms(1000 * kPacketSize * 8 / kMaxBitrate));
1355}
1356
Erik Språngeb487992019-11-14 14:15:15 +01001357TEST_P(PacingControllerTest, QueueTimeGrowsOverTime) {
Erik Språngd05edec2019-08-14 10:43:47 +02001358 uint32_t ssrc = 12346;
1359 uint16_t sequence_number = 1234;
1360 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1361
1362 pacer_->SetPacingRates(DataRate::bps(30000 * kPaceMultiplier),
1363 DataRate::Zero());
1364 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
1365 clock_.TimeInMilliseconds(), 1200);
1366
1367 clock_.AdvanceTimeMilliseconds(500);
1368 EXPECT_EQ(TimeDelta::ms(500), pacer_->OldestPacketWaitTime());
1369 pacer_->ProcessPackets();
1370 EXPECT_EQ(TimeDelta::Zero(), pacer_->OldestPacketWaitTime());
1371}
1372
Erik Språngeb487992019-11-14 14:15:15 +01001373TEST_P(PacingControllerTest, ProbingWithInsertedPackets) {
Erik Språngd05edec2019-08-14 10:43:47 +02001374 const size_t kPacketSize = 1200;
1375 const int kInitialBitrateBps = 300000;
1376 uint32_t ssrc = 12346;
1377 uint16_t sequence_number = 1234;
1378
1379 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001380 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001381 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001382 pacer_->CreateProbeCluster(kFirstClusterRate,
1383 /*cluster_id=*/0);
1384 pacer_->CreateProbeCluster(kSecondClusterRate,
1385 /*cluster_id=*/1);
1386 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1387 DataRate::Zero());
1388
1389 for (int i = 0; i < 10; ++i) {
1390 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1391 clock_.TimeInMilliseconds(), kPacketSize);
1392 }
1393
1394 int64_t start = clock_.TimeInMilliseconds();
1395 while (packet_sender.packets_sent() < 5) {
1396 clock_.AdvanceTime(TimeUntilNextProcess());
1397 pacer_->ProcessPackets();
1398 }
1399 int packets_sent = packet_sender.packets_sent();
1400 // Validate first cluster bitrate. Note that we have to account for number
1401 // of intervals and hence (packets_sent - 1) on the first cluster.
1402 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1403 (clock_.TimeInMilliseconds() - start),
1404 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1405 EXPECT_EQ(0, packet_sender.padding_sent());
1406
1407 clock_.AdvanceTime(TimeUntilNextProcess());
1408 start = clock_.TimeInMilliseconds();
1409 while (packet_sender.packets_sent() < 10) {
1410 clock_.AdvanceTime(TimeUntilNextProcess());
1411 pacer_->ProcessPackets();
1412 }
1413 packets_sent = packet_sender.packets_sent() - packets_sent;
1414 // Validate second cluster bitrate.
1415 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
1416 (clock_.TimeInMilliseconds() - start),
1417 kSecondClusterRate.bps(), kProbingErrorMargin.bps());
1418}
1419
Erik Språngeb487992019-11-14 14:15:15 +01001420TEST_P(PacingControllerTest, SkipsProbesWhenProcessIntervalTooLarge) {
Erik Språngb210eeb2019-11-05 11:21:48 +01001421 const size_t kPacketSize = 1200;
1422 const int kInitialBitrateBps = 300000;
1423 uint32_t ssrc = 12346;
1424 uint16_t sequence_number = 1234;
1425
1426 PacingControllerProbing packet_sender;
1427 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001428 nullptr, GetParam());
Erik Språngb210eeb2019-11-05 11:21:48 +01001429 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1430 DataRate::Zero());
1431
1432 for (int i = 0; i < 10; ++i) {
1433 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1434 clock_.TimeInMilliseconds(), kPacketSize);
1435 }
1436 while (pacer_->QueueSizePackets() > 0) {
1437 clock_.AdvanceTime(TimeUntilNextProcess());
1438 pacer_->ProcessPackets();
1439 }
1440
1441 // Probe at a very high rate.
1442 pacer_->CreateProbeCluster(DataRate::kbps(10000), // 10 Mbps.
1443 /*cluster_id=*/3);
1444 // We need one packet to start the probe.
1445 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1446 clock_.TimeInMilliseconds(), kPacketSize);
1447 const int packets_sent_before_probe = packet_sender.packets_sent();
1448 clock_.AdvanceTime(TimeUntilNextProcess());
1449 pacer_->ProcessPackets();
1450 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 1);
1451
1452 // Figure out how long between probe packets.
1453 Timestamp start_time = clock_.CurrentTime();
1454 clock_.AdvanceTime(TimeUntilNextProcess());
1455 TimeDelta time_between_probes = clock_.CurrentTime() - start_time;
1456 // Advance that distance again + 1ms.
1457 clock_.AdvanceTime(time_between_probes);
1458
1459 // Send second probe packet.
1460 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1461 clock_.TimeInMilliseconds(), kPacketSize);
1462 pacer_->ProcessPackets();
1463 EXPECT_EQ(packet_sender.packets_sent(), packets_sent_before_probe + 2);
1464
1465 // We're exactly where we should be for the next probe.
Erik Språngeb487992019-11-14 14:15:15 +01001466 const Timestamp probe_time = clock_.CurrentTime();
1467 EXPECT_EQ(pacer_->NextSendTime(), clock_.CurrentTime());
Erik Språngb210eeb2019-11-05 11:21:48 +01001468
Erik Språng22fd5d72019-11-07 14:21:05 +01001469 FieldTrialBasedConfig field_trial_config;
1470 BitrateProberConfig probing_config(&field_trial_config);
1471 EXPECT_GT(probing_config.max_probe_delay.Get(), TimeDelta::Zero());
Erik Språngeb487992019-11-14 14:15:15 +01001472 // Advance to within max probe delay, should still return same target.
Erik Språng22fd5d72019-11-07 14:21:05 +01001473 clock_.AdvanceTime(probing_config.max_probe_delay.Get());
Erik Språngeb487992019-11-14 14:15:15 +01001474 EXPECT_EQ(pacer_->NextSendTime(), probe_time);
Erik Språngb210eeb2019-11-05 11:21:48 +01001475
Erik Språng22fd5d72019-11-07 14:21:05 +01001476 // Too high probe delay, drop it!
1477 clock_.AdvanceTime(TimeDelta::us(1));
Erik Språngeb487992019-11-14 14:15:15 +01001478 EXPECT_GT(pacer_->NextSendTime(), probe_time);
Erik Språngb210eeb2019-11-05 11:21:48 +01001479}
1480
Erik Språngeb487992019-11-14 14:15:15 +01001481TEST_P(PacingControllerTest, ProbingWithPaddingSupport) {
Erik Språngd05edec2019-08-14 10:43:47 +02001482 const size_t kPacketSize = 1200;
1483 const int kInitialBitrateBps = 300000;
1484 uint32_t ssrc = 12346;
1485 uint16_t sequence_number = 1234;
1486
1487 PacingControllerProbing packet_sender;
Mirko Bonadei317a1f02019-09-17 17:06:18 +02001488 pacer_ = std::make_unique<PacingController>(&clock_, &packet_sender, nullptr,
Erik Språngeb487992019-11-14 14:15:15 +01001489 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001490 pacer_->CreateProbeCluster(kFirstClusterRate,
1491 /*cluster_id=*/0);
1492 pacer_->SetPacingRates(DataRate::bps(kInitialBitrateBps * kPaceMultiplier),
1493 DataRate::Zero());
1494
1495 for (int i = 0; i < 3; ++i) {
1496 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1497 clock_.TimeInMilliseconds(), kPacketSize);
1498 }
1499
1500 int64_t start = clock_.TimeInMilliseconds();
1501 int process_count = 0;
1502 while (process_count < 5) {
1503 clock_.AdvanceTime(TimeUntilNextProcess());
1504 pacer_->ProcessPackets();
1505 ++process_count;
1506 }
1507 int packets_sent = packet_sender.packets_sent();
1508 int padding_sent = packet_sender.padding_sent();
1509 EXPECT_GT(packets_sent, 0);
1510 EXPECT_GT(padding_sent, 0);
1511 // Note that the number of intervals here for kPacketSize is
1512 // packets_sent due to padding in the same cluster.
1513 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
1514 (clock_.TimeInMilliseconds() - start),
1515 kFirstClusterRate.bps(), kProbingErrorMargin.bps());
1516}
1517
Erik Språngeb487992019-11-14 14:15:15 +01001518TEST_P(PacingControllerTest, PaddingOveruse) {
Erik Språngd05edec2019-08-14 10:43:47 +02001519 uint32_t ssrc = 12346;
1520 uint16_t sequence_number = 1234;
1521 const size_t kPacketSize = 1200;
1522
Erik Språngeb487992019-11-14 14:15:15 +01001523 // Initially no padding rate.
Erik Språngd05edec2019-08-14 10:43:47 +02001524 pacer_->ProcessPackets();
1525 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1526 DataRate::Zero());
1527
1528 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1529 clock_.TimeInMilliseconds(), kPacketSize);
1530 pacer_->ProcessPackets();
1531
1532 // Add 30kbit padding. When increasing budget, media budget will increase from
1533 // negative (overuse) while padding budget will increase from 0.
1534 clock_.AdvanceTimeMilliseconds(5);
1535 pacer_->SetPacingRates(DataRate::bps(60000 * kPaceMultiplier),
1536 DataRate::bps(30000));
1537
1538 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1539 clock_.TimeInMilliseconds(), kPacketSize);
1540 EXPECT_LT(TimeDelta::ms(5), pacer_->ExpectedQueueTime());
1541 // Don't send padding if queue is non-empty, even if padding budget > 0.
1542 EXPECT_CALL(callback_, SendPadding).Times(0);
Erik Språngeb487992019-11-14 14:15:15 +01001543 if (PeriodicProcess()) {
1544 pacer_->ProcessPackets();
1545 } else {
1546 AdvanceTimeAndProcess();
1547 }
Erik Språngd05edec2019-08-14 10:43:47 +02001548}
1549
Erik Språngeb487992019-11-14 14:15:15 +01001550TEST_P(PacingControllerTest, ProbeClusterId) {
Erik Språngd05edec2019-08-14 10:43:47 +02001551 MockPacketSender callback;
1552
Erik Språngeb487992019-11-14 14:15:15 +01001553 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1554 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001555 Init();
1556
1557 uint32_t ssrc = 12346;
1558 uint16_t sequence_number = 1234;
1559 const size_t kPacketSize = 1200;
1560
1561 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, kTargetRate);
1562 pacer_->SetProbingEnabled(true);
1563 for (int i = 0; i < 10; ++i) {
1564 Send(RtpPacketToSend::Type::kVideo, ssrc, sequence_number++,
1565 clock_.TimeInMilliseconds(), kPacketSize);
1566 }
1567
1568 // First probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001569 EXPECT_CALL(callback,
1570 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 0)))
1571 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001572
1573 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001574 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001575 }
1576
1577 // Second probing cluster.
Erik Språngf5815fa2019-08-21 14:27:31 +02001578 EXPECT_CALL(callback,
1579 SendRtpPacket(_, Field(&PacedPacketInfo::probe_cluster_id, 1)))
1580 .Times(5);
Erik Språngd05edec2019-08-14 10:43:47 +02001581
1582 for (int i = 0; i < 5; ++i) {
Erik Språngeb487992019-11-14 14:15:15 +01001583 AdvanceTimeAndProcess();
Erik Språngd05edec2019-08-14 10:43:47 +02001584 }
1585
1586 // Needed for the Field comparer below.
1587 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
1588 // No more probing packets.
Erik Språngf5815fa2019-08-21 14:27:31 +02001589 EXPECT_CALL(callback, GeneratePadding).WillOnce([&](DataSize padding_size) {
1590 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1591 padding_packets.emplace_back(
1592 BuildPacket(RtpPacketToSend::Type::kPadding, ssrc, sequence_number++,
1593 clock_.TimeInMilliseconds(), padding_size.bytes()));
1594 return padding_packets;
1595 });
Erik Språngeb487992019-11-14 14:15:15 +01001596 bool non_probe_packet_seen = false;
1597 EXPECT_CALL(callback, SendRtpPacket)
1598 .WillOnce([&](std::unique_ptr<RtpPacketToSend> packet,
1599 const PacedPacketInfo& cluster_info) {
1600 EXPECT_EQ(cluster_info.probe_cluster_id, kNotAProbe);
1601 non_probe_packet_seen = true;
1602 });
1603 while (!non_probe_packet_seen) {
1604 AdvanceTimeAndProcess();
1605 }
Erik Språngd05edec2019-08-14 10:43:47 +02001606}
1607
Erik Språngeb487992019-11-14 14:15:15 +01001608TEST_P(PacingControllerTest, OwnedPacketPrioritizedOnType) {
Erik Språngd05edec2019-08-14 10:43:47 +02001609 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001610 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1611 nullptr, GetParam());
Erik Språngd05edec2019-08-14 10:43:47 +02001612 Init();
1613
1614 // Insert a packet of each type, from low to high priority. Since priority
1615 // is weighted higher than insert order, these should come out of the pacer
1616 // in backwards order with the exception of FEC and Video.
1617 for (RtpPacketToSend::Type type :
1618 {RtpPacketToSend::Type::kPadding,
1619 RtpPacketToSend::Type::kForwardErrorCorrection,
1620 RtpPacketToSend::Type::kVideo, RtpPacketToSend::Type::kRetransmission,
1621 RtpPacketToSend::Type::kAudio}) {
1622 pacer_->EnqueuePacket(BuildRtpPacket(type));
1623 }
1624
1625 ::testing::InSequence seq;
1626 EXPECT_CALL(
1627 callback,
1628 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kAudioSsrc)), _));
1629 EXPECT_CALL(callback,
1630 SendRtpPacket(
1631 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1632
1633 // FEC and video actually have the same priority, so will come out in
1634 // insertion order.
1635 EXPECT_CALL(callback,
1636 SendRtpPacket(
1637 Pointee(Property(&RtpPacketToSend::Ssrc, kFlexFecSsrc)), _));
1638 EXPECT_CALL(
1639 callback,
1640 SendRtpPacket(Pointee(Property(&RtpPacketToSend::Ssrc, kVideoSsrc)), _));
1641
1642 EXPECT_CALL(callback,
1643 SendRtpPacket(
1644 Pointee(Property(&RtpPacketToSend::Ssrc, kVideoRtxSsrc)), _));
1645
Erik Språngeb487992019-11-14 14:15:15 +01001646 while (pacer_->QueueSizePackets() > 0) {
1647 if (PeriodicProcess()) {
1648 clock_.AdvanceTimeMilliseconds(5);
1649 pacer_->ProcessPackets();
1650 } else {
1651 AdvanceTimeAndProcess();
1652 }
1653 }
Erik Språngd05edec2019-08-14 10:43:47 +02001654}
Erik Språng78c82a42019-10-03 18:46:04 +02001655
Erik Språngeb487992019-11-14 14:15:15 +01001656TEST_P(PacingControllerTest, SmallFirstProbePacket) {
Erik Språng78c82a42019-10-03 18:46:04 +02001657 ScopedFieldTrials trial("WebRTC-Pacer-SmallFirstProbePacket/Enabled/");
1658 MockPacketSender callback;
Erik Språngeb487992019-11-14 14:15:15 +01001659 pacer_ = std::make_unique<PacingController>(&clock_, &callback, nullptr,
1660 nullptr, GetParam());
Erik Språng78c82a42019-10-03 18:46:04 +02001661 pacer_->CreateProbeCluster(kFirstClusterRate, /*cluster_id=*/0);
1662 pacer_->SetPacingRates(kTargetRate * kPaceMultiplier, DataRate::Zero());
1663
1664 // Add high prio media.
1665 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kAudio));
1666
1667 // Expect small padding packet to be requested.
1668 EXPECT_CALL(callback, GeneratePadding(DataSize::bytes(1)))
1669 .WillOnce([&](DataSize padding_size) {
1670 std::vector<std::unique_ptr<RtpPacketToSend>> padding_packets;
1671 padding_packets.emplace_back(
1672 BuildPacket(RtpPacketToSend::Type::kPadding, kAudioSsrc, 1,
1673 clock_.TimeInMilliseconds(), 1));
1674 return padding_packets;
1675 });
1676
1677 size_t packets_sent = 0;
1678 bool media_seen = false;
1679 EXPECT_CALL(callback, SendRtpPacket)
1680 .Times(::testing::AnyNumber())
1681 .WillRepeatedly([&](std::unique_ptr<RtpPacketToSend> packet,
1682 const PacedPacketInfo& cluster_info) {
1683 if (packets_sent == 0) {
1684 EXPECT_EQ(packet->packet_type(), RtpPacketToSend::Type::kPadding);
1685 } else {
1686 if (packet->packet_type() == RtpPacketToSend::Type::kAudio) {
1687 media_seen = true;
1688 }
1689 }
1690 packets_sent++;
1691 });
1692 while (!media_seen) {
1693 pacer_->ProcessPackets();
1694 clock_.AdvanceTimeMilliseconds(5);
1695 }
1696}
Erik Språngeb487992019-11-14 14:15:15 +01001697
Erik Språngeb487992019-11-14 14:15:15 +01001698TEST_P(PacingControllerTest, TaskLate) {
1699 if (PeriodicProcess()) {
1700 // This test applies only when NOT using interval budget.
1701 return;
1702 }
1703
1704 // Set a low send rate to more easily test timing issues.
1705 DataRate kSendRate = DataRate::kbps(30);
1706 pacer_->SetPacingRates(kSendRate, DataRate::Zero());
1707
1708 // Add four packets of equal size and priority.
1709 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kVideo));
1710 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kVideo));
1711 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kVideo));
1712 pacer_->EnqueuePacket(BuildRtpPacket(RtpPacketToSend::Type::kVideo));
1713
1714 // Process packets, only first should be sent.
1715 EXPECT_CALL(callback_, SendPacket).Times(1);
1716 pacer_->ProcessPackets();
1717
1718 Timestamp next_send_time = pacer_->NextSendTime();
1719 const TimeDelta time_between_packets = next_send_time - clock_.CurrentTime();
1720
1721 // Simulate a late process call, executed just before we allow sending the
1722 // fourth packet.
1723 clock_.AdvanceTime((time_between_packets * 3) -
1724 (PacingController::kMinSleepTime + TimeDelta::ms(1)));
1725
1726 EXPECT_CALL(callback_, SendPacket).Times(2);
1727 pacer_->ProcessPackets();
1728
1729 // Check that next scheduled send time is within sleep-time + 1ms.
1730 next_send_time = pacer_->NextSendTime();
1731 EXPECT_LE(next_send_time - clock_.CurrentTime(),
1732 PacingController::kMinSleepTime + TimeDelta::ms(1));
1733
1734 // Advance to within error margin for execution.
1735 clock_.AdvanceTime(TimeDelta::ms(1));
1736 EXPECT_CALL(callback_, SendPacket).Times(1);
1737 pacer_->ProcessPackets();
1738}
1739
Erik Språngae100292019-12-17 17:49:49 +01001740TEST_P(PacingControllerTest, NoProbingWhilePaused) {
1741 uint32_t ssrc = 12345;
1742 uint16_t sequence_number = 1234;
1743
1744 pacer_->SetProbingEnabled(true);
1745
1746 // Send at least one packet so probing can initate.
1747 SendAndExpectPacket(RtpPacketToSend::Type::kVideo, ssrc, sequence_number,
1748 clock_.TimeInMilliseconds(), 250);
1749 while (pacer_->QueueSizePackets() > 0) {
1750 AdvanceTimeAndProcess();
1751 }
1752
1753 // Trigger probing.
1754 pacer_->CreateProbeCluster(DataRate::kbps(10000), // 10 Mbps.
1755 /*cluster_id=*/3);
1756
1757 // Time to next send time should be small.
1758 EXPECT_LT(pacer_->NextSendTime() - clock_.CurrentTime(),
1759 PacingController::kPausedProcessInterval);
1760
1761 // Pause pacer, time to next send time should now be the pause process
1762 // interval.
1763 pacer_->Pause();
1764
1765 EXPECT_EQ(pacer_->NextSendTime() - clock_.CurrentTime(),
1766 PacingController::kPausedProcessInterval);
1767}
1768
Erik Språngeb487992019-11-14 14:15:15 +01001769INSTANTIATE_TEST_SUITE_P(
1770 WithAndWithoutIntervalBudget,
1771 PacingControllerTest,
1772 ::testing::Values(PacingController::ProcessMode::kPeriodic,
1773 PacingController::ProcessMode::kDynamic));
1774
Erik Språngd05edec2019-08-14 10:43:47 +02001775} // namespace test
1776} // namespace webrtc