blob: 3e6127373b36a8bf4495de8610b675b71d9a0102 [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
pbos@webrtc.orgdb6e3f82013-07-11 09:50:05 +000011#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000013
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,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000028 bool(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000029 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
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000037 bool TimeToSendPacket(uint32_t ssrc, uint16_t sequence_number,
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000038 int64_t capture_time_ms) {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000039 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000040 }
41
42 int TimeToSendPadding(int bytes) {
43 const int kPaddingPacketSize = 224;
44 int num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
45 padding_sent_ += kPaddingPacketSize * num_packets;
46 return kPaddingPacketSize * num_packets;
47 }
48
49 int padding_sent() { return padding_sent_; }
50
51 private:
52 int padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000053};
54
55class PacedSenderTest : public ::testing::Test {
56 protected:
57 PacedSenderTest() {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000058 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000059 TickTime::UseFakeClock(123456);
60 // Need to initialize PacedSender after we initialize clock.
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000061 send_bucket_.reset(new PacedSender(&callback_, kTargetBitrate,
62 kPaceMultiplier));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000063 send_bucket_->SetStatus(true);
64 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000065
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000066 void SendAndExpectPacket(PacedSender::Priority priority,
67 uint32_t ssrc, uint16_t sequence_number,
68 int64_t capture_time_ms, int size) {
69 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc,
70 sequence_number, capture_time_ms, size));
71 EXPECT_CALL(callback_, TimeToSendPacket(
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000072 ssrc, sequence_number, capture_time_ms))
73 .Times(1)
74 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000075 }
76
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000077 MockPacedSenderCallback callback_;
78 scoped_ptr<PacedSender> send_bucket_;
79};
80
81TEST_F(PacedSenderTest, QueuePacket) {
82 uint32_t ssrc = 12345;
83 uint16_t sequence_number = 1234;
84 int64_t capture_time_ms = 56789;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000085 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000086 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
87 capture_time_ms, 250);
88 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
89 capture_time_ms, 250);
90 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
91 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000092 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
93 sequence_number, capture_time_ms, 250));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000094 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000095 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000096 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000097 EXPECT_CALL(callback_,
98 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
99 TickTime::AdvanceFakeClock(4);
100 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000101 TickTime::AdvanceFakeClock(1);
102 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000103 EXPECT_CALL(callback_, TimeToSendPacket(
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000104 ssrc, sequence_number++, capture_time_ms))
105 .Times(1)
106 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000107 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000108 sequence_number++;
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000109 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
110 capture_time_ms, 250);
111 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
112 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000113 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
114 sequence_number++, capture_time_ms, 250));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000115 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000116}
117
118TEST_F(PacedSenderTest, PaceQueuedPackets) {
119 uint32_t ssrc = 12345;
120 uint16_t sequence_number = 1234;
121 int64_t capture_time_ms = 56789;
122
123 // Due to the multiplicative factor we can send 3 packets not 2 packets.
124 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000125 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
126 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000127 }
128 for (int j = 0; j < 30; ++j) {
129 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
130 sequence_number++, capture_time_ms, 250));
131 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000132 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000133 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000134 for (int k = 0; k < 10; ++k) {
135 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
136 TickTime::AdvanceFakeClock(5);
137 EXPECT_CALL(callback_,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000138 TimeToSendPacket(ssrc, _, capture_time_ms))
139 .Times(3)
140 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000141 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
142 EXPECT_EQ(0, send_bucket_->Process());
143 }
144 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
145 TickTime::AdvanceFakeClock(5);
146 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
147 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000148 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
149 capture_time_ms, 250);
150 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
151 capture_time_ms, 250);
152 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
153 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000154 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000155 sequence_number, capture_time_ms, 250));
156 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000157}
158
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000159TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
160 uint32_t ssrc = 12345;
161 uint16_t sequence_number = 1234;
162 int64_t capture_time_ms = 56789;
163 uint16_t queued_sequence_number;
164
165 // Due to the multiplicative factor we can send 3 packets not 2 packets.
166 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000167 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
168 capture_time_ms, 250);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000169 }
170 queued_sequence_number = sequence_number;
171
172 for (int j = 0; j < 30; ++j) {
173 // Send in duplicate packets.
174 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
175 sequence_number, capture_time_ms, 250));
176 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
177 sequence_number++, capture_time_ms, 250));
178 }
179 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000180 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000181 for (int k = 0; k < 10; ++k) {
182 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
183 TickTime::AdvanceFakeClock(5);
184
185 for (int i = 0; i < 3; ++i) {
186 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, queued_sequence_number++,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000187 capture_time_ms))
188 .Times(1)
189 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000190 }
191 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
192 EXPECT_EQ(0, send_bucket_->Process());
193 }
194 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
195 TickTime::AdvanceFakeClock(5);
196 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
197 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000198 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
199 capture_time_ms, 250);
200 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
201 capture_time_ms, 250);
202 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
203 capture_time_ms, 250);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000204 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
205 sequence_number++, capture_time_ms, 250));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000206 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000207}
208
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000209TEST_F(PacedSenderTest, Padding) {
210 uint32_t ssrc = 12345;
211 uint16_t sequence_number = 1234;
212 int64_t capture_time_ms = 56789;
213
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000214 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000215 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000216 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
217 capture_time_ms, 250);
218 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
219 capture_time_ms, 250);
220 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
221 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000222 // No padding is expected since we have sent too much already.
223 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000224 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
225 TickTime::AdvanceFakeClock(5);
226 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
227 EXPECT_EQ(0, send_bucket_->Process());
228
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000229 // 5 milliseconds later we have enough budget to send some padding.
230 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
231 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000232 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
233 TickTime::AdvanceFakeClock(5);
234 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
235 EXPECT_EQ(0, send_bucket_->Process());
236}
237
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000238TEST_F(PacedSenderTest, NoPaddingWhenDisabled) {
239 send_bucket_->SetStatus(false);
240 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
241 // No padding is expected since the pacer is disabled.
242 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
243 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
244 TickTime::AdvanceFakeClock(5);
245 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
246 EXPECT_EQ(0, send_bucket_->Process());
247 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
248 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
249 TickTime::AdvanceFakeClock(5);
250 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
251 EXPECT_EQ(0, send_bucket_->Process());
252}
253
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000254TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
255 uint32_t ssrc = 12345;
256 uint16_t sequence_number = 1234;
257 int64_t capture_time_ms = 56789;
258 const int kTimeStep = 5;
259 const int64_t kBitrateWindow = 100;
260 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
261 int64_t start_time = TickTime::MillisecondTimestamp();
262 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000263 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
264 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000265 TickTime::AdvanceFakeClock(kTimeStep);
266 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
267 WillOnce(Return(250));
268 send_bucket_->Process();
269 }
270}
271
272TEST_F(PacedSenderTest, VerifyMaxPaddingBitrate) {
273 uint32_t ssrc = 12345;
274 uint16_t sequence_number = 1234;
275 int64_t capture_time_ms = 56789;
276 const int kTimeStep = 5;
277 const int64_t kBitrateWindow = 100;
278 const int kTargetBitrate = 1500;
279 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
280 int64_t start_time = TickTime::MillisecondTimestamp();
281 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000282 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
283 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000284 TickTime::AdvanceFakeClock(kTimeStep);
285 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1).
286 WillOnce(Return(250));
287 send_bucket_->Process();
288 }
289}
290
291TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
292 uint32_t ssrc = 12345;
293 uint16_t sequence_number = 1234;
294 int64_t capture_time_ms = 56789;
295 const int kTimeStep = 5;
296 const int64_t kBitrateWindow = 10000;
297 PacedSenderPadding callback;
298 send_bucket_.reset(new PacedSender(&callback, kTargetBitrate,
299 kPaceMultiplier));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000300 send_bucket_->SetStatus(true);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000301 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
302 int64_t start_time = TickTime::MillisecondTimestamp();
303 int media_bytes = 0;
304 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
305 int media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000306 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
307 sequence_number++, capture_time_ms,
308 media_payload));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000309 media_bytes += media_payload;
310 TickTime::AdvanceFakeClock(kTimeStep);
311 send_bucket_->Process();
312 }
313 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
314 kBitrateWindow, 1);
315}
316
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000317TEST_F(PacedSenderTest, Priority) {
318 uint32_t ssrc_low_priority = 12345;
319 uint32_t ssrc = 12346;
320 uint16_t sequence_number = 1234;
321 int64_t capture_time_ms = 56789;
322 int64_t capture_time_ms_low_priority = 1234567;
323
324 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000325 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
326 capture_time_ms, 250);
327 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
328 capture_time_ms, 250);
329 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
330 capture_time_ms, 250);
331 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000332
333 // Expect normal and low priority to be queued and high to pass through.
334 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
335 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
336 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
337 ssrc, sequence_number++, capture_time_ms, 250));
338 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
339 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000340 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000341 ssrc, sequence_number++, capture_time_ms, 250));
342
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000343 // Expect all high and normal priority to be sent out first.
344 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000345 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms))
346 .Times(3)
347 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000348
349 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
350 TickTime::AdvanceFakeClock(5);
351 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
352 EXPECT_EQ(0, send_bucket_->Process());
353
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000354 EXPECT_CALL(callback_, TimeToSendPacket(
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000355 ssrc_low_priority, _, capture_time_ms_low_priority))
356 .Times(1)
357 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000358
359 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
360 TickTime::AdvanceFakeClock(5);
361 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
362 EXPECT_EQ(0, send_bucket_->Process());
363}
364
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000365TEST_F(PacedSenderTest, Pause) {
366 uint32_t ssrc_low_priority = 12345;
367 uint32_t ssrc = 12346;
368 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000369 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
370 TickTime::AdvanceFakeClock(10000);
371 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
372
373 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000374
375 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000376 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
377 capture_time_ms, 250);
378 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
379 capture_time_ms, 250);
380 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
381 capture_time_ms, 250);
382 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000383
384 send_bucket_->Pause();
385
386 // Expect everything to be queued.
387 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000388 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000389 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
390 ssrc, sequence_number++, capture_time_ms, 250));
391 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000392 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000393 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
394 ssrc, sequence_number++, capture_time_ms, 250));
395
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000396 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
397 send_bucket_->QueueInMs());
398
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000399 // Expect no packet to come out while paused.
400 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
401 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _)).Times(0);
402
403 for (int i = 0; i < 10; ++i) {
404 TickTime::AdvanceFakeClock(5);
405 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
406 EXPECT_EQ(0, send_bucket_->Process());
407 }
408 // Expect high prio packets to come out first followed by all packets in the
409 // way they were added.
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000410 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms))
411 .Times(3)
412 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000413 send_bucket_->Resume();
414
415 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
416 TickTime::AdvanceFakeClock(5);
417 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
418 EXPECT_EQ(0, send_bucket_->Process());
419
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000420 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms))
421 .Times(1)
422 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000423 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
424 TickTime::AdvanceFakeClock(5);
425 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
426 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000427 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000428}
429
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000430TEST_F(PacedSenderTest, ResendPacket) {
431 uint32_t ssrc = 12346;
432 uint16_t sequence_number = 1234;
433 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
434 EXPECT_EQ(0, send_bucket_->QueueInMs());
435
436 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
437 ssrc,
438 sequence_number,
439 capture_time_ms,
440 250));
441 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
442 ssrc,
443 sequence_number + 1,
444 capture_time_ms + 1,
445 250));
446 TickTime::AdvanceFakeClock(10000);
447 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
448 send_bucket_->QueueInMs());
449 // Fails to send first packet so only one call.
450 EXPECT_CALL(callback_, TimeToSendPacket(
451 ssrc, sequence_number, capture_time_ms))
452 .Times(1)
453 .WillOnce(Return(false));
454 TickTime::AdvanceFakeClock(10000);
455 send_bucket_->Process();
456
457 // Queue remains unchanged.
458 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
459 send_bucket_->QueueInMs());
460
461 // Fails to send second packet.
462 EXPECT_CALL(callback_, TimeToSendPacket(
463 ssrc, sequence_number, capture_time_ms))
464 .Times(1)
465 .WillOnce(Return(true));
466 EXPECT_CALL(callback_, TimeToSendPacket(
467 ssrc, sequence_number + 1, capture_time_ms + 1))
468 .Times(1)
469 .WillOnce(Return(false));
470 TickTime::AdvanceFakeClock(10000);
471 send_bucket_->Process();
472
473 // Queue is reduced by 1 packet.
474 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms - 1,
475 send_bucket_->QueueInMs());
476
477 // Send second packet and queue becomes empty.
478 EXPECT_CALL(callback_, TimeToSendPacket(
479 ssrc, sequence_number + 1, capture_time_ms + 1))
480 .Times(1)
481 .WillOnce(Return(true));
482 TickTime::AdvanceFakeClock(10000);
483 send_bucket_->Process();
484 EXPECT_EQ(0, send_bucket_->QueueInMs());
485}
486
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000487} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000488} // namespace webrtc