blob: 34787d16b4f199bba21745ca73799063d2828fb9 [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,
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000035 int(int bytes));
36};
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
49 int TimeToSendPadding(int bytes) {
50 const int kPaddingPacketSize = 224;
51 int num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
52 padding_sent_ += kPaddingPacketSize * num_packets;
53 return kPaddingPacketSize * num_packets;
54 }
55
56 int padding_sent() { return padding_sent_; }
57
58 private:
59 int 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
87 int TimeToSendPadding(int bytes) {
88 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,
117 int 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();
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000424 int media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000425 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000426 int 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 }
434 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
435 kBitrateWindow, 1);
436}
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.
467 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000468 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
469 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000470 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000471 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000472 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000473 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000474 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000475 ssrc, 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
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000531 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000532 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000533 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000534 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000535 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000536 ssrc, 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.
542 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
543 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
544 false));
545
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
586 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
587 ssrc,
588 sequence_number,
589 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000590 250,
591 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000592 clock_.AdvanceTimeMilliseconds(1);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000593 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
594 ssrc,
595 sequence_number + 1,
596 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000597 250,
598 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000599 clock_.AdvanceTimeMilliseconds(9999);
600 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000601 send_bucket_->QueueInMs());
602 // Fails to send first packet so only one call.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000603 EXPECT_CALL(callback_,
604 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000605 .Times(1)
606 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000607 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000608 send_bucket_->Process();
609
610 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000611 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000612 send_bucket_->QueueInMs());
613
614 // Fails to send second packet.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000615 EXPECT_CALL(callback_,
616 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000617 .Times(1)
618 .WillOnce(Return(true));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000619 EXPECT_CALL(
620 callback_,
621 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000622 .Times(1)
623 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000624 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000625 send_bucket_->Process();
626
627 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000628 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000629 send_bucket_->QueueInMs());
630
631 // Send second packet and queue becomes empty.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000632 EXPECT_CALL(
633 callback_,
634 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000635 .Times(1)
636 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000637 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000638 send_bucket_->Process();
639 EXPECT_EQ(0, send_bucket_->QueueInMs());
640}
641
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000642TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000643 uint32_t ssrc = 12346;
644 uint16_t sequence_number = 1234;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000645 const int32_t kNumPackets = 60;
646 const int32_t kPacketSize = 1200;
647 const int32_t kMaxBitrate = kPaceMultiplier * 30;
648 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000649
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000650 send_bucket_->UpdateBitrate(30, kMaxBitrate, 0);
651 for (int i = 0; i < kNumPackets; ++i) {
652 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
653 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000654 }
655
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000656 // Queue in ms = 1000 * (bytes in queue) / (kbit per second * 1000 / 8)
657 int32_t queue_in_ms = kNumPackets * kPacketSize * 8 / kMaxBitrate;
658 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000659
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000660 int64_t time_start = clock_.TimeInMilliseconds();
661 while (send_bucket_->QueueSizePackets() > 0) {
662 int time_until_process = send_bucket_->TimeUntilNextProcess();
663 if (time_until_process <= 0) {
664 send_bucket_->Process();
665 } else {
666 clock_.AdvanceTimeMilliseconds(time_until_process);
667 }
668 }
669 int64_t duration = clock_.TimeInMilliseconds() - time_start;
670
671 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
672
673 // Allow for aliasing, duration should be in [expected(n - 1), expected(n)].
674 EXPECT_LE(duration, queue_in_ms);
675 EXPECT_GE(duration, queue_in_ms - (kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000676}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000677
678TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
679 uint32_t ssrc = 12346;
680 uint16_t sequence_number = 1234;
681 EXPECT_EQ(0, send_bucket_->QueueInMs());
682
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000683 send_bucket_->UpdateBitrate(30, kPaceMultiplier * 30, 0);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000684 SendAndExpectPacket(PacedSender::kNormalPriority,
685 ssrc,
686 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000687 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000688 1200,
689 false);
690
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000691 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000692 EXPECT_EQ(500, send_bucket_->QueueInMs());
693 send_bucket_->Process();
694 EXPECT_EQ(0, send_bucket_->QueueInMs());
695}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000696
697class ProbingPacedSender : public PacedSender {
698 public:
699 ProbingPacedSender(Clock* clock,
700 Callback* callback,
701 int bitrate_kbps,
702 int max_bitrate_kbps,
703 int min_bitrate_kbps)
704 : PacedSender(clock,
705 callback,
706 bitrate_kbps,
707 max_bitrate_kbps,
708 min_bitrate_kbps) {}
709
710 virtual bool ProbingExperimentIsEnabled() const OVERRIDE { return true; }
711};
712
713TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
714 const int kNumPackets = 15;
715 const int kPacketSize = 1200;
716 const int kInitialBitrateKbps = 300;
717 uint32_t ssrc = 12346;
718 uint16_t sequence_number = 1234;
719 const int expected_deltas[kNumPackets - 1] = {
720 12, 12, 12, 12, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5};
721 std::list<int> expected_deltas_list(expected_deltas,
722 expected_deltas + kNumPackets - 1);
723 PacedSenderProbing callback(expected_deltas_list, &clock_);
724 send_bucket_.reset(
725 new ProbingPacedSender(&clock_,
726 &callback,
727 kInitialBitrateKbps,
728 kPaceMultiplier * kInitialBitrateKbps,
729 0));
730 for (int i = 0; i < kNumPackets; ++i) {
731 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
732 ssrc,
733 sequence_number++,
734 clock_.TimeInMilliseconds(),
735 kPacketSize,
736 false));
737 }
738 while (callback.packets_sent() < kNumPackets) {
739 int time_until_process = send_bucket_->TimeUntilNextProcess();
740 if (time_until_process <= 0) {
741 send_bucket_->Process();
742 } else {
743 clock_.AdvanceTimeMilliseconds(time_until_process);
744 }
745 }
746}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000747
748TEST_F(PacedSenderTest, PriorityInversion) {
749 uint32_t ssrc = 12346;
750 uint16_t sequence_number = 1234;
751 const int32_t kPacketSize = 1200;
752
753 EXPECT_FALSE(send_bucket_->SendPacket(
754 PacedSender::kHighPriority, ssrc, sequence_number + 3,
755 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
756
757 EXPECT_FALSE(send_bucket_->SendPacket(
758 PacedSender::kHighPriority, ssrc, sequence_number + 2,
759 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
760
761 EXPECT_FALSE(send_bucket_->SendPacket(
762 PacedSender::kHighPriority, ssrc, sequence_number,
763 clock_.TimeInMilliseconds(), kPacketSize, true));
764
765 EXPECT_FALSE(send_bucket_->SendPacket(
766 PacedSender::kHighPriority, ssrc, sequence_number + 1,
767 clock_.TimeInMilliseconds(), kPacketSize, true));
768
769 // Packets from earlier frames should be sent first.
770 {
771 ::testing::InSequence sequence;
772 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
773 clock_.TimeInMilliseconds(), true))
774 .WillOnce(Return(true));
775 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
776 clock_.TimeInMilliseconds(), true))
777 .WillOnce(Return(true));
778 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
779 clock_.TimeInMilliseconds() + 33,
780 true)).WillOnce(Return(true));
781 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
782 clock_.TimeInMilliseconds() + 33,
783 true)).WillOnce(Return(true));
784
785 while (send_bucket_->QueueSizePackets() > 0) {
786 int time_until_process = send_bucket_->TimeUntilNextProcess();
787 if (time_until_process <= 0) {
788 send_bucket_->Process();
789 } else {
790 clock_.AdvanceTimeMilliseconds(time_until_process);
791 }
792 }
793 }
794}
795
796TEST_F(PacedSenderTest, PaddingOveruse) {
797 uint32_t ssrc = 12346;
798 uint16_t sequence_number = 1234;
799 const int32_t kPacketSize = 1200;
800
801 // Min bitrate 0 => no padding, padding budget will stay at 0.
802 send_bucket_->UpdateBitrate(60, 90, 0);
803 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
804 clock_.TimeInMilliseconds(), kPacketSize, false);
805 send_bucket_->Process();
806
807 // Add 30kbit padding. When increasing budget, media budget will increase from
808 // negative (overuse) while padding budget will increase form 0.
809 clock_.AdvanceTimeMilliseconds(5);
810 send_bucket_->UpdateBitrate(60, 90, 30);
811
812 EXPECT_FALSE(send_bucket_->SendPacket(
813 PacedSender::kHighPriority, ssrc, sequence_number++,
814 clock_.TimeInMilliseconds(), kPacketSize, false));
815
816 // Don't send padding if queue is non-empty, even if padding budget > 0.
817 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
818 send_bucket_->Process();
819}
820
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000821} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000822} // namespace webrtc