blob: 49d18eef435a186bf313f389905545e31f455c69 [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
11#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
14#include "webrtc/modules/pacing/include/paced_sender.h"
15
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000016using testing::_;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000017using testing::Return;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000018
19namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000020namespace test {
21
22static const int kTargetBitrate = 800;
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000023static const float kPaceMultiplier = 1.5f;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000024
25class MockPacedSenderCallback : public PacedSender::Callback {
26 public:
27 MOCK_METHOD3(TimeToSendPacket,
28 void(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms));
29 MOCK_METHOD1(TimeToSendPadding,
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000030 int(int bytes));
31};
32
33class PacedSenderPadding : public PacedSender::Callback {
34 public:
35 PacedSenderPadding() : padding_sent_(0) {}
36
37 void TimeToSendPacket(uint32_t ssrc, uint16_t sequence_number,
38 int64_t capture_time_ms) {
39 }
40
41 int TimeToSendPadding(int bytes) {
42 const int kPaddingPacketSize = 224;
43 int num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
44 padding_sent_ += kPaddingPacketSize * num_packets;
45 return kPaddingPacketSize * num_packets;
46 }
47
48 int padding_sent() { return padding_sent_; }
49
50 private:
51 int padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000052};
53
54class PacedSenderTest : public ::testing::Test {
55 protected:
56 PacedSenderTest() {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000057 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000058 TickTime::UseFakeClock(123456);
59 // Need to initialize PacedSender after we initialize clock.
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000060 send_bucket_.reset(new PacedSender(&callback_, kTargetBitrate,
61 kPaceMultiplier));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000062 send_bucket_->SetStatus(true);
63 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000064
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000065 MockPacedSenderCallback callback_;
66 scoped_ptr<PacedSender> send_bucket_;
67};
68
69TEST_F(PacedSenderTest, QueuePacket) {
70 uint32_t ssrc = 12345;
71 uint16_t sequence_number = 1234;
72 int64_t capture_time_ms = 56789;
73
74 // Due to the multiplicative factor we can send 3 packets not 2 packets.
75 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
76 sequence_number++, capture_time_ms, 250));
77 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
78 sequence_number++, capture_time_ms, 250));
79 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
80 sequence_number++, capture_time_ms, 250));
81 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
82 sequence_number, capture_time_ms, 250));
83 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000084 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000085 EXPECT_CALL(callback_,
86 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
87 TickTime::AdvanceFakeClock(4);
88 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
89 EXPECT_CALL(callback_,
90 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(1);
91 TickTime::AdvanceFakeClock(1);
92 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
93 EXPECT_EQ(0, send_bucket_->Process());
94 sequence_number++;
95 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
96 sequence_number++, capture_time_ms, 250));
97 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
98 sequence_number++, capture_time_ms, 250));
99 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
100 sequence_number++, capture_time_ms, 250));
101}
102
103TEST_F(PacedSenderTest, PaceQueuedPackets) {
104 uint32_t ssrc = 12345;
105 uint16_t sequence_number = 1234;
106 int64_t capture_time_ms = 56789;
107
108 // Due to the multiplicative factor we can send 3 packets not 2 packets.
109 for (int i = 0; i < 3; ++i) {
110 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
111 sequence_number++, capture_time_ms, 250));
112 }
113 for (int j = 0; j < 30; ++j) {
114 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
115 sequence_number++, capture_time_ms, 250));
116 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000117 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000118 for (int k = 0; k < 10; ++k) {
119 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
120 TickTime::AdvanceFakeClock(5);
121 EXPECT_CALL(callback_,
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000122 TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000123 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
124 EXPECT_EQ(0, send_bucket_->Process());
125 }
126 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
127 TickTime::AdvanceFakeClock(5);
128 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
129 EXPECT_EQ(0, send_bucket_->Process());
130 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
131 sequence_number++, capture_time_ms, 250));
132 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
133 sequence_number++, capture_time_ms, 250));
134 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
135 sequence_number++, capture_time_ms, 250));
136 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
137 sequence_number++, capture_time_ms, 250));
138}
139
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000140TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
141 uint32_t ssrc = 12345;
142 uint16_t sequence_number = 1234;
143 int64_t capture_time_ms = 56789;
144 uint16_t queued_sequence_number;
145
146 // Due to the multiplicative factor we can send 3 packets not 2 packets.
147 for (int i = 0; i < 3; ++i) {
148 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
149 sequence_number++, capture_time_ms, 250));
150 }
151 queued_sequence_number = sequence_number;
152
153 for (int j = 0; j < 30; ++j) {
154 // Send in duplicate packets.
155 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
156 sequence_number, capture_time_ms, 250));
157 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
158 sequence_number++, capture_time_ms, 250));
159 }
160 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
161 for (int k = 0; k < 10; ++k) {
162 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
163 TickTime::AdvanceFakeClock(5);
164
165 for (int i = 0; i < 3; ++i) {
166 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, queued_sequence_number++,
167 capture_time_ms)).Times(1);
168 }
169 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
170 EXPECT_EQ(0, send_bucket_->Process());
171 }
172 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
173 TickTime::AdvanceFakeClock(5);
174 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
175 EXPECT_EQ(0, send_bucket_->Process());
176 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
177 sequence_number++, capture_time_ms, 250));
178 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
179 sequence_number++, capture_time_ms, 250));
180 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
181 sequence_number++, capture_time_ms, 250));
182 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
183 sequence_number++, capture_time_ms, 250));
184}
185
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000186TEST_F(PacedSenderTest, Padding) {
187 uint32_t ssrc = 12345;
188 uint16_t sequence_number = 1234;
189 int64_t capture_time_ms = 56789;
190
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000191 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000192 // Due to the multiplicative factor we can send 3 packets not 2 packets.
193 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
194 sequence_number++, capture_time_ms, 250));
195 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
196 sequence_number++, capture_time_ms, 250));
197 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
198 sequence_number++, capture_time_ms, 250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000199 // No padding is expected since we have sent too much already.
200 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000201 EXPECT_CALL(callback_,
202 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
203 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
204 TickTime::AdvanceFakeClock(5);
205 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
206 EXPECT_EQ(0, send_bucket_->Process());
207
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000208 // 5 milliseconds later we have enough budget to send some padding.
209 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
210 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000211 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
212 TickTime::AdvanceFakeClock(5);
213 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
214 EXPECT_EQ(0, send_bucket_->Process());
215}
216
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000217TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
218 uint32_t ssrc = 12345;
219 uint16_t sequence_number = 1234;
220 int64_t capture_time_ms = 56789;
221 const int kTimeStep = 5;
222 const int64_t kBitrateWindow = 100;
223 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
224 int64_t start_time = TickTime::MillisecondTimestamp();
225 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
226 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
227 sequence_number++, capture_time_ms,
228 250));
229 TickTime::AdvanceFakeClock(kTimeStep);
230 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
231 WillOnce(Return(250));
232 send_bucket_->Process();
233 }
234}
235
236TEST_F(PacedSenderTest, VerifyMaxPaddingBitrate) {
237 uint32_t ssrc = 12345;
238 uint16_t sequence_number = 1234;
239 int64_t capture_time_ms = 56789;
240 const int kTimeStep = 5;
241 const int64_t kBitrateWindow = 100;
242 const int kTargetBitrate = 1500;
243 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
244 int64_t start_time = TickTime::MillisecondTimestamp();
245 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
246 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
247 sequence_number++, capture_time_ms,
248 250));
249 TickTime::AdvanceFakeClock(kTimeStep);
250 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1).
251 WillOnce(Return(250));
252 send_bucket_->Process();
253 }
254}
255
256TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
257 uint32_t ssrc = 12345;
258 uint16_t sequence_number = 1234;
259 int64_t capture_time_ms = 56789;
260 const int kTimeStep = 5;
261 const int64_t kBitrateWindow = 10000;
262 PacedSenderPadding callback;
263 send_bucket_.reset(new PacedSender(&callback, kTargetBitrate,
264 kPaceMultiplier));
265 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
266 int64_t start_time = TickTime::MillisecondTimestamp();
267 int media_bytes = 0;
268 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
269 int media_payload = rand() % 100 + 200; // [200, 300] bytes.
270 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
271 sequence_number++, capture_time_ms,
272 media_payload));
273 media_bytes += media_payload;
274 TickTime::AdvanceFakeClock(kTimeStep);
275 send_bucket_->Process();
276 }
277 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
278 kBitrateWindow, 1);
279}
280
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000281TEST_F(PacedSenderTest, Priority) {
282 uint32_t ssrc_low_priority = 12345;
283 uint32_t ssrc = 12346;
284 uint16_t sequence_number = 1234;
285 int64_t capture_time_ms = 56789;
286 int64_t capture_time_ms_low_priority = 1234567;
287
288 // Due to the multiplicative factor we can send 3 packets not 2 packets.
289 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
290 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
291 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
292 ssrc, sequence_number++, capture_time_ms, 250));
293 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
294 ssrc, sequence_number++, capture_time_ms, 250));
295
296 // Expect normal and low priority to be queued and high to pass through.
297 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
298 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
299 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
300 ssrc, sequence_number++, capture_time_ms, 250));
301 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
302 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000303 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000304 ssrc, sequence_number++, capture_time_ms, 250));
305
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000306 // Expect all high and normal priority to be sent out first.
307 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
308 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000309
310 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
311 TickTime::AdvanceFakeClock(5);
312 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
313 EXPECT_EQ(0, send_bucket_->Process());
314
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000315 EXPECT_CALL(callback_, TimeToSendPacket(
316 ssrc_low_priority, _, capture_time_ms_low_priority)).Times(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000317
318 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
319 TickTime::AdvanceFakeClock(5);
320 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
321 EXPECT_EQ(0, send_bucket_->Process());
322}
323
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000324TEST_F(PacedSenderTest, Pause) {
325 uint32_t ssrc_low_priority = 12345;
326 uint32_t ssrc = 12346;
327 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000328 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
329 TickTime::AdvanceFakeClock(10000);
330 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
331
332 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000333
334 // Due to the multiplicative factor we can send 3 packets not 2 packets.
335 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
336 ssrc_low_priority, sequence_number++, capture_time_ms, 250));
337 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
338 ssrc, sequence_number++, capture_time_ms, 250));
339 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
340 ssrc, sequence_number++, capture_time_ms, 250));
341
342 send_bucket_->Pause();
343
344 // Expect everything to be queued.
345 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
346 ssrc_low_priority, sequence_number++, capture_time_ms, 250));
347 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
348 ssrc, sequence_number++, capture_time_ms, 250));
349 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
350 ssrc, sequence_number++, second_capture_time_ms, 250));
351 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
352 ssrc, sequence_number++, capture_time_ms, 250));
353
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000354 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
355 send_bucket_->QueueInMs());
356
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000357 // Expect no packet to come out while paused.
358 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
359 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _)).Times(0);
360
361 for (int i = 0; i < 10; ++i) {
362 TickTime::AdvanceFakeClock(5);
363 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
364 EXPECT_EQ(0, send_bucket_->Process());
365 }
366 // Expect high prio packets to come out first followed by all packets in the
367 // way they were added.
368 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms)).Times(3);
369
370 send_bucket_->Resume();
371
372 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
373 TickTime::AdvanceFakeClock(5);
374 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
375 EXPECT_EQ(0, send_bucket_->Process());
376
377 EXPECT_CALL(callback_,
378 TimeToSendPacket(_, _, second_capture_time_ms)).Times(1);
379
380 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
381 TickTime::AdvanceFakeClock(5);
382 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
383 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000384 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000385}
386
387} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000388} // namespace webrtc