blob: c27444c5acad6fe9fb607e518b380beae218f33e [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>
12
pbos@webrtc.orgdb6e3f82013-07-11 09:50:05 +000013#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000015#include "webrtc/modules/pacing/include/paced_sender.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010016#include "webrtc/system_wrappers/include/clock.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000017
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000018using testing::_;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000019using testing::Return;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000020
21namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000022namespace test {
23
24static const int kTargetBitrate = 800;
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000025static const float kPaceMultiplier = 1.5f;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000026
27class MockPacedSenderCallback : public PacedSender::Callback {
28 public:
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000029 MOCK_METHOD4(TimeToSendPacket,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000030 bool(uint32_t ssrc,
31 uint16_t sequence_number,
32 int64_t capture_time_ms,
33 bool retransmission));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000034 MOCK_METHOD1(TimeToSendPadding,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000035 size_t(size_t bytes));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000036};
37
38class PacedSenderPadding : public PacedSender::Callback {
39 public:
40 PacedSenderPadding() : padding_sent_(0) {}
41
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000042 bool TimeToSendPacket(uint32_t ssrc,
43 uint16_t sequence_number,
44 int64_t capture_time_ms,
45 bool retransmission) {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000046 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000047 }
48
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000049 size_t TimeToSendPadding(size_t bytes) {
50 const size_t kPaddingPacketSize = 224;
51 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000052 padding_sent_ += kPaddingPacketSize * num_packets;
53 return kPaddingPacketSize * num_packets;
54 }
55
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000056 size_t padding_sent() { return padding_sent_; }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000057
58 private:
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000059 size_t padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000060};
61
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000062class PacedSenderProbing : public PacedSender::Callback {
63 public:
64 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock)
65 : prev_packet_time_ms_(-1),
66 expected_deltas_(expected_deltas),
67 packets_sent_(0),
68 clock_(clock) {}
69
70 bool TimeToSendPacket(uint32_t ssrc,
71 uint16_t sequence_number,
72 int64_t capture_time_ms,
73 bool retransmission) {
Stefan Holmer01b48882015-05-05 10:21:24 +020074 ExpectAndCountPacket();
75 return true;
76 }
77
78 size_t TimeToSendPadding(size_t bytes) {
79 ExpectAndCountPacket();
80 return bytes;
81 }
82
83 void ExpectAndCountPacket() {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000084 ++packets_sent_;
85 EXPECT_FALSE(expected_deltas_.empty());
86 if (expected_deltas_.empty())
Stefan Holmer01b48882015-05-05 10:21:24 +020087 return;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000088 int64_t now_ms = clock_->TimeInMilliseconds();
89 if (prev_packet_time_ms_ >= 0) {
90 EXPECT_EQ(expected_deltas_.front(), now_ms - prev_packet_time_ms_);
91 expected_deltas_.pop_front();
92 }
93 prev_packet_time_ms_ = now_ms;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000094 }
95
96 int packets_sent() const { return packets_sent_; }
97
98 private:
99 int64_t prev_packet_time_ms_;
100 std::list<int> expected_deltas_;
101 int packets_sent_;
102 Clock* clock_;
103};
104
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000105class PacedSenderTest : public ::testing::Test {
106 protected:
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000107 PacedSenderTest() : clock_(123456) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000108 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000109 // Need to initialize PacedSender after we initialize clock.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000110 send_bucket_.reset(new PacedSender(&clock_,
111 &callback_,
112 kTargetBitrate,
113 kPaceMultiplier * kTargetBitrate,
114 0));
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);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000119 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000120
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000121 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000122 uint32_t ssrc,
123 uint16_t sequence_number,
124 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000125 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000126 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200127 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
128 size, retransmission);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000129 EXPECT_CALL(callback_,
130 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000131 .Times(1)
132 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000133 }
134
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000135 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000136 MockPacedSenderCallback callback_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000137 rtc::scoped_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000138};
139
140TEST_F(PacedSenderTest, QueuePacket) {
141 uint32_t ssrc = 12345;
142 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000143 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000144 SendAndExpectPacket(PacedSender::kNormalPriority,
145 ssrc,
146 sequence_number++,
147 clock_.TimeInMilliseconds(),
148 250,
149 false);
150 SendAndExpectPacket(PacedSender::kNormalPriority,
151 ssrc,
152 sequence_number++,
153 clock_.TimeInMilliseconds(),
154 250,
155 false);
156 SendAndExpectPacket(PacedSender::kNormalPriority,
157 ssrc,
158 sequence_number++,
159 clock_.TimeInMilliseconds(),
160 250,
161 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000162 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200163 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
164 sequence_number, queued_packet_timestamp, 250,
165 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000166 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000167 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000168 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000169 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000170 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000171 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000172 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000173 EXPECT_CALL(
174 callback_,
175 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000176 .Times(1)
177 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000178 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000179 sequence_number++;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000180 SendAndExpectPacket(PacedSender::kNormalPriority,
181 ssrc,
182 sequence_number++,
183 clock_.TimeInMilliseconds(),
184 250,
185 false);
186 SendAndExpectPacket(PacedSender::kNormalPriority,
187 ssrc,
188 sequence_number++,
189 clock_.TimeInMilliseconds(),
190 250,
191 false);
Peter Boströme23e7372015-10-08 11:44:14 +0200192 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
193 sequence_number++, clock_.TimeInMilliseconds(),
194 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000195 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000196}
197
198TEST_F(PacedSenderTest, PaceQueuedPackets) {
199 uint32_t ssrc = 12345;
200 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000201
202 // Due to the multiplicative factor we can send 3 packets not 2 packets.
203 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000204 SendAndExpectPacket(PacedSender::kNormalPriority,
205 ssrc,
206 sequence_number++,
207 clock_.TimeInMilliseconds(),
208 250,
209 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000210 }
211 for (int j = 0; j < 30; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200212 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
213 sequence_number++, clock_.TimeInMilliseconds(),
214 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000215 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000216 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000217 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000218 for (int k = 0; k < 10; ++k) {
219 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000220 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000221 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000222 .Times(3)
223 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000224 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
225 EXPECT_EQ(0, send_bucket_->Process());
226 }
227 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000228 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000229 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
230 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000231 SendAndExpectPacket(PacedSender::kNormalPriority,
232 ssrc,
233 sequence_number++,
234 clock_.TimeInMilliseconds(),
235 250,
236 false);
237 SendAndExpectPacket(PacedSender::kNormalPriority,
238 ssrc,
239 sequence_number++,
240 clock_.TimeInMilliseconds(),
241 250,
242 false);
243 SendAndExpectPacket(PacedSender::kNormalPriority,
244 ssrc,
245 sequence_number++,
246 clock_.TimeInMilliseconds(),
247 250,
248 false);
Peter Boströme23e7372015-10-08 11:44:14 +0200249 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
250 sequence_number, clock_.TimeInMilliseconds(), 250,
251 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000252 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000253}
254
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000255TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
256 uint32_t ssrc = 12345;
257 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000258 uint16_t queued_sequence_number;
259
260 // Due to the multiplicative factor we can send 3 packets not 2 packets.
261 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000262 SendAndExpectPacket(PacedSender::kNormalPriority,
263 ssrc,
264 sequence_number++,
265 clock_.TimeInMilliseconds(),
266 250,
267 false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000268 }
269 queued_sequence_number = sequence_number;
270
271 for (int j = 0; j < 30; ++j) {
272 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200273 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
274 sequence_number, clock_.TimeInMilliseconds(),
275 250, false);
276 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
277 sequence_number++, clock_.TimeInMilliseconds(),
278 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000279 }
280 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000281 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000282 for (int k = 0; k < 10; ++k) {
283 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000284 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000285
286 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000287 EXPECT_CALL(callback_,
288 TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000289 .Times(1)
290 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000291 }
292 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
293 EXPECT_EQ(0, send_bucket_->Process());
294 }
295 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000296 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000297 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
298 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000299 SendAndExpectPacket(PacedSender::kNormalPriority,
300 ssrc,
301 sequence_number++,
302 clock_.TimeInMilliseconds(),
303 250,
304 false);
305 SendAndExpectPacket(PacedSender::kNormalPriority,
306 ssrc,
307 sequence_number++,
308 clock_.TimeInMilliseconds(),
309 250,
310 false);
311 SendAndExpectPacket(PacedSender::kNormalPriority,
312 ssrc,
313 sequence_number++,
314 clock_.TimeInMilliseconds(),
315 250,
316 false);
Peter Boströme23e7372015-10-08 11:44:14 +0200317 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
318 sequence_number++, clock_.TimeInMilliseconds(),
319 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000320 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000321}
322
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000323TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
324 uint32_t ssrc = 12345;
325 uint16_t sequence_number = 1234;
326
327 SendAndExpectPacket(PacedSender::kNormalPriority,
328 ssrc,
329 sequence_number,
330 clock_.TimeInMilliseconds(),
331 250,
332 false);
333
334 // Expect packet on second ssrc to be queued and sent as well.
335 SendAndExpectPacket(PacedSender::kNormalPriority,
336 ssrc + 1,
337 sequence_number,
338 clock_.TimeInMilliseconds(),
339 250,
340 false);
341
342 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000343 send_bucket_->Process();
344}
345
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000346TEST_F(PacedSenderTest, Padding) {
347 uint32_t ssrc = 12345;
348 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000349
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000350 send_bucket_->UpdateBitrate(
351 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000352 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000353 SendAndExpectPacket(PacedSender::kNormalPriority,
354 ssrc,
355 sequence_number++,
356 clock_.TimeInMilliseconds(),
357 250,
358 false);
359 SendAndExpectPacket(PacedSender::kNormalPriority,
360 ssrc,
361 sequence_number++,
362 clock_.TimeInMilliseconds(),
363 250,
364 false);
365 SendAndExpectPacket(PacedSender::kNormalPriority,
366 ssrc,
367 sequence_number++,
368 clock_.TimeInMilliseconds(),
369 250,
370 false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000371 // No padding is expected since we have sent too much already.
372 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000373 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000374 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000375 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
376 EXPECT_EQ(0, send_bucket_->Process());
377
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000378 // 5 milliseconds later we have enough budget to send some padding.
379 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
380 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000381 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000382 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000383 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
384 EXPECT_EQ(0, send_bucket_->Process());
385}
386
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000387TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
388 uint32_t ssrc = 12345;
389 uint16_t sequence_number = 1234;
390 int64_t capture_time_ms = 56789;
391 const int kTimeStep = 5;
392 const int64_t kBitrateWindow = 100;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000393 send_bucket_->UpdateBitrate(
394 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000395 int64_t start_time = clock_.TimeInMilliseconds();
396 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000397 SendAndExpectPacket(PacedSender::kNormalPriority,
398 ssrc,
399 sequence_number++,
400 capture_time_ms,
401 250,
402 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000403 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000404 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
405 WillOnce(Return(250));
406 send_bucket_->Process();
407 }
408}
409
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000410TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
411 uint32_t ssrc = 12345;
412 uint16_t sequence_number = 1234;
413 int64_t capture_time_ms = 56789;
414 const int kTimeStep = 5;
415 const int64_t kBitrateWindow = 10000;
416 PacedSenderPadding callback;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000417 send_bucket_.reset(new PacedSender(
418 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000419 send_bucket_->SetProbingEnabled(false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000420 send_bucket_->UpdateBitrate(
421 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000422 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000423 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000424 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000425 size_t media_payload = rand() % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200426 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
427 sequence_number++, capture_time_ms,
428 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000429 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000430 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000431 send_bucket_->Process();
432 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000433 EXPECT_NEAR(kTargetBitrate,
434 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
435 kBitrateWindow), 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000436}
437
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000438TEST_F(PacedSenderTest, Priority) {
439 uint32_t ssrc_low_priority = 12345;
440 uint32_t ssrc = 12346;
441 uint16_t sequence_number = 1234;
442 int64_t capture_time_ms = 56789;
443 int64_t capture_time_ms_low_priority = 1234567;
444
445 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000446 SendAndExpectPacket(PacedSender::kLowPriority,
447 ssrc,
448 sequence_number++,
449 capture_time_ms,
450 250,
451 false);
452 SendAndExpectPacket(PacedSender::kNormalPriority,
453 ssrc,
454 sequence_number++,
455 capture_time_ms,
456 250,
457 false);
458 SendAndExpectPacket(PacedSender::kNormalPriority,
459 ssrc,
460 sequence_number++,
461 capture_time_ms,
462 250,
463 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000464 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000465
466 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200467 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
468 sequence_number++, capture_time_ms_low_priority,
469 250, false);
470 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
471 sequence_number++, capture_time_ms, 250, false);
472 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
473 sequence_number++, capture_time_ms, 250, false);
474 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
475 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000476
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000477 // Expect all high and normal priority to be sent out first.
478 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000479 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000480 .Times(3)
481 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000482
483 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000484 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000485 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
486 EXPECT_EQ(0, send_bucket_->Process());
487
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000488 EXPECT_CALL(callback_,
489 TimeToSendPacket(
490 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000491 .Times(1)
492 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000493
494 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000495 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000496 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
497 EXPECT_EQ(0, send_bucket_->Process());
498}
499
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000500TEST_F(PacedSenderTest, Pause) {
501 uint32_t ssrc_low_priority = 12345;
502 uint32_t ssrc = 12346;
503 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000504 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000505
506 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000507
508 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000509 SendAndExpectPacket(PacedSender::kLowPriority,
510 ssrc,
511 sequence_number++,
512 capture_time_ms,
513 250,
514 false);
515 SendAndExpectPacket(PacedSender::kNormalPriority,
516 ssrc,
517 sequence_number++,
518 capture_time_ms,
519 250,
520 false);
521 SendAndExpectPacket(PacedSender::kNormalPriority,
522 ssrc,
523 sequence_number++,
524 capture_time_ms,
525 250,
526 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000527 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000528
529 send_bucket_->Pause();
530
Peter Boströme23e7372015-10-08 11:44:14 +0200531 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
532 sequence_number++, capture_time_ms, 250, false);
533 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
534 sequence_number++, capture_time_ms, 250, false);
535 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
536 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000537
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000538 clock_.AdvanceTimeMilliseconds(10000);
539 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000540
541 // Expect everything to be queued.
Peter Boströme23e7372015-10-08 11:44:14 +0200542 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
543 sequence_number++, second_capture_time_ms, 250,
544 false);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000545
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000546 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000547 send_bucket_->QueueInMs());
548
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000549 // Expect no packet to come out while paused.
550 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000551 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000552
553 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000554 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000555 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
556 EXPECT_EQ(0, send_bucket_->Process());
557 }
558 // Expect high prio packets to come out first followed by all packets in the
559 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000560 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000561 .Times(3)
562 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000563 send_bucket_->Resume();
564
565 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000566 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000567 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
568 EXPECT_EQ(0, send_bucket_->Process());
569
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000570 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000571 .Times(1)
572 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000573 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000574 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000575 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
576 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000577 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000578}
579
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000580TEST_F(PacedSenderTest, ResendPacket) {
581 uint32_t ssrc = 12346;
582 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000583 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000584 EXPECT_EQ(0, send_bucket_->QueueInMs());
585
Peter Boströme23e7372015-10-08 11:44:14 +0200586 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
587 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000588 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200589 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
590 sequence_number + 1, capture_time_ms + 1, 250,
591 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000592 clock_.AdvanceTimeMilliseconds(9999);
593 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000594 send_bucket_->QueueInMs());
595 // Fails to send first packet so only one call.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000596 EXPECT_CALL(callback_,
597 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000598 .Times(1)
599 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000600 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000601 send_bucket_->Process();
602
603 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000604 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000605 send_bucket_->QueueInMs());
606
607 // Fails to send second packet.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000608 EXPECT_CALL(callback_,
609 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000610 .Times(1)
611 .WillOnce(Return(true));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000612 EXPECT_CALL(
613 callback_,
614 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000615 .Times(1)
616 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000617 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000618 send_bucket_->Process();
619
620 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000621 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000622 send_bucket_->QueueInMs());
623
624 // Send second packet and queue becomes empty.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000625 EXPECT_CALL(
626 callback_,
627 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000628 .Times(1)
629 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000630 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000631 send_bucket_->Process();
632 EXPECT_EQ(0, send_bucket_->QueueInMs());
633}
634
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000635TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000636 uint32_t ssrc = 12346;
637 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000638 const size_t kNumPackets = 60;
639 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000640 const int32_t kMaxBitrate = kPaceMultiplier * 30;
641 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000642
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000643 send_bucket_->UpdateBitrate(30, kMaxBitrate, 0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000644 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000645 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
646 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000647 }
648
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000649 // Queue in ms = 1000 * (bytes in queue) / (kbit per second * 1000 / 8)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000650 int64_t queue_in_ms =
651 static_cast<int64_t>(kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000652 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000653
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000654 int64_t time_start = clock_.TimeInMilliseconds();
655 while (send_bucket_->QueueSizePackets() > 0) {
656 int time_until_process = send_bucket_->TimeUntilNextProcess();
657 if (time_until_process <= 0) {
658 send_bucket_->Process();
659 } else {
660 clock_.AdvanceTimeMilliseconds(time_until_process);
661 }
662 }
663 int64_t duration = clock_.TimeInMilliseconds() - time_start;
664
665 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
666
667 // Allow for aliasing, duration should be in [expected(n - 1), expected(n)].
668 EXPECT_LE(duration, queue_in_ms);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000669 EXPECT_GE(duration,
670 queue_in_ms - static_cast<int64_t>(kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000671}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000672
673TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
674 uint32_t ssrc = 12346;
675 uint16_t sequence_number = 1234;
676 EXPECT_EQ(0, send_bucket_->QueueInMs());
677
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000678 send_bucket_->UpdateBitrate(30, kPaceMultiplier * 30, 0);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000679 SendAndExpectPacket(PacedSender::kNormalPriority,
680 ssrc,
681 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000682 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000683 1200,
684 false);
685
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000686 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000687 EXPECT_EQ(500, send_bucket_->QueueInMs());
688 send_bucket_->Process();
689 EXPECT_EQ(0, send_bucket_->QueueInMs());
690}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000691
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000692TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000693 const int kNumPackets = 11;
694 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000695 const size_t kPacketSize = 1200;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000696 const int kInitialBitrateKbps = 300;
697 uint32_t ssrc = 12346;
698 uint16_t sequence_number = 1234;
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000699 const int expected_deltas[kNumDeltas] = {
700 10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000701 std::list<int> expected_deltas_list(expected_deltas,
702 expected_deltas + kNumPackets - 1);
703 PacedSenderProbing callback(expected_deltas_list, &clock_);
704 send_bucket_.reset(
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000705 new PacedSender(&clock_,
706 &callback,
707 kInitialBitrateKbps,
708 kPaceMultiplier * kInitialBitrateKbps,
709 0));
710
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000711 for (int i = 0; i < kNumPackets; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200712 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
713 sequence_number++, clock_.TimeInMilliseconds(),
714 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000715 }
716 while (callback.packets_sent() < kNumPackets) {
717 int time_until_process = send_bucket_->TimeUntilNextProcess();
718 if (time_until_process <= 0) {
719 send_bucket_->Process();
720 } else {
721 clock_.AdvanceTimeMilliseconds(time_until_process);
722 }
723 }
724}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000725
Stefan Holmer01b48882015-05-05 10:21:24 +0200726TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
727 const int kNumPackets = 11;
728 const int kNumDeltas = kNumPackets - 1;
729 const size_t kPacketSize = 1200;
730 const int kInitialBitrateKbps = 300;
731 uint32_t ssrc = 12346;
732 uint16_t sequence_number = 1234;
733 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
734 std::list<int> expected_deltas_list(expected_deltas,
735 expected_deltas + kNumPackets - 1);
736 PacedSenderProbing callback(expected_deltas_list, &clock_);
Stefan Holmer586b19b2015-09-18 11:14:31 +0200737 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateKbps,
738 kPaceMultiplier * kInitialBitrateKbps, 0));
Stefan Holmer01b48882015-05-05 10:21:24 +0200739
740 for (int i = 0; i < kNumPackets - 5; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200741 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
742 sequence_number++, clock_.TimeInMilliseconds(),
743 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200744 }
745 while (callback.packets_sent() < kNumPackets) {
746 int time_until_process = send_bucket_->TimeUntilNextProcess();
747 if (time_until_process <= 0) {
748 send_bucket_->Process();
749 } else {
750 clock_.AdvanceTimeMilliseconds(time_until_process);
751 }
752 }
753
754 // Process one more time and make sure we don't send any more probes.
755 int time_until_process = send_bucket_->TimeUntilNextProcess();
756 clock_.AdvanceTimeMilliseconds(time_until_process);
757 send_bucket_->Process();
758 EXPECT_EQ(kNumPackets, callback.packets_sent());
759}
760
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000761TEST_F(PacedSenderTest, PriorityInversion) {
762 uint32_t ssrc = 12346;
763 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000764 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000765
Peter Boströme23e7372015-10-08 11:44:14 +0200766 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000767 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200768 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000769
Peter Boströme23e7372015-10-08 11:44:14 +0200770 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000771 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200772 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000773
Peter Boströme23e7372015-10-08 11:44:14 +0200774 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
775 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000776
Peter Boströme23e7372015-10-08 11:44:14 +0200777 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
778 sequence_number + 1, clock_.TimeInMilliseconds(),
779 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000780
781 // Packets from earlier frames should be sent first.
782 {
783 ::testing::InSequence sequence;
784 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
785 clock_.TimeInMilliseconds(), true))
786 .WillOnce(Return(true));
787 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
788 clock_.TimeInMilliseconds(), true))
789 .WillOnce(Return(true));
790 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
791 clock_.TimeInMilliseconds() + 33,
792 true)).WillOnce(Return(true));
793 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
794 clock_.TimeInMilliseconds() + 33,
795 true)).WillOnce(Return(true));
796
797 while (send_bucket_->QueueSizePackets() > 0) {
798 int time_until_process = send_bucket_->TimeUntilNextProcess();
799 if (time_until_process <= 0) {
800 send_bucket_->Process();
801 } else {
802 clock_.AdvanceTimeMilliseconds(time_until_process);
803 }
804 }
805 }
806}
807
808TEST_F(PacedSenderTest, PaddingOveruse) {
809 uint32_t ssrc = 12346;
810 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000811 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000812
813 // Min bitrate 0 => no padding, padding budget will stay at 0.
814 send_bucket_->UpdateBitrate(60, 90, 0);
815 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
816 clock_.TimeInMilliseconds(), kPacketSize, false);
817 send_bucket_->Process();
818
819 // Add 30kbit padding. When increasing budget, media budget will increase from
820 // negative (overuse) while padding budget will increase form 0.
821 clock_.AdvanceTimeMilliseconds(5);
822 send_bucket_->UpdateBitrate(60, 90, 30);
823
Peter Boströme23e7372015-10-08 11:44:14 +0200824 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
825 sequence_number++, clock_.TimeInMilliseconds(),
826 kPacketSize, false);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000827
828 // Don't send padding if queue is non-empty, even if padding budget > 0.
829 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
830 send_bucket_->Process();
831}
832
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000833} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000834} // namespace webrtc