blob: e82a49e7cc8bfc46c7e274bb001b8b3cc60f3870 [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));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000111 // Default to bitrate probing disabled for testing purposes. Probing tests
112 // have to enable probing, either by creating a new PacedSender instance or
113 // by calling SetProbingEnabled(true).
114 send_bucket_->SetProbingEnabled(false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000115 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000116
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000117 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000118 uint32_t ssrc,
119 uint16_t sequence_number,
120 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000121 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000122 bool retransmission) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000123 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000124 sequence_number, capture_time_ms, size, retransmission));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000125 EXPECT_CALL(callback_,
126 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000127 .Times(1)
128 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000129 }
130
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000131 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000132 MockPacedSenderCallback callback_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000133 rtc::scoped_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000134};
135
136TEST_F(PacedSenderTest, QueuePacket) {
137 uint32_t ssrc = 12345;
138 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000139 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000140 SendAndExpectPacket(PacedSender::kNormalPriority,
141 ssrc,
142 sequence_number++,
143 clock_.TimeInMilliseconds(),
144 250,
145 false);
146 SendAndExpectPacket(PacedSender::kNormalPriority,
147 ssrc,
148 sequence_number++,
149 clock_.TimeInMilliseconds(),
150 250,
151 false);
152 SendAndExpectPacket(PacedSender::kNormalPriority,
153 ssrc,
154 sequence_number++,
155 clock_.TimeInMilliseconds(),
156 250,
157 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000158 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000159 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000160 sequence_number, queued_packet_timestamp, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000161 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000162 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000163 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000164 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000165 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000166 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000167 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000168 EXPECT_CALL(
169 callback_,
170 TimeToSendPacket(ssrc, sequence_number++, queued_packet_timestamp, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000171 .Times(1)
172 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000173 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000174 sequence_number++;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000175 SendAndExpectPacket(PacedSender::kNormalPriority,
176 ssrc,
177 sequence_number++,
178 clock_.TimeInMilliseconds(),
179 250,
180 false);
181 SendAndExpectPacket(PacedSender::kNormalPriority,
182 ssrc,
183 sequence_number++,
184 clock_.TimeInMilliseconds(),
185 250,
186 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000187 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000188 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000189 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000190}
191
192TEST_F(PacedSenderTest, PaceQueuedPackets) {
193 uint32_t ssrc = 12345;
194 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000195
196 // Due to the multiplicative factor we can send 3 packets not 2 packets.
197 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000198 SendAndExpectPacket(PacedSender::kNormalPriority,
199 ssrc,
200 sequence_number++,
201 clock_.TimeInMilliseconds(),
202 250,
203 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000204 }
205 for (int j = 0; j < 30; ++j) {
206 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000207 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000208 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000209 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000210 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000211 for (int k = 0; k < 10; ++k) {
212 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000213 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000214 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000215 .Times(3)
216 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000217 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
218 EXPECT_EQ(0, send_bucket_->Process());
219 }
220 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000221 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000222 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
223 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000224 SendAndExpectPacket(PacedSender::kNormalPriority,
225 ssrc,
226 sequence_number++,
227 clock_.TimeInMilliseconds(),
228 250,
229 false);
230 SendAndExpectPacket(PacedSender::kNormalPriority,
231 ssrc,
232 sequence_number++,
233 clock_.TimeInMilliseconds(),
234 250,
235 false);
236 SendAndExpectPacket(PacedSender::kNormalPriority,
237 ssrc,
238 sequence_number++,
239 clock_.TimeInMilliseconds(),
240 250,
241 false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000242 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000243 sequence_number, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000244 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000245}
246
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000247TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
248 uint32_t ssrc = 12345;
249 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000250 uint16_t queued_sequence_number;
251
252 // Due to the multiplicative factor we can send 3 packets not 2 packets.
253 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000254 SendAndExpectPacket(PacedSender::kNormalPriority,
255 ssrc,
256 sequence_number++,
257 clock_.TimeInMilliseconds(),
258 250,
259 false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000260 }
261 queued_sequence_number = sequence_number;
262
263 for (int j = 0; j < 30; ++j) {
264 // Send in duplicate packets.
265 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000266 sequence_number, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000267 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000268 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000269 }
270 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000271 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000272 for (int k = 0; k < 10; ++k) {
273 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000274 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000275
276 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000277 EXPECT_CALL(callback_,
278 TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000279 .Times(1)
280 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000281 }
282 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
283 EXPECT_EQ(0, send_bucket_->Process());
284 }
285 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000286 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000287 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
288 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000289 SendAndExpectPacket(PacedSender::kNormalPriority,
290 ssrc,
291 sequence_number++,
292 clock_.TimeInMilliseconds(),
293 250,
294 false);
295 SendAndExpectPacket(PacedSender::kNormalPriority,
296 ssrc,
297 sequence_number++,
298 clock_.TimeInMilliseconds(),
299 250,
300 false);
301 SendAndExpectPacket(PacedSender::kNormalPriority,
302 ssrc,
303 sequence_number++,
304 clock_.TimeInMilliseconds(),
305 250,
306 false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000307 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000308 sequence_number++, clock_.TimeInMilliseconds(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000309 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000310}
311
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000312TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
313 uint32_t ssrc = 12345;
314 uint16_t sequence_number = 1234;
315
316 SendAndExpectPacket(PacedSender::kNormalPriority,
317 ssrc,
318 sequence_number,
319 clock_.TimeInMilliseconds(),
320 250,
321 false);
322
323 // Expect packet on second ssrc to be queued and sent as well.
324 SendAndExpectPacket(PacedSender::kNormalPriority,
325 ssrc + 1,
326 sequence_number,
327 clock_.TimeInMilliseconds(),
328 250,
329 false);
330
331 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000332 send_bucket_->Process();
333}
334
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000335TEST_F(PacedSenderTest, Padding) {
336 uint32_t ssrc = 12345;
337 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000338
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000339 send_bucket_->UpdateBitrate(
340 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000341 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000342 SendAndExpectPacket(PacedSender::kNormalPriority,
343 ssrc,
344 sequence_number++,
345 clock_.TimeInMilliseconds(),
346 250,
347 false);
348 SendAndExpectPacket(PacedSender::kNormalPriority,
349 ssrc,
350 sequence_number++,
351 clock_.TimeInMilliseconds(),
352 250,
353 false);
354 SendAndExpectPacket(PacedSender::kNormalPriority,
355 ssrc,
356 sequence_number++,
357 clock_.TimeInMilliseconds(),
358 250,
359 false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000360 // No padding is expected since we have sent too much already.
361 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000362 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000363 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000364 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
365 EXPECT_EQ(0, send_bucket_->Process());
366
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000367 // 5 milliseconds later we have enough budget to send some padding.
368 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
369 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000370 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000371 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000372 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
373 EXPECT_EQ(0, send_bucket_->Process());
374}
375
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000376TEST_F(PacedSenderTest, NoPaddingWhenDisabled) {
377 send_bucket_->SetStatus(false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000378 send_bucket_->UpdateBitrate(
379 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000380 // No padding is expected since the pacer is disabled.
381 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
382 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000383 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000384 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
385 EXPECT_EQ(0, send_bucket_->Process());
386 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
387 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000388 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000389 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
390 EXPECT_EQ(0, send_bucket_->Process());
391}
392
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000393TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
394 uint32_t ssrc = 12345;
395 uint16_t sequence_number = 1234;
396 int64_t capture_time_ms = 56789;
397 const int kTimeStep = 5;
398 const int64_t kBitrateWindow = 100;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000399 send_bucket_->UpdateBitrate(
400 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000401 int64_t start_time = clock_.TimeInMilliseconds();
402 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000403 SendAndExpectPacket(PacedSender::kNormalPriority,
404 ssrc,
405 sequence_number++,
406 capture_time_ms,
407 250,
408 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000409 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000410 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
411 WillOnce(Return(250));
412 send_bucket_->Process();
413 }
414}
415
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000416TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
417 uint32_t ssrc = 12345;
418 uint16_t sequence_number = 1234;
419 int64_t capture_time_ms = 56789;
420 const int kTimeStep = 5;
421 const int64_t kBitrateWindow = 10000;
422 PacedSenderPadding callback;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000423 send_bucket_.reset(new PacedSender(
424 &clock_, &callback, kTargetBitrate, kPaceMultiplier * kTargetBitrate, 0));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000425 send_bucket_->SetProbingEnabled(false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000426 send_bucket_->UpdateBitrate(
427 kTargetBitrate, kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000428 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000429 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000430 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000431 size_t media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000432 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
433 sequence_number++, capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000434 media_payload, false));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000435 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000436 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000437 send_bucket_->Process();
438 }
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000439 EXPECT_NEAR(kTargetBitrate,
440 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
441 kBitrateWindow), 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000442}
443
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000444TEST_F(PacedSenderTest, Priority) {
445 uint32_t ssrc_low_priority = 12345;
446 uint32_t ssrc = 12346;
447 uint16_t sequence_number = 1234;
448 int64_t capture_time_ms = 56789;
449 int64_t capture_time_ms_low_priority = 1234567;
450
451 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000452 SendAndExpectPacket(PacedSender::kLowPriority,
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);
464 SendAndExpectPacket(PacedSender::kNormalPriority,
465 ssrc,
466 sequence_number++,
467 capture_time_ms,
468 250,
469 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000470 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000471
472 // Expect normal and low priority to be queued and high to pass through.
473 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000474 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
475 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000476 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000477 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000478 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000479 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000480 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
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
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000483 // Expect all high and normal priority to be sent out first.
484 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000485 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000486 .Times(3)
487 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000488
489 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000490 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000491 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
492 EXPECT_EQ(0, send_bucket_->Process());
493
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000494 EXPECT_CALL(callback_,
495 TimeToSendPacket(
496 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000497 .Times(1)
498 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000499
500 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000501 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000502 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
503 EXPECT_EQ(0, send_bucket_->Process());
504}
505
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000506TEST_F(PacedSenderTest, Pause) {
507 uint32_t ssrc_low_priority = 12345;
508 uint32_t ssrc = 12346;
509 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000510 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000511
512 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000513
514 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000515 SendAndExpectPacket(PacedSender::kLowPriority,
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);
527 SendAndExpectPacket(PacedSender::kNormalPriority,
528 ssrc,
529 sequence_number++,
530 capture_time_ms,
531 250,
532 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000533 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000534
535 send_bucket_->Pause();
536
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000537 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000538 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000539 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000540 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000541 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
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
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000544 clock_.AdvanceTimeMilliseconds(10000);
545 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000546
547 // Expect everything to be queued.
548 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
549 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
550 false));
551
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000552 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000553 send_bucket_->QueueInMs());
554
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000555 // Expect no packet to come out while paused.
556 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000557 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000558
559 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000560 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000561 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
562 EXPECT_EQ(0, send_bucket_->Process());
563 }
564 // Expect high prio packets to come out first followed by all packets in the
565 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000566 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000567 .Times(3)
568 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000569 send_bucket_->Resume();
570
571 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000572 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000573 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
574 EXPECT_EQ(0, send_bucket_->Process());
575
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000576 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000577 .Times(1)
578 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000579 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000580 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000581 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
582 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000583 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000584}
585
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000586TEST_F(PacedSenderTest, ResendPacket) {
587 uint32_t ssrc = 12346;
588 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000589 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000590 EXPECT_EQ(0, send_bucket_->QueueInMs());
591
592 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
593 ssrc,
594 sequence_number,
595 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000596 250,
597 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000598 clock_.AdvanceTimeMilliseconds(1);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000599 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
600 ssrc,
601 sequence_number + 1,
602 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000603 250,
604 false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000605 clock_.AdvanceTimeMilliseconds(9999);
606 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000607 send_bucket_->QueueInMs());
608 // Fails to send first packet so only one call.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000609 EXPECT_CALL(callback_,
610 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000611 .Times(1)
612 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000613 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000614 send_bucket_->Process();
615
616 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000617 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000618 send_bucket_->QueueInMs());
619
620 // Fails to send second packet.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000621 EXPECT_CALL(callback_,
622 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000623 .Times(1)
624 .WillOnce(Return(true));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000625 EXPECT_CALL(
626 callback_,
627 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000628 .Times(1)
629 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000630 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000631 send_bucket_->Process();
632
633 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000634 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000635 send_bucket_->QueueInMs());
636
637 // Send second packet and queue becomes empty.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000638 EXPECT_CALL(
639 callback_,
640 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000641 .Times(1)
642 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000643 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000644 send_bucket_->Process();
645 EXPECT_EQ(0, send_bucket_->QueueInMs());
646}
647
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000648TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000649 uint32_t ssrc = 12346;
650 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000651 const size_t kNumPackets = 60;
652 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000653 const int32_t kMaxBitrate = kPaceMultiplier * 30;
654 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000655
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000656 send_bucket_->UpdateBitrate(30, kMaxBitrate, 0);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000657 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000658 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
659 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000660 }
661
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000662 // Queue in ms = 1000 * (bytes in queue) / (kbit per second * 1000 / 8)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000663 int64_t queue_in_ms =
664 static_cast<int64_t>(kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000665 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000666
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000667 int64_t time_start = clock_.TimeInMilliseconds();
668 while (send_bucket_->QueueSizePackets() > 0) {
669 int time_until_process = send_bucket_->TimeUntilNextProcess();
670 if (time_until_process <= 0) {
671 send_bucket_->Process();
672 } else {
673 clock_.AdvanceTimeMilliseconds(time_until_process);
674 }
675 }
676 int64_t duration = clock_.TimeInMilliseconds() - time_start;
677
678 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
679
680 // Allow for aliasing, duration should be in [expected(n - 1), expected(n)].
681 EXPECT_LE(duration, queue_in_ms);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000682 EXPECT_GE(duration,
683 queue_in_ms - static_cast<int64_t>(kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000684}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000685
686TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
687 uint32_t ssrc = 12346;
688 uint16_t sequence_number = 1234;
689 EXPECT_EQ(0, send_bucket_->QueueInMs());
690
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000691 send_bucket_->UpdateBitrate(30, kPaceMultiplier * 30, 0);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000692 SendAndExpectPacket(PacedSender::kNormalPriority,
693 ssrc,
694 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000695 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000696 1200,
697 false);
698
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000699 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000700 EXPECT_EQ(500, send_bucket_->QueueInMs());
701 send_bucket_->Process();
702 EXPECT_EQ(0, send_bucket_->QueueInMs());
703}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000704
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000705TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000706 const int kNumPackets = 11;
707 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000708 const size_t kPacketSize = 1200;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000709 const int kInitialBitrateKbps = 300;
710 uint32_t ssrc = 12346;
711 uint16_t sequence_number = 1234;
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000712 const int expected_deltas[kNumDeltas] = {
713 10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000714 std::list<int> expected_deltas_list(expected_deltas,
715 expected_deltas + kNumPackets - 1);
716 PacedSenderProbing callback(expected_deltas_list, &clock_);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000717 // Probing implicitly enabled by creating a new PacedSender which defaults to
718 // probing on.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000719 send_bucket_.reset(
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000720 new PacedSender(&clock_,
721 &callback,
722 kInitialBitrateKbps,
723 kPaceMultiplier * kInitialBitrateKbps,
724 0));
725
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000726 for (int i = 0; i < kNumPackets; ++i) {
727 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
728 ssrc,
729 sequence_number++,
730 clock_.TimeInMilliseconds(),
731 kPacketSize,
732 false));
733 }
734 while (callback.packets_sent() < kNumPackets) {
735 int time_until_process = send_bucket_->TimeUntilNextProcess();
736 if (time_until_process <= 0) {
737 send_bucket_->Process();
738 } else {
739 clock_.AdvanceTimeMilliseconds(time_until_process);
740 }
741 }
742}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000743
744TEST_F(PacedSenderTest, PriorityInversion) {
745 uint32_t ssrc = 12346;
746 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000747 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000748
749 EXPECT_FALSE(send_bucket_->SendPacket(
750 PacedSender::kHighPriority, ssrc, sequence_number + 3,
751 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
752
753 EXPECT_FALSE(send_bucket_->SendPacket(
754 PacedSender::kHighPriority, ssrc, sequence_number + 2,
755 clock_.TimeInMilliseconds() + 33, kPacketSize, true));
756
757 EXPECT_FALSE(send_bucket_->SendPacket(
758 PacedSender::kHighPriority, ssrc, sequence_number,
759 clock_.TimeInMilliseconds(), kPacketSize, true));
760
761 EXPECT_FALSE(send_bucket_->SendPacket(
762 PacedSender::kHighPriority, ssrc, sequence_number + 1,
763 clock_.TimeInMilliseconds(), kPacketSize, true));
764
765 // Packets from earlier frames should be sent first.
766 {
767 ::testing::InSequence sequence;
768 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
769 clock_.TimeInMilliseconds(), true))
770 .WillOnce(Return(true));
771 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
772 clock_.TimeInMilliseconds(), true))
773 .WillOnce(Return(true));
774 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
775 clock_.TimeInMilliseconds() + 33,
776 true)).WillOnce(Return(true));
777 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
778 clock_.TimeInMilliseconds() + 33,
779 true)).WillOnce(Return(true));
780
781 while (send_bucket_->QueueSizePackets() > 0) {
782 int time_until_process = send_bucket_->TimeUntilNextProcess();
783 if (time_until_process <= 0) {
784 send_bucket_->Process();
785 } else {
786 clock_.AdvanceTimeMilliseconds(time_until_process);
787 }
788 }
789 }
790}
791
792TEST_F(PacedSenderTest, PaddingOveruse) {
793 uint32_t ssrc = 12346;
794 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000795 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000796
797 // Min bitrate 0 => no padding, padding budget will stay at 0.
798 send_bucket_->UpdateBitrate(60, 90, 0);
799 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
800 clock_.TimeInMilliseconds(), kPacketSize, false);
801 send_bucket_->Process();
802
803 // Add 30kbit padding. When increasing budget, media budget will increase from
804 // negative (overuse) while padding budget will increase form 0.
805 clock_.AdvanceTimeMilliseconds(5);
806 send_bucket_->UpdateBitrate(60, 90, 30);
807
808 EXPECT_FALSE(send_bucket_->SendPacket(
809 PacedSender::kHighPriority, ssrc, sequence_number++,
810 clock_.TimeInMilliseconds(), kPacketSize, false));
811
812 // Don't send padding if queue is non-empty, even if padding budget > 0.
813 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
814 send_bucket_->Process();
815}
816
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000817} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000818} // namespace webrtc