blob: 4303b6474c8b03bc1ac42147aeee622d177e8e48 [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) {
74 ++packets_sent_;
75 EXPECT_FALSE(expected_deltas_.empty());
76 if (expected_deltas_.empty())
77 return false;
78 int64_t now_ms = clock_->TimeInMilliseconds();
79 if (prev_packet_time_ms_ >= 0) {
80 EXPECT_EQ(expected_deltas_.front(), now_ms - prev_packet_time_ms_);
81 expected_deltas_.pop_front();
82 }
83 prev_packet_time_ms_ = now_ms;
84 return true;
85 }
86
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000087 size_t TimeToSendPadding(size_t bytes) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000088 EXPECT_TRUE(false);
89 return bytes;
90 }
91
92 int packets_sent() const { return packets_sent_; }
93
94 private:
95 int64_t prev_packet_time_ms_;
96 std::list<int> expected_deltas_;
97 int packets_sent_;
98 Clock* clock_;
99};
100
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000101class PacedSenderTest : public ::testing::Test {
102 protected:
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000103 PacedSenderTest() : clock_(123456) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000104 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000105 // Need to initialize PacedSender after we initialize clock.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000106 send_bucket_.reset(new PacedSender(&clock_,
107 &callback_,
108 kTargetBitrate,
109 kPaceMultiplier * kTargetBitrate,
110 0));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000111 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000112
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000113 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000114 uint32_t ssrc,
115 uint16_t sequence_number,
116 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000117 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000118 bool retransmission) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000119 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000120 sequence_number, capture_time_ms, size, retransmission));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000121 EXPECT_CALL(callback_,
122 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000123 .Times(1)
124 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000125 }
126
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000127 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000128 MockPacedSenderCallback callback_;
129 scoped_ptr<PacedSender> send_bucket_;
130};
131
132TEST_F(PacedSenderTest, QueuePacket) {
133 uint32_t ssrc = 12345;
134 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000135 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000136 SendAndExpectPacket(PacedSender::kNormalPriority,
137 ssrc,
138 sequence_number++,
139 clock_.TimeInMilliseconds(),
140 250,
141 false);
142 SendAndExpectPacket(PacedSender::kNormalPriority,
143 ssrc,
144 sequence_number++,
145 clock_.TimeInMilliseconds(),
146 250,
147 false);
148 SendAndExpectPacket(PacedSender::kNormalPriority,
149 ssrc,
150 sequence_number++,
151 clock_.TimeInMilliseconds(),
152 250,
153 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000154 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000155 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000156 sequence_number, queued_packet_timestamp, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000157 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000158 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000159 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000160 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000161 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000162 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000163 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000164 EXPECT_CALL(
165 callback_,
166 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000167 .Times(1)
168 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000169 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000170 sequence_number++;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000171 SendAndExpectPacket(PacedSender::kNormalPriority,
172 ssrc,
173 sequence_number++,
174 clock_.TimeInMilliseconds(),
175 250,
176 false);
177 SendAndExpectPacket(PacedSender::kNormalPriority,
178 ssrc,
179 sequence_number++,
180 clock_.TimeInMilliseconds(),
181 250,
182 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000183 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000184 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000185 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000186}
187
188TEST_F(PacedSenderTest, PaceQueuedPackets) {
189 uint32_t ssrc = 12345;
190 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000191
192 // Due to the multiplicative factor we can send 3 packets not 2 packets.
193 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000194 SendAndExpectPacket(PacedSender::kNormalPriority,
195 ssrc,
196 sequence_number++,
197 clock_.TimeInMilliseconds(),
198 250,
199 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000200 }
201 for (int j = 0; j < 30; ++j) {
202 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000203 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000204 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000205 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000206 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000207 for (int k = 0; k < 10; ++k) {
208 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000209 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000210 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000211 .Times(3)
212 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000213 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
214 EXPECT_EQ(0, send_bucket_->Process());
215 }
216 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000217 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000218 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
219 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000220 SendAndExpectPacket(PacedSender::kNormalPriority,
221 ssrc,
222 sequence_number++,
223 clock_.TimeInMilliseconds(),
224 250,
225 false);
226 SendAndExpectPacket(PacedSender::kNormalPriority,
227 ssrc,
228 sequence_number++,
229 clock_.TimeInMilliseconds(),
230 250,
231 false);
232 SendAndExpectPacket(PacedSender::kNormalPriority,
233 ssrc,
234 sequence_number++,
235 clock_.TimeInMilliseconds(),
236 250,
237 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000238 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000239 sequence_number, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000240 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000241}
242
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000243TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
244 uint32_t ssrc = 12345;
245 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000246 uint16_t queued_sequence_number;
247
248 // Due to the multiplicative factor we can send 3 packets not 2 packets.
249 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000250 SendAndExpectPacket(PacedSender::kNormalPriority,
251 ssrc,
252 sequence_number++,
253 clock_.TimeInMilliseconds(),
254 250,
255 false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000256 }
257 queued_sequence_number = sequence_number;
258
259 for (int j = 0; j < 30; ++j) {
260 // Send in duplicate packets.
261 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000262 sequence_number, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000263 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000264 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000265 }
266 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000267 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000268 for (int k = 0; k < 10; ++k) {
269 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000270 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000271
272 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000273 EXPECT_CALL(callback_,
274 TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000275 .Times(1)
276 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000277 }
278 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
279 EXPECT_EQ(0, send_bucket_->Process());
280 }
281 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000282 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000283 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
284 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000285 SendAndExpectPacket(PacedSender::kNormalPriority,
286 ssrc,
287 sequence_number++,
288 clock_.TimeInMilliseconds(),
289 250,
290 false);
291 SendAndExpectPacket(PacedSender::kNormalPriority,
292 ssrc,
293 sequence_number++,
294 clock_.TimeInMilliseconds(),
295 250,
296 false);
297 SendAndExpectPacket(PacedSender::kNormalPriority,
298 ssrc,
299 sequence_number++,
300 clock_.TimeInMilliseconds(),
301 250,
302 false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000303 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000304 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000305 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000306}
307
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000308TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
309 uint32_t ssrc = 12345;
310 uint16_t sequence_number = 1234;
311
312 SendAndExpectPacket(PacedSender::kNormalPriority,
313 ssrc,
314 sequence_number,
315 clock_.TimeInMilliseconds(),
316 250,
317 false);
318
319 // Expect packet on second ssrc to be queued and sent as well.
320 SendAndExpectPacket(PacedSender::kNormalPriority,
321 ssrc + 1,
322 sequence_number,
323 clock_.TimeInMilliseconds(),
324 250,
325 false);
326
327 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000328 send_bucket_->Process();
329}
330
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000331TEST_F(PacedSenderTest, Padding) {
332 uint32_t ssrc = 12345;
333 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000334
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000335 send_bucket_->UpdateBitrate(
336 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000337 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000338 SendAndExpectPacket(PacedSender::kNormalPriority,
339 ssrc,
340 sequence_number++,
341 clock_.TimeInMilliseconds(),
342 250,
343 false);
344 SendAndExpectPacket(PacedSender::kNormalPriority,
345 ssrc,
346 sequence_number++,
347 clock_.TimeInMilliseconds(),
348 250,
349 false);
350 SendAndExpectPacket(PacedSender::kNormalPriority,
351 ssrc,
352 sequence_number++,
353 clock_.TimeInMilliseconds(),
354 250,
355 false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000356 // No padding is expected since we have sent too much already.
357 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000358 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000359 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000360 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
361 EXPECT_EQ(0, send_bucket_->Process());
362
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000363 // 5 milliseconds later we have enough budget to send some padding.
364 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
365 WillOnce(Return(250));
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}
371
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000372TEST_F(PacedSenderTest, NoPaddingWhenDisabled) {
373 send_bucket_->SetStatus(false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000374 send_bucket_->UpdateBitrate(
375 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000376 // No padding is expected since the pacer is disabled.
377 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
378 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000379 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000380 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
381 EXPECT_EQ(0, send_bucket_->Process());
382 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
383 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000384 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000385 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
386 EXPECT_EQ(0, send_bucket_->Process());
387}
388
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000389TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
390 uint32_t ssrc = 12345;
391 uint16_t sequence_number = 1234;
392 int64_t capture_time_ms = 56789;
393 const int kTimeStep = 5;
394 const int64_t kBitrateWindow = 100;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000395 send_bucket_->UpdateBitrate(
396 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000397 int64_t start_time = clock_.TimeInMilliseconds();
398 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000399 SendAndExpectPacket(PacedSender::kNormalPriority,
400 ssrc,
401 sequence_number++,
402 capture_time_ms,
403 250,
404 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000405 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000406 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
407 WillOnce(Return(250));
408 send_bucket_->Process();
409 }
410}
411
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000412TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
413 uint32_t ssrc = 12345;
414 uint16_t sequence_number = 1234;
415 int64_t capture_time_ms = 56789;
416 const int kTimeStep = 5;
417 const int64_t kBitrateWindow = 10000;
418 PacedSenderPadding callback;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000419 send_bucket_.reset(new PacedSender(
420 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0));
421 send_bucket_->UpdateBitrate(
422 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000423 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000424 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000425 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000426 size_t media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000427 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
428 sequence_number++, capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000429 media_payload, false));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000430 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000431 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000432 send_bucket_->Process();
433 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000434 EXPECT_NEAR(kTargetBitrate,
435 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
436 kBitrateWindow), 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000437}
438
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000439TEST_F(PacedSenderTest, Priority) {
440 uint32_t ssrc_low_priority = 12345;
441 uint32_t ssrc = 12346;
442 uint16_t sequence_number = 1234;
443 int64_t capture_time_ms = 56789;
444 int64_t capture_time_ms_low_priority = 1234567;
445
446 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000447 SendAndExpectPacket(PacedSender::kLowPriority,
448 ssrc,
449 sequence_number++,
450 capture_time_ms,
451 250,
452 false);
453 SendAndExpectPacket(PacedSender::kNormalPriority,
454 ssrc,
455 sequence_number++,
456 capture_time_ms,
457 250,
458 false);
459 SendAndExpectPacket(PacedSender::kNormalPriority,
460 ssrc,
461 sequence_number++,
462 capture_time_ms,
463 250,
464 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000465 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000466
467 // Expect normal and low priority to be queued and high to pass through.
468 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000469 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
470 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000471 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000472 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000473 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000474 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000475 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000476 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000477
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000478 // Expect all high and normal priority to be sent out first.
479 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000480 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000481 .Times(3)
482 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000483
484 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000485 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000486 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
487 EXPECT_EQ(0, send_bucket_->Process());
488
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000489 EXPECT_CALL(callback_,
490 TimeToSendPacket(
491 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000492 .Times(1)
493 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000494
495 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000496 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000497 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
498 EXPECT_EQ(0, send_bucket_->Process());
499}
500
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000501TEST_F(PacedSenderTest, Pause) {
502 uint32_t ssrc_low_priority = 12345;
503 uint32_t ssrc = 12346;
504 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000505 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000506
507 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000508
509 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000510 SendAndExpectPacket(PacedSender::kLowPriority,
511 ssrc,
512 sequence_number++,
513 capture_time_ms,
514 250,
515 false);
516 SendAndExpectPacket(PacedSender::kNormalPriority,
517 ssrc,
518 sequence_number++,
519 capture_time_ms,
520 250,
521 false);
522 SendAndExpectPacket(PacedSender::kNormalPriority,
523 ssrc,
524 sequence_number++,
525 capture_time_ms,
526 250,
527 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000528 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000529
530 send_bucket_->Pause();
531
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000532 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000533 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000534 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000535 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000536 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000537 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000538
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000539 clock_.AdvanceTimeMilliseconds(10000);
540 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000541
542 // Expect everything to be queued.
543 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
544 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
545 false));
546
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000547 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000548 send_bucket_->QueueInMs());
549
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000550 // Expect no packet to come out while paused.
551 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000552 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000553
554 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000555 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000556 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
557 EXPECT_EQ(0, send_bucket_->Process());
558 }
559 // Expect high prio packets to come out first followed by all packets in the
560 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000561 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000562 .Times(3)
563 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000564 send_bucket_->Resume();
565
566 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000567 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000568 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
569 EXPECT_EQ(0, send_bucket_->Process());
570
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000571 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000572 .Times(1)
573 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000574 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000575 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000576 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
577 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000578 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000579}
580
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000581TEST_F(PacedSenderTest, ResendPacket) {
582 uint32_t ssrc = 12346;
583 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000584 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000585 EXPECT_EQ(0, send_bucket_->QueueInMs());
586
587 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
588 ssrc,
589 sequence_number,
590 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000591 250,
592 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000593 clock_.AdvanceTimeMilliseconds(1);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000594 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
595 ssrc,
596 sequence_number + 1,
597 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000598 250,
599 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000600 clock_.AdvanceTimeMilliseconds(9999);
601 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000602 send_bucket_->QueueInMs());
603 // Fails to send first packet so only one call.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000604 EXPECT_CALL(callback_,
605 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000606 .Times(1)
607 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000608 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000609 send_bucket_->Process();
610
611 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000612 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000613 send_bucket_->QueueInMs());
614
615 // Fails to send second packet.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000616 EXPECT_CALL(callback_,
617 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000618 .Times(1)
619 .WillOnce(Return(true));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000620 EXPECT_CALL(
621 callback_,
622 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000623 .Times(1)
624 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000625 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000626 send_bucket_->Process();
627
628 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000629 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000630 send_bucket_->QueueInMs());
631
632 // Send second packet and queue becomes empty.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000633 EXPECT_CALL(
634 callback_,
635 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000636 .Times(1)
637 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000638 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000639 send_bucket_->Process();
640 EXPECT_EQ(0, send_bucket_->QueueInMs());
641}
642
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000643TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000644 uint32_t ssrc = 12346;
645 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000646 const size_t kNumPackets = 60;
647 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000648 const int32_t kMaxBitrate = kPaceMultiplier * 30;
649 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000650
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000651 send_bucket_->UpdateBitrate(30, kMaxBitrate, 0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000652 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000653 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
654 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000655 }
656
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000657 // Queue in ms = 1000 * (bytes in queue) / (kbit per second * 1000 / 8)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000658 int64_t queue_in_ms =
659 static_cast<int64_t>(kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000660 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000661
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000662 int64_t time_start = clock_.TimeInMilliseconds();
663 while (send_bucket_->QueueSizePackets() > 0) {
664 int time_until_process = send_bucket_->TimeUntilNextProcess();
665 if (time_until_process <= 0) {
666 send_bucket_->Process();
667 } else {
668 clock_.AdvanceTimeMilliseconds(time_until_process);
669 }
670 }
671 int64_t duration = clock_.TimeInMilliseconds() - time_start;
672
673 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
674
675 // Allow for aliasing, duration should be in [expected(n - 1), expected(n)].
676 EXPECT_LE(duration, queue_in_ms);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000677 EXPECT_GE(duration,
678 queue_in_ms - static_cast<int64_t>(kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000679}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000680
681TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
682 uint32_t ssrc = 12346;
683 uint16_t sequence_number = 1234;
684 EXPECT_EQ(0, send_bucket_->QueueInMs());
685
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000686 send_bucket_->UpdateBitrate(30, kPaceMultiplier * 30, 0);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000687 SendAndExpectPacket(PacedSender::kNormalPriority,
688 ssrc,
689 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000690 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000691 1200,
692 false);
693
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000694 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000695 EXPECT_EQ(500, send_bucket_->QueueInMs());
696 send_bucket_->Process();
697 EXPECT_EQ(0, send_bucket_->QueueInMs());
698}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000699
700class ProbingPacedSender : public PacedSender {
701 public:
702 ProbingPacedSender(Clock* clock,
703 Callback* callback,
704 int bitrate_kbps,
705 int max_bitrate_kbps,
706 int min_bitrate_kbps)
707 : PacedSender(clock,
708 callback,
709 bitrate_kbps,
710 max_bitrate_kbps,
711 min_bitrate_kbps) {}
712
713 virtual bool ProbingExperimentIsEnabled() const OVERRIDE { return true; }
714};
715
716TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000717 const int kNumPackets = 11;
718 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000719 const size_t kPacketSize = 1200;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000720 const int kInitialBitrateKbps = 300;
721 uint32_t ssrc = 12346;
722 uint16_t sequence_number = 1234;
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000723 const int expected_deltas[kNumDeltas] = {
724 10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000725 std::list<int> expected_deltas_list(expected_deltas,
726 expected_deltas + kNumPackets - 1);
727 PacedSenderProbing callback(expected_deltas_list, &clock_);
728 send_bucket_.reset(
729 new ProbingPacedSender(&clock_,
730 &callback,
731 kInitialBitrateKbps,
732 kPaceMultiplier * kInitialBitrateKbps,
733 0));
734 for (int i = 0; i < kNumPackets; ++i) {
735 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
736 ssrc,
737 sequence_number++,
738 clock_.TimeInMilliseconds(),
739 kPacketSize,
740 false));
741 }
742 while (callback.packets_sent() < kNumPackets) {
743 int time_until_process = send_bucket_->TimeUntilNextProcess();
744 if (time_until_process <= 0) {
745 send_bucket_->Process();
746 } else {
747 clock_.AdvanceTimeMilliseconds(time_until_process);
748 }
749 }
750}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000751
752TEST_F(PacedSenderTest, PriorityInversion) {
753 uint32_t ssrc = 12346;
754 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000755 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000756
757 EXPECT_FALSE(send_bucket_->SendPacket(
758 PacedSender::kHighPriority, ssrc, sequence_number + 3,
759 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
760
761 EXPECT_FALSE(send_bucket_->SendPacket(
762 PacedSender::kHighPriority, ssrc, sequence_number + 2,
763 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
764
765 EXPECT_FALSE(send_bucket_->SendPacket(
766 PacedSender::kHighPriority, ssrc, sequence_number,
767 clock_.TimeInMilliseconds(), kPacketSize, true));
768
769 EXPECT_FALSE(send_bucket_->SendPacket(
770 PacedSender::kHighPriority, ssrc, sequence_number + 1,
771 clock_.TimeInMilliseconds(), kPacketSize, true));
772
773 // Packets from earlier frames should be sent first.
774 {
775 ::testing::InSequence sequence;
776 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
777 clock_.TimeInMilliseconds(), true))
778 .WillOnce(Return(true));
779 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
780 clock_.TimeInMilliseconds(), true))
781 .WillOnce(Return(true));
782 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
783 clock_.TimeInMilliseconds() + 33,
784 true)).WillOnce(Return(true));
785 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
786 clock_.TimeInMilliseconds() + 33,
787 true)).WillOnce(Return(true));
788
789 while (send_bucket_->QueueSizePackets() > 0) {
790 int time_until_process = send_bucket_->TimeUntilNextProcess();
791 if (time_until_process <= 0) {
792 send_bucket_->Process();
793 } else {
794 clock_.AdvanceTimeMilliseconds(time_until_process);
795 }
796 }
797 }
798}
799
800TEST_F(PacedSenderTest, PaddingOveruse) {
801 uint32_t ssrc = 12346;
802 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000803 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000804
805 // Min bitrate 0 => no padding, padding budget will stay at 0.
806 send_bucket_->UpdateBitrate(60, 90, 0);
807 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
808 clock_.TimeInMilliseconds(), kPacketSize, false);
809 send_bucket_->Process();
810
811 // Add 30kbit padding. When increasing budget, media budget will increase from
812 // negative (overuse) while padding budget will increase form 0.
813 clock_.AdvanceTimeMilliseconds(5);
814 send_bucket_->UpdateBitrate(60, 90, 30);
815
816 EXPECT_FALSE(send_bucket_->SendPacket(
817 PacedSender::kHighPriority, ssrc, sequence_number++,
818 clock_.TimeInMilliseconds(), kPacketSize, false));
819
820 // Don't send padding if queue is non-empty, even if padding budget > 0.
821 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
822 send_bucket_->Process();
823}
824
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000825} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000826} // namespace webrtc