blob: a00b5fa58deb0bd79db174b4748457b0ff33dc8f [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"
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +000016#include "webrtc/system_wrappers/interface/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) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000127 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000128 sequence_number, capture_time_ms, 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();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000163 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000164 sequence_number, queued_packet_timestamp, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000165 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000166 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000167 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000168 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000169 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000170 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000171 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000172 EXPECT_CALL(
173 callback_,
174 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000175 .Times(1)
176 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000177 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000178 sequence_number++;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000179 SendAndExpectPacket(PacedSender::kNormalPriority,
180 ssrc,
181 sequence_number++,
182 clock_.TimeInMilliseconds(),
183 250,
184 false);
185 SendAndExpectPacket(PacedSender::kNormalPriority,
186 ssrc,
187 sequence_number++,
188 clock_.TimeInMilliseconds(),
189 250,
190 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000191 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000192 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000193 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000194}
195
196TEST_F(PacedSenderTest, PaceQueuedPackets) {
197 uint32_t ssrc = 12345;
198 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000199
200 // Due to the multiplicative factor we can send 3 packets not 2 packets.
201 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000202 SendAndExpectPacket(PacedSender::kNormalPriority,
203 ssrc,
204 sequence_number++,
205 clock_.TimeInMilliseconds(),
206 250,
207 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000208 }
209 for (int j = 0; j < 30; ++j) {
210 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000211 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000212 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000213 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000214 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000215 for (int k = 0; k < 10; ++k) {
216 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000217 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000218 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000219 .Times(3)
220 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000221 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
222 EXPECT_EQ(0, send_bucket_->Process());
223 }
224 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000225 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000226 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
227 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000228 SendAndExpectPacket(PacedSender::kNormalPriority,
229 ssrc,
230 sequence_number++,
231 clock_.TimeInMilliseconds(),
232 250,
233 false);
234 SendAndExpectPacket(PacedSender::kNormalPriority,
235 ssrc,
236 sequence_number++,
237 clock_.TimeInMilliseconds(),
238 250,
239 false);
240 SendAndExpectPacket(PacedSender::kNormalPriority,
241 ssrc,
242 sequence_number++,
243 clock_.TimeInMilliseconds(),
244 250,
245 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000246 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000247 sequence_number, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000248 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000249}
250
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000251TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
252 uint32_t ssrc = 12345;
253 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000254 uint16_t queued_sequence_number;
255
256 // Due to the multiplicative factor we can send 3 packets not 2 packets.
257 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000258 SendAndExpectPacket(PacedSender::kNormalPriority,
259 ssrc,
260 sequence_number++,
261 clock_.TimeInMilliseconds(),
262 250,
263 false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000264 }
265 queued_sequence_number = sequence_number;
266
267 for (int j = 0; j < 30; ++j) {
268 // Send in duplicate packets.
269 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000270 sequence_number, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000271 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000272 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000273 }
274 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000275 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000276 for (int k = 0; k < 10; ++k) {
277 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000278 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000279
280 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000281 EXPECT_CALL(callback_,
282 TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000283 .Times(1)
284 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000285 }
286 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
287 EXPECT_EQ(0, send_bucket_->Process());
288 }
289 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000290 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000291 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
292 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000293 SendAndExpectPacket(PacedSender::kNormalPriority,
294 ssrc,
295 sequence_number++,
296 clock_.TimeInMilliseconds(),
297 250,
298 false);
299 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);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000311 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000312 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000313 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000314}
315
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000316TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
317 uint32_t ssrc = 12345;
318 uint16_t sequence_number = 1234;
319
320 SendAndExpectPacket(PacedSender::kNormalPriority,
321 ssrc,
322 sequence_number,
323 clock_.TimeInMilliseconds(),
324 250,
325 false);
326
327 // Expect packet on second ssrc to be queued and sent as well.
328 SendAndExpectPacket(PacedSender::kNormalPriority,
329 ssrc + 1,
330 sequence_number,
331 clock_.TimeInMilliseconds(),
332 250,
333 false);
334
335 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000336 send_bucket_->Process();
337}
338
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000339TEST_F(PacedSenderTest, Padding) {
340 uint32_t ssrc = 12345;
341 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000342
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000343 send_bucket_->UpdateBitrate(
344 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000345 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000346 SendAndExpectPacket(PacedSender::kNormalPriority,
347 ssrc,
348 sequence_number++,
349 clock_.TimeInMilliseconds(),
350 250,
351 false);
352 SendAndExpectPacket(PacedSender::kNormalPriority,
353 ssrc,
354 sequence_number++,
355 clock_.TimeInMilliseconds(),
356 250,
357 false);
358 SendAndExpectPacket(PacedSender::kNormalPriority,
359 ssrc,
360 sequence_number++,
361 clock_.TimeInMilliseconds(),
362 250,
363 false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000364 // No padding is expected since we have sent too much already.
365 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000366 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000367 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000368 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
369 EXPECT_EQ(0, send_bucket_->Process());
370
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000371 // 5 milliseconds later we have enough budget to send some padding.
372 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
373 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000374 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000375 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000376 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
377 EXPECT_EQ(0, send_bucket_->Process());
378}
379
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000380TEST_F(PacedSenderTest, NoPaddingWhenDisabled) {
381 send_bucket_->SetStatus(false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000382 send_bucket_->UpdateBitrate(
383 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000384 // No padding is expected since the pacer is disabled.
385 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
386 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000387 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000388 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
389 EXPECT_EQ(0, send_bucket_->Process());
390 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
391 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000392 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000393 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
394 EXPECT_EQ(0, send_bucket_->Process());
395}
396
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000397TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
398 uint32_t ssrc = 12345;
399 uint16_t sequence_number = 1234;
400 int64_t capture_time_ms = 56789;
401 const int kTimeStep = 5;
402 const int64_t kBitrateWindow = 100;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000403 send_bucket_->UpdateBitrate(
404 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000405 int64_t start_time = clock_.TimeInMilliseconds();
406 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000407 SendAndExpectPacket(PacedSender::kNormalPriority,
408 ssrc,
409 sequence_number++,
410 capture_time_ms,
411 250,
412 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000413 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000414 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
415 WillOnce(Return(250));
416 send_bucket_->Process();
417 }
418}
419
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000420TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
421 uint32_t ssrc = 12345;
422 uint16_t sequence_number = 1234;
423 int64_t capture_time_ms = 56789;
424 const int kTimeStep = 5;
425 const int64_t kBitrateWindow = 10000;
426 PacedSenderPadding callback;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000427 send_bucket_.reset(new PacedSender(
428 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000429 send_bucket_->SetProbingEnabled(false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000430 send_bucket_->UpdateBitrate(
431 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000432 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000433 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000434 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000435 size_t media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000436 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
437 sequence_number++, capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000438 media_payload, false));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000439 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000440 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000441 send_bucket_->Process();
442 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000443 EXPECT_NEAR(kTargetBitrate,
444 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
445 kBitrateWindow), 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000446}
447
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000448TEST_F(PacedSenderTest, Priority) {
449 uint32_t ssrc_low_priority = 12345;
450 uint32_t ssrc = 12346;
451 uint16_t sequence_number = 1234;
452 int64_t capture_time_ms = 56789;
453 int64_t capture_time_ms_low_priority = 1234567;
454
455 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000456 SendAndExpectPacket(PacedSender::kLowPriority,
457 ssrc,
458 sequence_number++,
459 capture_time_ms,
460 250,
461 false);
462 SendAndExpectPacket(PacedSender::kNormalPriority,
463 ssrc,
464 sequence_number++,
465 capture_time_ms,
466 250,
467 false);
468 SendAndExpectPacket(PacedSender::kNormalPriority,
469 ssrc,
470 sequence_number++,
471 capture_time_ms,
472 250,
473 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000474 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000475
476 // Expect normal and low priority to be queued and high to pass through.
477 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000478 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
479 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000480 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000481 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000482 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000483 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000484 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000485 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000486
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000487 // Expect all high and normal priority to be sent out first.
488 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000489 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000490 .Times(3)
491 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000492
493 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000494 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000495 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
496 EXPECT_EQ(0, send_bucket_->Process());
497
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000498 EXPECT_CALL(callback_,
499 TimeToSendPacket(
500 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000501 .Times(1)
502 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000503
504 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000505 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000506 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
507 EXPECT_EQ(0, send_bucket_->Process());
508}
509
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000510TEST_F(PacedSenderTest, Pause) {
511 uint32_t ssrc_low_priority = 12345;
512 uint32_t ssrc = 12346;
513 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000514 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000515
516 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000517
518 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000519 SendAndExpectPacket(PacedSender::kLowPriority,
520 ssrc,
521 sequence_number++,
522 capture_time_ms,
523 250,
524 false);
525 SendAndExpectPacket(PacedSender::kNormalPriority,
526 ssrc,
527 sequence_number++,
528 capture_time_ms,
529 250,
530 false);
531 SendAndExpectPacket(PacedSender::kNormalPriority,
532 ssrc,
533 sequence_number++,
534 capture_time_ms,
535 250,
536 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000537 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000538
539 send_bucket_->Pause();
540
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000541 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000542 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000543 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000544 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000545 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000546 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000547
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000548 clock_.AdvanceTimeMilliseconds(10000);
549 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000550
551 // Expect everything to be queued.
552 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
553 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
554 false));
555
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000556 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000557 send_bucket_->QueueInMs());
558
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000559 // Expect no packet to come out while paused.
560 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000561 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000562
563 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000564 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000565 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
566 EXPECT_EQ(0, send_bucket_->Process());
567 }
568 // Expect high prio packets to come out first followed by all packets in the
569 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000570 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000571 .Times(3)
572 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000573 send_bucket_->Resume();
574
575 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000576 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000577 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
578 EXPECT_EQ(0, send_bucket_->Process());
579
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000580 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000581 .Times(1)
582 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000583 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000584 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000585 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
586 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000587 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000588}
589
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000590TEST_F(PacedSenderTest, ResendPacket) {
591 uint32_t ssrc = 12346;
592 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000593 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000594 EXPECT_EQ(0, send_bucket_->QueueInMs());
595
596 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
597 ssrc,
598 sequence_number,
599 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000600 250,
601 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000602 clock_.AdvanceTimeMilliseconds(1);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000603 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
604 ssrc,
605 sequence_number + 1,
606 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000607 250,
608 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000609 clock_.AdvanceTimeMilliseconds(9999);
610 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000611 send_bucket_->QueueInMs());
612 // Fails to send first packet so only one call.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000613 EXPECT_CALL(callback_,
614 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, 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 remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000621 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000622 send_bucket_->QueueInMs());
623
624 // Fails to send second packet.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000625 EXPECT_CALL(callback_,
626 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000627 .Times(1)
628 .WillOnce(Return(true));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000629 EXPECT_CALL(
630 callback_,
631 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000632 .Times(1)
633 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000634 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000635 send_bucket_->Process();
636
637 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000638 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000639 send_bucket_->QueueInMs());
640
641 // Send second packet and queue becomes empty.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000642 EXPECT_CALL(
643 callback_,
644 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000645 .Times(1)
646 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000647 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000648 send_bucket_->Process();
649 EXPECT_EQ(0, send_bucket_->QueueInMs());
650}
651
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000652TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000653 uint32_t ssrc = 12346;
654 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000655 const size_t kNumPackets = 60;
656 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000657 const int32_t kMaxBitrate = kPaceMultiplier * 30;
658 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000659
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000660 send_bucket_->UpdateBitrate(30, kMaxBitrate, 0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000661 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000662 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
663 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000664 }
665
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000666 // Queue in ms = 1000 * (bytes in queue) / (kbit per second * 1000 / 8)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000667 int64_t queue_in_ms =
668 static_cast<int64_t>(kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000669 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000670
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000671 int64_t time_start = clock_.TimeInMilliseconds();
672 while (send_bucket_->QueueSizePackets() > 0) {
673 int time_until_process = send_bucket_->TimeUntilNextProcess();
674 if (time_until_process <= 0) {
675 send_bucket_->Process();
676 } else {
677 clock_.AdvanceTimeMilliseconds(time_until_process);
678 }
679 }
680 int64_t duration = clock_.TimeInMilliseconds() - time_start;
681
682 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
683
684 // Allow for aliasing, duration should be in [expected(n - 1), expected(n)].
685 EXPECT_LE(duration, queue_in_ms);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000686 EXPECT_GE(duration,
687 queue_in_ms - static_cast<int64_t>(kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000688}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000689
690TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
691 uint32_t ssrc = 12346;
692 uint16_t sequence_number = 1234;
693 EXPECT_EQ(0, send_bucket_->QueueInMs());
694
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000695 send_bucket_->UpdateBitrate(30, kPaceMultiplier * 30, 0);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000696 SendAndExpectPacket(PacedSender::kNormalPriority,
697 ssrc,
698 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000699 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000700 1200,
701 false);
702
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000703 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000704 EXPECT_EQ(500, send_bucket_->QueueInMs());
705 send_bucket_->Process();
706 EXPECT_EQ(0, send_bucket_->QueueInMs());
707}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000708
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000709TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000710 const int kNumPackets = 11;
711 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000712 const size_t kPacketSize = 1200;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000713 const int kInitialBitrateKbps = 300;
714 uint32_t ssrc = 12346;
715 uint16_t sequence_number = 1234;
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000716 const int expected_deltas[kNumDeltas] = {
717 10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000718 std::list<int> expected_deltas_list(expected_deltas,
719 expected_deltas + kNumPackets - 1);
720 PacedSenderProbing callback(expected_deltas_list, &clock_);
721 send_bucket_.reset(
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000722 new PacedSender(&clock_,
723 &callback,
724 kInitialBitrateKbps,
725 kPaceMultiplier * kInitialBitrateKbps,
726 0));
727
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000728 for (int i = 0; i < kNumPackets; ++i) {
729 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
730 ssrc,
731 sequence_number++,
732 clock_.TimeInMilliseconds(),
733 kPacketSize,
734 false));
735 }
736 while (callback.packets_sent() < kNumPackets) {
737 int time_until_process = send_bucket_->TimeUntilNextProcess();
738 if (time_until_process <= 0) {
739 send_bucket_->Process();
740 } else {
741 clock_.AdvanceTimeMilliseconds(time_until_process);
742 }
743 }
744}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000745
Stefan Holmer01b48882015-05-05 10:21:24 +0200746TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
747 const int kNumPackets = 11;
748 const int kNumDeltas = kNumPackets - 1;
749 const size_t kPacketSize = 1200;
750 const int kInitialBitrateKbps = 300;
751 uint32_t ssrc = 12346;
752 uint16_t sequence_number = 1234;
753 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
754 std::list<int> expected_deltas_list(expected_deltas,
755 expected_deltas + kNumPackets - 1);
756 PacedSenderProbing callback(expected_deltas_list, &clock_);
Stefan Holmer586b19b2015-09-18 11:14:31 +0200757 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateKbps,
758 kPaceMultiplier * kInitialBitrateKbps, 0));
Stefan Holmer01b48882015-05-05 10:21:24 +0200759
760 for (int i = 0; i < kNumPackets - 5; ++i) {
761 EXPECT_FALSE(send_bucket_->SendPacket(
762 PacedSender::kNormalPriority, ssrc, sequence_number++,
763 clock_.TimeInMilliseconds(), kPacketSize, false));
764 }
765 while (callback.packets_sent() < kNumPackets) {
766 int time_until_process = send_bucket_->TimeUntilNextProcess();
767 if (time_until_process <= 0) {
768 send_bucket_->Process();
769 } else {
770 clock_.AdvanceTimeMilliseconds(time_until_process);
771 }
772 }
773
774 // Process one more time and make sure we don't send any more probes.
775 int time_until_process = send_bucket_->TimeUntilNextProcess();
776 clock_.AdvanceTimeMilliseconds(time_until_process);
777 send_bucket_->Process();
778 EXPECT_EQ(kNumPackets, callback.packets_sent());
779}
780
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000781TEST_F(PacedSenderTest, PriorityInversion) {
782 uint32_t ssrc = 12346;
783 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000784 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000785
786 EXPECT_FALSE(send_bucket_->SendPacket(
787 PacedSender::kHighPriority, ssrc, sequence_number + 3,
788 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
789
790 EXPECT_FALSE(send_bucket_->SendPacket(
791 PacedSender::kHighPriority, ssrc, sequence_number + 2,
792 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
793
794 EXPECT_FALSE(send_bucket_->SendPacket(
795 PacedSender::kHighPriority, ssrc, sequence_number,
796 clock_.TimeInMilliseconds(), kPacketSize, true));
797
798 EXPECT_FALSE(send_bucket_->SendPacket(
799 PacedSender::kHighPriority, ssrc, sequence_number + 1,
800 clock_.TimeInMilliseconds(), kPacketSize, true));
801
802 // Packets from earlier frames should be sent first.
803 {
804 ::testing::InSequence sequence;
805 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
806 clock_.TimeInMilliseconds(), true))
807 .WillOnce(Return(true));
808 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
809 clock_.TimeInMilliseconds(), true))
810 .WillOnce(Return(true));
811 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
812 clock_.TimeInMilliseconds() + 33,
813 true)).WillOnce(Return(true));
814 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
815 clock_.TimeInMilliseconds() + 33,
816 true)).WillOnce(Return(true));
817
818 while (send_bucket_->QueueSizePackets() > 0) {
819 int time_until_process = send_bucket_->TimeUntilNextProcess();
820 if (time_until_process <= 0) {
821 send_bucket_->Process();
822 } else {
823 clock_.AdvanceTimeMilliseconds(time_until_process);
824 }
825 }
826 }
827}
828
829TEST_F(PacedSenderTest, PaddingOveruse) {
830 uint32_t ssrc = 12346;
831 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000832 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000833
834 // Min bitrate 0 => no padding, padding budget will stay at 0.
835 send_bucket_->UpdateBitrate(60, 90, 0);
836 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
837 clock_.TimeInMilliseconds(), kPacketSize, false);
838 send_bucket_->Process();
839
840 // Add 30kbit padding. When increasing budget, media budget will increase from
841 // negative (overuse) while padding budget will increase form 0.
842 clock_.AdvanceTimeMilliseconds(5);
843 send_bucket_->UpdateBitrate(60, 90, 30);
844
845 EXPECT_FALSE(send_bucket_->SendPacket(
846 PacedSender::kHighPriority, ssrc, sequence_number++,
847 clock_.TimeInMilliseconds(), kPacketSize, false));
848
849 // Don't send padding if queue is non-empty, even if padding budget > 0.
850 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
851 send_bucket_->Process();
852}
853
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000854} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000855} // namespace webrtc