blob: 4281ec220aaa3e6ffd6fbed0c671966477eae53b [file] [log] [blame]
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000011#include <list>
kwiberg22feaa32016-03-17 09:17:43 -070012#include <memory>
philipelccdfcca2017-10-23 12:42:17 +020013#include <string>
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000014
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/pacing/paced_sender.h"
16#include "system_wrappers/include/clock.h"
philipelccdfcca2017-10-23 12:42:17 +020017#include "system_wrappers/include/field_trial.h"
18#include "test/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "test/gmock.h"
20#include "test/gtest.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000021
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000022using testing::_;
philipelc7bf32a2017-02-17 03:59:43 -080023using testing::Field;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000024using testing::Return;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000025
isheriffcc5903e2016-10-04 08:29:38 -070026namespace {
27constexpr unsigned kFirstClusterBps = 900000;
isheriffcc5903e2016-10-04 08:29:38 -070028constexpr unsigned kSecondClusterBps = 1800000;
isheriffcc5903e2016-10-04 08:29:38 -070029
30// The error stems from truncating the time interval of probe packets to integer
31// values. This results in probing slightly higher than the target bitrate.
32// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
33constexpr int kBitrateProbingError = 150000;
34} // namespace
35
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000036namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000037namespace test {
38
perkjec81bcd2016-05-11 06:01:13 -070039static const int kTargetBitrateBps = 800000;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000040
perkjec81bcd2016-05-11 06:01:13 -070041class MockPacedSenderCallback : public PacedSender::PacketSender {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000042 public:
philipel29dca2c2016-05-13 11:13:05 +020043 MOCK_METHOD5(TimeToSendPacket,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000044 bool(uint32_t ssrc,
45 uint16_t sequence_number,
46 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020047 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080048 const PacedPacketInfo& pacing_info));
49 MOCK_METHOD2(TimeToSendPadding,
50 size_t(size_t bytes, const PacedPacketInfo& pacing_info));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000051};
52
perkjec81bcd2016-05-11 06:01:13 -070053class PacedSenderPadding : public PacedSender::PacketSender {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000054 public:
55 PacedSenderPadding() : padding_sent_(0) {}
56
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000057 bool TimeToSendPacket(uint32_t ssrc,
58 uint16_t sequence_number,
59 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020060 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080061 const PacedPacketInfo& pacing_info) override {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000062 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000063 }
64
philipelc7bf32a2017-02-17 03:59:43 -080065 size_t TimeToSendPadding(size_t bytes,
66 const PacedPacketInfo& pacing_info) override {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000067 const size_t kPaddingPacketSize = 224;
68 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000069 padding_sent_ += kPaddingPacketSize * num_packets;
70 return kPaddingPacketSize * num_packets;
71 }
72
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000073 size_t padding_sent() { return padding_sent_; }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000074
75 private:
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000076 size_t padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000077};
78
perkjec81bcd2016-05-11 06:01:13 -070079class PacedSenderProbing : public PacedSender::PacketSender {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000080 public:
isheriffcc5903e2016-10-04 08:29:38 -070081 PacedSenderProbing() : packets_sent_(0), padding_sent_(0) {}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000082
83 bool TimeToSendPacket(uint32_t ssrc,
84 uint16_t sequence_number,
85 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020086 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080087 const PacedPacketInfo& pacing_info) override {
isheriffcc5903e2016-10-04 08:29:38 -070088 packets_sent_++;
Stefan Holmer01b48882015-05-05 10:21:24 +020089 return true;
90 }
91
philipelc7bf32a2017-02-17 03:59:43 -080092 size_t TimeToSendPadding(size_t bytes,
93 const PacedPacketInfo& pacing_info) override {
isheriffcc5903e2016-10-04 08:29:38 -070094 padding_sent_ += bytes;
95 return padding_sent_;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000096 }
97
98 int packets_sent() const { return packets_sent_; }
99
isheriffcc5903e2016-10-04 08:29:38 -0700100 int padding_sent() const { return padding_sent_; }
101
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000102 private:
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000103 int packets_sent_;
isheriffcc5903e2016-10-04 08:29:38 -0700104 int padding_sent_;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000105};
106
philipelccdfcca2017-10-23 12:42:17 +0200107class PacedSenderTest : public testing::TestWithParam<std::string> {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000108 protected:
philipelccdfcca2017-10-23 12:42:17 +0200109 PacedSenderTest() : clock_(123456), field_trial_(GetParam()) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000110 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000111 // Need to initialize PacedSender after we initialize clock.
philipelc3b3f7a2017-03-29 01:23:13 -0700112 send_bucket_.reset(new PacedSender(&clock_, &callback_, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800113 send_bucket_->CreateProbeCluster(kFirstClusterBps);
114 send_bucket_->CreateProbeCluster(kSecondClusterBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000115 // Default to bitrate probing disabled for testing purposes. Probing tests
116 // have to enable probing, either by creating a new PacedSender instance or
117 // by calling SetProbingEnabled(true).
118 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700119 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
120
121 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000122 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000123
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000124 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000125 uint32_t ssrc,
126 uint16_t sequence_number,
127 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000128 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000129 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200130 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
131 size, retransmission);
philipel29dca2c2016-05-13 11:13:05 +0200132 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
tereliusf39f7d92016-07-20 03:36:19 -0700133 capture_time_ms, retransmission, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000134 .Times(1)
135 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000136 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000137 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000138 MockPacedSenderCallback callback_;
kwiberg22feaa32016-03-17 09:17:43 -0700139 std::unique_ptr<PacedSender> send_bucket_;
philipelccdfcca2017-10-23 12:42:17 +0200140 test::ScopedFieldTrials field_trial_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000141};
142
philipelccdfcca2017-10-23 12:42:17 +0200143INSTANTIATE_TEST_CASE_P(RoundRobin,
144 PacedSenderTest,
145 ::testing::Values("WebRTC-RoundRobinPacing/Disabled/",
146 "WebRTC-RoundRobinPacing/Enabled/"));
147
148TEST_P(PacedSenderTest, FirstSentPacketTimeIsSet) {
asaperssonfc5e81c2017-04-19 23:28:53 -0700149 uint16_t sequence_number = 1234;
150 const uint32_t kSsrc = 12345;
151 const size_t kSizeBytes = 250;
152 const size_t kPacketToSend = 3;
153 const int64_t kStartMs = clock_.TimeInMilliseconds();
154
155 // No packet sent.
156 EXPECT_EQ(-1, send_bucket_->FirstSentPacketTimeMs());
157
158 for (size_t i = 0; i < kPacketToSend; ++i) {
159 SendAndExpectPacket(PacedSender::kNormalPriority, kSsrc, sequence_number++,
160 clock_.TimeInMilliseconds(), kSizeBytes, false);
161 send_bucket_->Process();
162 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
163 }
164 EXPECT_EQ(kStartMs, send_bucket_->FirstSentPacketTimeMs());
165}
166
philipelccdfcca2017-10-23 12:42:17 +0200167TEST_P(PacedSenderTest, QueuePacket) {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000168 uint32_t ssrc = 12345;
169 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700170 // Due to the multiplicative factor we can send 5 packets during a send
171 // interval. (network capacity * multiplier / (8 bits per byte *
172 // (packet size * #send intervals per second)
173 const size_t packets_to_send =
174 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
175 for (size_t i = 0; i < packets_to_send; ++i) {
176 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
177 clock_.TimeInMilliseconds(), 250, false);
178 }
179
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000180 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200181 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
182 sequence_number, queued_packet_timestamp, 250,
183 false);
perkjec81bcd2016-05-11 06:01:13 -0700184 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000185 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000186 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
philipela1ed0b32016-06-01 06:31:17 -0700187 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000188 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000189 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000190 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000191 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700192 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200193 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
194 queued_packet_timestamp, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000195 .Times(1)
196 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000197 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000198 sequence_number++;
perkjec81bcd2016-05-11 06:01:13 -0700199 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
200
201 // We can send packets_to_send -1 packets of size 250 during the current
202 // interval since one packet has already been sent.
203 for (size_t i = 0; i < packets_to_send - 1; ++i) {
204 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
205 clock_.TimeInMilliseconds(), 250, false);
206 }
Peter Boströme23e7372015-10-08 11:44:14 +0200207 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
208 sequence_number++, clock_.TimeInMilliseconds(),
209 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700210 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000211 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700212 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000213}
214
philipelccdfcca2017-10-23 12:42:17 +0200215TEST_P(PacedSenderTest, PaceQueuedPackets) {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000216 uint32_t ssrc = 12345;
217 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000218
perkjec81bcd2016-05-11 06:01:13 -0700219 // Due to the multiplicative factor we can send 5 packets during a send
220 // interval. (network capacity * multiplier / (8 bits per byte *
221 // (packet size * #send intervals per second)
222 const size_t packets_to_send_per_interval =
223 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
224 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
225 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
226 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000227 }
perkjec81bcd2016-05-11 06:01:13 -0700228
229 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200230 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
231 sequence_number++, clock_.TimeInMilliseconds(),
232 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000233 }
perkjec81bcd2016-05-11 06:01:13 -0700234 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
235 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000236 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700237 EXPECT_EQ(packets_to_send_per_interval * 10,
238 send_bucket_->QueueSizePackets());
philipela1ed0b32016-06-01 06:31:17 -0700239 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000240 for (int k = 0; k < 10; ++k) {
241 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000242 clock_.AdvanceTimeMilliseconds(5);
philipel29dca2c2016-05-13 11:13:05 +0200243 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700244 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000245 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000246 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800247 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000248 }
perkjec81bcd2016-05-11 06:01:13 -0700249 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000250 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000251 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000252 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700253 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800254 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700255
256 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
257 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
258 clock_.TimeInMilliseconds(), 250, false);
259 }
Peter Boströme23e7372015-10-08 11:44:14 +0200260 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
261 sequence_number, clock_.TimeInMilliseconds(), 250,
262 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000263 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700264 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000265}
266
philipelccdfcca2017-10-23 12:42:17 +0200267TEST_P(PacedSenderTest, RepeatedRetransmissionsAllowed) {
philipel7dc719a2017-09-29 16:15:25 +0200268 // Send one packet, then two retransmissions of that packet.
269 for (size_t i = 0; i < 3; i++) {
270 constexpr uint32_t ssrc = 333;
271 constexpr uint16_t sequence_number = 444;
272 constexpr size_t bytes = 250;
273 bool is_retransmission = (i != 0); // Original followed by retransmissions.
274 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number,
275 clock_.TimeInMilliseconds(), bytes, is_retransmission);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000276 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000277 }
pbosa26ac922016-02-25 04:50:01 -0800278 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000279}
280
philipelccdfcca2017-10-23 12:42:17 +0200281TEST_P(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000282 uint32_t ssrc = 12345;
283 uint16_t sequence_number = 1234;
284
285 SendAndExpectPacket(PacedSender::kNormalPriority,
286 ssrc,
287 sequence_number,
288 clock_.TimeInMilliseconds(),
289 250,
290 false);
291
292 // Expect packet on second ssrc to be queued and sent as well.
293 SendAndExpectPacket(PacedSender::kNormalPriority,
294 ssrc + 1,
295 sequence_number,
296 clock_.TimeInMilliseconds(),
297 250,
298 false);
299
300 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000301 send_bucket_->Process();
302}
303
philipelccdfcca2017-10-23 12:42:17 +0200304TEST_P(PacedSenderTest, Padding) {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000305 uint32_t ssrc = 12345;
306 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000307
perkjec81bcd2016-05-11 06:01:13 -0700308 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700309 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700310
311 // Due to the multiplicative factor we can send 5 packets during a send
312 // interval. (network capacity * multiplier / (8 bits per byte *
313 // (packet size * #send intervals per second)
314 const size_t packets_to_send_per_interval =
315 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
316 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
317 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
318 clock_.TimeInMilliseconds(), 250, false);
319 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000320 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700321 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700322 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
323 send_bucket_->Process();
324 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
325
326 // 5 milliseconds later should not send padding since we filled the buffers
327 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700328 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000329 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000330 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000331 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800332 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000333
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000334 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700335 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
336 .Times(1)
337 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000338 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000339 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000340 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800341 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000342}
343
philipelccdfcca2017-10-23 12:42:17 +0200344TEST_P(PacedSenderTest, NoPaddingBeforeNormalPacket) {
perkj71ee44c2016-06-15 00:47:53 -0700345 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
346 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
347
348 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
349 send_bucket_->Process();
350 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
351
352 send_bucket_->Process();
353 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
354
355 uint32_t ssrc = 12345;
356 uint16_t sequence_number = 1234;
357 int64_t capture_time_ms = 56789;
358
359 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
360 capture_time_ms, 250, false);
361 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
362 .Times(1)
363 .WillOnce(Return(250));
364 send_bucket_->Process();
365}
366
philipelccdfcca2017-10-23 12:42:17 +0200367TEST_P(PacedSenderTest, VerifyPaddingUpToBitrate) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000368 uint32_t ssrc = 12345;
369 uint16_t sequence_number = 1234;
370 int64_t capture_time_ms = 56789;
371 const int kTimeStep = 5;
372 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700373 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700374 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700375
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000376 int64_t start_time = clock_.TimeInMilliseconds();
377 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000378 SendAndExpectPacket(PacedSender::kNormalPriority,
379 ssrc,
380 sequence_number++,
381 capture_time_ms,
382 250,
383 false);
philipela1ed0b32016-06-01 06:31:17 -0700384 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
385 .Times(1)
386 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000387 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700388 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000389 }
390}
391
philipelccdfcca2017-10-23 12:42:17 +0200392TEST_P(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000393 uint32_t ssrc = 12345;
394 uint16_t sequence_number = 1234;
395 int64_t capture_time_ms = 56789;
396 const int kTimeStep = 5;
397 const int64_t kBitrateWindow = 10000;
398 PacedSenderPadding callback;
philipelc3b3f7a2017-03-29 01:23:13 -0700399 send_bucket_.reset(new PacedSender(&clock_, &callback, nullptr));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000400 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700401 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700402
403 send_bucket_->SetSendBitrateLimits(
404 0 /*allocated_bitrate_bps*/,
405 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700406
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000407 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000408 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000409 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800410 int rand_value = rand(); // NOLINT (rand_r instead of rand)
411 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200412 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
413 sequence_number++, capture_time_ms,
414 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000415 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000416 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000417 send_bucket_->Process();
418 }
perkjec81bcd2016-05-11 06:01:13 -0700419 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000420 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700421 kBitrateWindow),
422 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000423}
424
philipelccdfcca2017-10-23 12:42:17 +0200425TEST_P(PacedSenderTest, Priority) {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000426 uint32_t ssrc_low_priority = 12345;
427 uint32_t ssrc = 12346;
428 uint16_t sequence_number = 1234;
429 int64_t capture_time_ms = 56789;
430 int64_t capture_time_ms_low_priority = 1234567;
431
perkjec81bcd2016-05-11 06:01:13 -0700432 // Due to the multiplicative factor we can send 5 packets during a send
433 // interval. (network capacity * multiplier / (8 bits per byte *
434 // (packet size * #send intervals per second)
435 const size_t packets_to_send_per_interval =
436 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
437 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
438 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
439 clock_.TimeInMilliseconds(), 250, false);
440 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000441 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700442 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000443
444 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200445 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
446 sequence_number++, capture_time_ms_low_priority,
447 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700448
449 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
450 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
451 sequence_number++, capture_time_ms, 250, false);
452 }
Peter Boströme23e7372015-10-08 11:44:14 +0200453 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
454 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000455
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000456 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700457 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200458 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700459 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000460 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000461
462 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000463 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000464 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800465 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700466 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000467
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000468 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200469 TimeToSendPacket(ssrc_low_priority, _,
470 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000471 .Times(1)
472 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000473
474 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000475 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000476 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800477 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000478}
479
philipelccdfcca2017-10-23 12:42:17 +0200480TEST_P(PacedSenderTest, RetransmissionPriority) {
tereliusf39f7d92016-07-20 03:36:19 -0700481 uint32_t ssrc = 12345;
482 uint16_t sequence_number = 1234;
483 int64_t capture_time_ms = 45678;
484 int64_t capture_time_ms_retransmission = 56789;
485
486 // Due to the multiplicative factor we can send 5 packets during a send
487 // interval. (network capacity * multiplier / (8 bits per byte *
488 // (packet size * #send intervals per second)
489 const size_t packets_to_send_per_interval =
490 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
491 send_bucket_->Process();
492 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
493
494 // Alternate retransmissions and normal packets.
495 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
496 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
497 sequence_number++,
498 capture_time_ms_retransmission, 250, true);
499 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
500 sequence_number++, capture_time_ms, 250, false);
501 }
502 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
503
504 // Expect all retransmissions to be sent out first despite having a later
505 // capture time.
506 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
507 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
508 EXPECT_CALL(callback_, TimeToSendPacket(
509 ssrc, _, capture_time_ms_retransmission, true, _))
510 .Times(packets_to_send_per_interval)
511 .WillRepeatedly(Return(true));
512
513 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
514 clock_.AdvanceTimeMilliseconds(5);
515 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
516 send_bucket_->Process();
517 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
518
519 // Expect the remaining (non-retransmission) packets to be sent.
520 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
521 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
522 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
523 .Times(packets_to_send_per_interval)
524 .WillRepeatedly(Return(true));
525
526 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
527 clock_.AdvanceTimeMilliseconds(5);
528 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
529 send_bucket_->Process();
530
531 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
532}
533
philipelccdfcca2017-10-23 12:42:17 +0200534TEST_P(PacedSenderTest, HighPrioDoesntAffectBudget) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100535 uint32_t ssrc = 12346;
536 uint16_t sequence_number = 1234;
537 int64_t capture_time_ms = 56789;
538
539 // As high prio packets doesn't affect the budget, we should be able to send
540 // a high number of them at once.
541 for (int i = 0; i < 25; ++i) {
542 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
543 capture_time_ms, 250, false);
544 }
545 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700546 // Low prio packets does affect the budget.
547 // Due to the multiplicative factor we can send 5 packets during a send
548 // interval. (network capacity * multiplier / (8 bits per byte *
549 // (packet size * #send intervals per second)
550 const size_t packets_to_send_per_interval =
551 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
552 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100553 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700554 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100555 }
556 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
557 capture_time_ms, 250, false);
558 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
559 clock_.AdvanceTimeMilliseconds(5);
560 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700561 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200562 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
563 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700564 .Times(1)
565 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100566 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
567 clock_.AdvanceTimeMilliseconds(5);
568 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700569 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100570}
571
philipelccdfcca2017-10-23 12:42:17 +0200572TEST_P(PacedSenderTest, Pause) {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000573 uint32_t ssrc_low_priority = 12345;
574 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700575 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000576 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000577 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000578
579 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000580
perkjec81bcd2016-05-11 06:01:13 -0700581 // Due to the multiplicative factor we can send 5 packets during a send
582 // interval. (network capacity * multiplier / (8 bits per byte *
583 // (packet size * #send intervals per second)
584 const size_t packets_to_send_per_interval =
585 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
586 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
587 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
588 clock_.TimeInMilliseconds(), 250, false);
589 }
590
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000591 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000592
593 send_bucket_->Pause();
594
terelius8b70faf2016-08-01 09:47:31 -0700595 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
596 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
597 sequence_number++, capture_time_ms, 250, false);
598 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
599 sequence_number++, capture_time_ms, 250, false);
600 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
601 sequence_number++, capture_time_ms, 250, false);
602 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000603 clock_.AdvanceTimeMilliseconds(10000);
604 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700605 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
606 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
607 sequence_number++, second_capture_time_ms, 250,
608 false);
609 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
610 sequence_number++, second_capture_time_ms, 250,
611 false);
612 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
613 sequence_number++, second_capture_time_ms, 250,
614 false);
615 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000616
617 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700618 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000619 send_bucket_->QueueInMs());
620
stefan9e117c5e12017-08-16 08:16:25 -0700621 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
622 EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
623 send_bucket_->Process();
624
625 int64_t expected_time_until_send = 500;
626 EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
627 while (expected_time_until_send >= 0) {
tommi919dce22017-03-15 07:45:36 -0700628 // TimeUntilNextProcess must not return 0 when paused. If it does,
629 // we risk running a busy loop, so ideally it should return a large value.
stefan9e117c5e12017-08-16 08:16:25 -0700630 EXPECT_EQ(expected_time_until_send, send_bucket_->TimeUntilNextProcess());
631 if (expected_time_until_send == 0)
632 send_bucket_->Process();
633 clock_.AdvanceTimeMilliseconds(5);
634 expected_time_until_send -= 5;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000635 }
terelius8b70faf2016-08-01 09:47:31 -0700636
stefan099110c2017-02-01 03:57:42 -0800637 // Expect high prio packets to come out first followed by normal
638 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700639 {
640 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800641 EXPECT_CALL(callback_,
642 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
643 .Times(packets_to_send_per_interval)
644 .WillRepeatedly(Return(true));
645 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
646 second_capture_time_ms, _, _))
647 .Times(packets_to_send_per_interval)
648 .WillRepeatedly(Return(true));
649
terelius8b70faf2016-08-01 09:47:31 -0700650 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
651 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
652 .Times(1)
653 .WillRepeatedly(Return(true));
654 }
655 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
656 EXPECT_CALL(callback_,
657 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
658 .Times(1)
659 .WillRepeatedly(Return(true));
660 }
661 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
662 EXPECT_CALL(callback_,
663 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
664 .Times(1)
665 .WillRepeatedly(Return(true));
666 }
667 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
668 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
669 second_capture_time_ms, _, _))
670 .Times(1)
671 .WillRepeatedly(Return(true));
672 }
673 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000674 send_bucket_->Resume();
675
terelius8b70faf2016-08-01 09:47:31 -0700676 for (size_t i = 0; i < 4; i++) {
stefan64136af2017-08-14 08:03:17 -0700677 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
678 send_bucket_->Process();
stefan9e117c5e12017-08-16 08:16:25 -0700679 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
680 clock_.AdvanceTimeMilliseconds(5);
terelius8b70faf2016-08-01 09:47:31 -0700681 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000682
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000683 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000684}
685
philipelccdfcca2017-10-23 12:42:17 +0200686TEST_P(PacedSenderTest, ResendPacket) {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000687 uint32_t ssrc = 12346;
688 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000689 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000690 EXPECT_EQ(0, send_bucket_->QueueInMs());
691
Peter Boströme23e7372015-10-08 11:44:14 +0200692 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
693 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000694 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200695 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
696 sequence_number + 1, capture_time_ms + 1, 250,
697 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000698 clock_.AdvanceTimeMilliseconds(9999);
699 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000700 send_bucket_->QueueInMs());
701 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200702 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
703 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000704 .Times(1)
705 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000706 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000707 send_bucket_->Process();
708
709 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000710 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000711 send_bucket_->QueueInMs());
712
713 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200714 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
715 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000716 .Times(1)
717 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200718 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
719 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000720 .Times(1)
721 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000722 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000723 send_bucket_->Process();
724
725 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000726 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000727 send_bucket_->QueueInMs());
728
729 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200730 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
731 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000732 .Times(1)
733 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000734 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000735 send_bucket_->Process();
736 EXPECT_EQ(0, send_bucket_->QueueInMs());
737}
738
philipelccdfcca2017-10-23 12:42:17 +0200739TEST_P(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000740 uint32_t ssrc = 12346;
741 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000742 const size_t kNumPackets = 60;
743 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700744 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000745 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000746
perkjec81bcd2016-05-11 06:01:13 -0700747 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000748 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000749 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
750 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000751 }
752
perkjec81bcd2016-05-11 06:01:13 -0700753 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000754 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700755 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000756 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000757
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000758 int64_t time_start = clock_.TimeInMilliseconds();
759 while (send_bucket_->QueueSizePackets() > 0) {
760 int time_until_process = send_bucket_->TimeUntilNextProcess();
761 if (time_until_process <= 0) {
762 send_bucket_->Process();
763 } else {
764 clock_.AdvanceTimeMilliseconds(time_until_process);
765 }
766 }
767 int64_t duration = clock_.TimeInMilliseconds() - time_start;
768
769 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
770
sprang0a43fef2015-11-20 09:00:37 -0800771 // Allow for aliasing, duration should be within one pack of max time limit.
772 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700773 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000774}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000775
philipelccdfcca2017-10-23 12:42:17 +0200776TEST_P(PacedSenderTest, QueueTimeGrowsOverTime) {
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000777 uint32_t ssrc = 12346;
778 uint16_t sequence_number = 1234;
779 EXPECT_EQ(0, send_bucket_->QueueInMs());
780
perkjec81bcd2016-05-11 06:01:13 -0700781 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000782 SendAndExpectPacket(PacedSender::kNormalPriority,
783 ssrc,
784 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000785 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000786 1200,
787 false);
788
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000789 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000790 EXPECT_EQ(500, send_bucket_->QueueInMs());
791 send_bucket_->Process();
792 EXPECT_EQ(0, send_bucket_->QueueInMs());
793}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000794
philipelccdfcca2017-10-23 12:42:17 +0200795TEST_P(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000796 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700797 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000798 uint32_t ssrc = 12346;
799 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700800
isheriffcc5903e2016-10-04 08:29:38 -0700801 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700802 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800803 send_bucket_->CreateProbeCluster(kFirstClusterBps);
804 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700805 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000806
philipelfd58b612017-01-04 07:05:25 -0800807 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200808 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
809 sequence_number++, clock_.TimeInMilliseconds(),
810 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000811 }
perkjec81bcd2016-05-11 06:01:13 -0700812
isheriffcc5903e2016-10-04 08:29:38 -0700813 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800814 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000815 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700816 clock_.AdvanceTimeMilliseconds(time_until_process);
817 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000818 }
isheriffcc5903e2016-10-04 08:29:38 -0700819 int packets_sent = packet_sender.packets_sent();
820 // Validate first cluster bitrate. Note that we have to account for number
821 // of intervals and hence (packets_sent - 1) on the first cluster.
822 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
823 (clock_.TimeInMilliseconds() - start),
824 kFirstClusterBps, kBitrateProbingError);
825 EXPECT_EQ(0, packet_sender.padding_sent());
826
sergeyu6dbbd892017-01-17 15:07:59 -0800827 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700828 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800829 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700830 int time_until_process = send_bucket_->TimeUntilNextProcess();
831 clock_.AdvanceTimeMilliseconds(time_until_process);
832 send_bucket_->Process();
833 }
834 packets_sent = packet_sender.packets_sent() - packets_sent;
835 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800836 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
837 (clock_.TimeInMilliseconds() - start),
838 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000839}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000840
philipelccdfcca2017-10-23 12:42:17 +0200841TEST_P(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200842 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700843 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200844 uint32_t ssrc = 12346;
845 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700846
847 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700848 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800849 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700850 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200851
philipelfd58b612017-01-04 07:05:25 -0800852 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200853 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
854 sequence_number++, clock_.TimeInMilliseconds(),
855 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200856 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200857
isheriffcc5903e2016-10-04 08:29:38 -0700858 int64_t start = clock_.TimeInMilliseconds();
859 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800860 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700861 int time_until_process = send_bucket_->TimeUntilNextProcess();
862 clock_.AdvanceTimeMilliseconds(time_until_process);
863 send_bucket_->Process();
864 ++process_count;
865 }
866 int packets_sent = packet_sender.packets_sent();
867 int padding_sent = packet_sender.padding_sent();
868 EXPECT_GT(packets_sent, 0);
869 EXPECT_GT(padding_sent, 0);
870 // Note that the number of intervals here for kPacketSize is
871 // packets_sent due to padding in the same cluster.
872 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
873 (clock_.TimeInMilliseconds() - start),
874 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200875}
876
philipelccdfcca2017-10-23 12:42:17 +0200877TEST_P(PacedSenderTest, PriorityInversion) {
878 // In this test capture timestamps are used to order packets, capture
879 // timestamps are not used in PacketQueue2.
880 if (webrtc::field_trial::IsEnabled("WebRTC-RoundRobinPacing"))
881 return;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000882 uint32_t ssrc = 12346;
883 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000884 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000885
Peter Boströme23e7372015-10-08 11:44:14 +0200886 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000887 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200888 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000889
Peter Boströme23e7372015-10-08 11:44:14 +0200890 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000891 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200892 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000893
Peter Boströme23e7372015-10-08 11:44:14 +0200894 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
895 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000896
Peter Boströme23e7372015-10-08 11:44:14 +0200897 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
898 sequence_number + 1, clock_.TimeInMilliseconds(),
899 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000900
901 // Packets from earlier frames should be sent first.
902 {
903 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200904 EXPECT_CALL(callback_,
905 TimeToSendPacket(ssrc, sequence_number,
906 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000907 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200908 EXPECT_CALL(callback_,
909 TimeToSendPacket(ssrc, sequence_number + 1,
910 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000911 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200912 EXPECT_CALL(callback_,
913 TimeToSendPacket(ssrc, sequence_number + 3,
914 clock_.TimeInMilliseconds() + 33, true, _))
915 .WillOnce(Return(true));
916 EXPECT_CALL(callback_,
917 TimeToSendPacket(ssrc, sequence_number + 2,
918 clock_.TimeInMilliseconds() + 33, true, _))
919 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000920
921 while (send_bucket_->QueueSizePackets() > 0) {
922 int time_until_process = send_bucket_->TimeUntilNextProcess();
923 if (time_until_process <= 0) {
924 send_bucket_->Process();
925 } else {
926 clock_.AdvanceTimeMilliseconds(time_until_process);
927 }
928 }
929 }
930}
931
philipelccdfcca2017-10-23 12:42:17 +0200932TEST_P(PacedSenderTest, PaddingOveruse) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000933 uint32_t ssrc = 12346;
934 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000935 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000936
perkjec81bcd2016-05-11 06:01:13 -0700937 send_bucket_->Process();
938 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700939 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700940
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000941 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
942 clock_.TimeInMilliseconds(), kPacketSize, false);
943 send_bucket_->Process();
944
945 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700946 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000947 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700948 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000949
perkjec81bcd2016-05-11 06:01:13 -0700950 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
951 clock_.TimeInMilliseconds(), kPacketSize, false);
952 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000953 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700954 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000955 send_bucket_->Process();
956}
957
Niels Möllerd6314d92017-10-23 09:08:22 +0200958// TODO(philipel): Move to PacketQueue2 unittests.
959#if 0
Erik Språngad113e52015-11-26 16:26:12 +0100960TEST_F(PacedSenderTest, AverageQueueTime) {
961 uint32_t ssrc = 12346;
962 uint16_t sequence_number = 1234;
963 const size_t kPacketSize = 1200;
964 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100965
perkjec81bcd2016-05-11 06:01:13 -0700966 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100967
968 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
969
970 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100971 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
972 sequence_number, first_capture_time, kPacketSize,
973 false);
Erik Språngad113e52015-11-26 16:26:12 +0100974 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100975 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100976 sequence_number + 1, clock_.TimeInMilliseconds(),
977 kPacketSize, false);
978 clock_.AdvanceTimeMilliseconds(10);
979
980 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
981
982 // Only first packet (queued for 20ms) should be removed, leave the second
983 // packet (queued for 10ms) alone in the queue.
984 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200985 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100986 .Times(1)
987 .WillRepeatedly(Return(true));
988 send_bucket_->Process();
989
990 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
991
992 clock_.AdvanceTimeMilliseconds(10);
993 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200994 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100995 .Times(1)
996 .WillRepeatedly(Return(true));
997 for (int i = 0; i < 3; ++i) {
998 clock_.AdvanceTimeMilliseconds(30); // Max delta.
999 send_bucket_->Process();
1000 }
1001
1002 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
1003}
Niels Möllerd6314d92017-10-23 09:08:22 +02001004#endif
Erik Språngad113e52015-11-26 16:26:12 +01001005
philipelccdfcca2017-10-23 12:42:17 +02001006TEST_P(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +02001007 uint32_t ssrc = 12346;
1008 uint16_t sequence_number = 1234;
1009 const size_t kPacketSize = 1200;
1010
perkj71ee44c2016-06-15 00:47:53 -07001011 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001012 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -08001013 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +02001014 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1015 sequence_number + i, clock_.TimeInMilliseconds(),
1016 kPacketSize, false);
1017 }
1018
1019 // First probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001020 EXPECT_CALL(callback_,
1021 TimeToSendPacket(_, _, _, _,
1022 Field(&PacedPacketInfo::probe_cluster_id, 0)))
philipelfd58b612017-01-04 07:05:25 -08001023 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001024 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001025 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001026 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001027 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001028 }
philipel29dca2c2016-05-13 11:13:05 +02001029
1030 // Second probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001031 EXPECT_CALL(callback_,
1032 TimeToSendPacket(_, _, _, _,
1033 Field(&PacedPacketInfo::probe_cluster_id, 1)))
philipel29dca2c2016-05-13 11:13:05 +02001034 .Times(5)
1035 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001036 for (int i = 0; i < 5; ++i) {
1037 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001038 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001039 }
philipel29dca2c2016-05-13 11:13:05 +02001040
philipelc7bf32a2017-02-17 03:59:43 -08001041 // Needed for the Field comparer below.
1042 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
philipel29dca2c2016-05-13 11:13:05 +02001043 // No more probing packets.
philipelc7bf32a2017-02-17 03:59:43 -08001044 EXPECT_CALL(callback_,
1045 TimeToSendPadding(
1046 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1047 .Times(1)
1048 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001049 send_bucket_->Process();
1050}
1051
philipelccdfcca2017-10-23 12:42:17 +02001052TEST_P(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
philipelb61927c2017-02-28 07:05:23 -08001053 uint32_t ssrc = 12346;
1054 uint16_t sequence_number = 1234;
1055 const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
1056
1057 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
1058 send_bucket_->SetProbingEnabled(true);
1059 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1060 sequence_number, clock_.TimeInMilliseconds(),
1061 kPacketSize, false);
1062
1063 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
1064 .WillOnce(Return(true));
1065 send_bucket_->Process();
1066 EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
1067 clock_.AdvanceTimeMilliseconds(9);
1068
1069 EXPECT_CALL(callback_, TimeToSendPadding(_, _))
1070 .Times(2)
1071 .WillRepeatedly(Return(0));
1072 send_bucket_->Process();
1073 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
1074 clock_.AdvanceTimeMilliseconds(1);
1075 send_bucket_->Process();
1076 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
1077}
1078
Niels Möllerd6314d92017-10-23 09:08:22 +02001079// TODO(philipel): Move to PacketQueue2 unittests.
1080#if 0
sprangddcfb9f2017-08-16 05:38:49 -07001081TEST_F(PacedSenderTest, QueueTimeWithPause) {
1082 const size_t kPacketSize = 1200;
1083 const uint32_t kSsrc = 12346;
1084 uint16_t sequence_number = 1234;
1085
1086 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1087 sequence_number++, clock_.TimeInMilliseconds(),
1088 kPacketSize, false);
1089 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1090 sequence_number++, clock_.TimeInMilliseconds(),
1091 kPacketSize, false);
1092
1093 clock_.AdvanceTimeMilliseconds(100);
1094 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1095
1096 send_bucket_->Pause();
1097 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1098
1099 // In paused state, queue time should not increase.
1100 clock_.AdvanceTimeMilliseconds(100);
1101 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1102
1103 send_bucket_->Resume();
1104 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1105
1106 clock_.AdvanceTimeMilliseconds(100);
1107 EXPECT_EQ(200, send_bucket_->AverageQueueTimeMs());
1108}
1109
philipelccdfcca2017-10-23 12:42:17 +02001110TEST_P(PacedSenderTest, QueueTimePausedDuringPush) {
sprangddcfb9f2017-08-16 05:38:49 -07001111 const size_t kPacketSize = 1200;
1112 const uint32_t kSsrc = 12346;
1113 uint16_t sequence_number = 1234;
1114
1115 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1116 sequence_number++, clock_.TimeInMilliseconds(),
1117 kPacketSize, false);
1118 clock_.AdvanceTimeMilliseconds(100);
1119 send_bucket_->Pause();
1120 clock_.AdvanceTimeMilliseconds(100);
1121 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1122
1123 // Add a new packet during paused phase.
1124 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1125 sequence_number++, clock_.TimeInMilliseconds(),
1126 kPacketSize, false);
1127 // From a queue time perspective, packet inserted during pause will have zero
1128 // queue time. Average queue time will then be (0 + 100) / 2 = 50.
1129 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1130
1131 clock_.AdvanceTimeMilliseconds(100);
1132 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1133
1134 send_bucket_->Resume();
1135 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1136
1137 clock_.AdvanceTimeMilliseconds(100);
1138 EXPECT_EQ(150, send_bucket_->AverageQueueTimeMs());
1139}
Niels Möllerd6314d92017-10-23 09:08:22 +02001140#endif
sprangddcfb9f2017-08-16 05:38:49 -07001141
1142// TODO(sprang): Extract PacketQueue from PacedSender so that we can test
1143// removing elements while paused. (This is possible, but only because of semi-
1144// racy condition so can't easily be tested).
1145
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001146} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001147} // namespace webrtc