blob: 286c09747b7d38a0bcc013bc5a63ae21318d0d69 [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.orgb2c8a952013-09-06 13:58:01 +0000214 send_bucket_->UpdateBitrate(kTargetBitrate, 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);
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000240 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000241 // 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;
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000260 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000261 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;
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000279 const int kMaxPaddingBitrate = 800;
280 send_bucket_->UpdateBitrate(kTargetBitrate, kMaxPaddingBitrate,
281 kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000282 int64_t start_time = TickTime::MillisecondTimestamp();
283 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000284 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
285 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000286 TickTime::AdvanceFakeClock(kTimeStep);
287 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1).
288 WillOnce(Return(250));
289 send_bucket_->Process();
290 }
291}
292
293TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
294 uint32_t ssrc = 12345;
295 uint16_t sequence_number = 1234;
296 int64_t capture_time_ms = 56789;
297 const int kTimeStep = 5;
298 const int64_t kBitrateWindow = 10000;
299 PacedSenderPadding callback;
300 send_bucket_.reset(new PacedSender(&callback, kTargetBitrate,
301 kPaceMultiplier));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000302 send_bucket_->SetStatus(true);
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000303 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000304 int64_t start_time = TickTime::MillisecondTimestamp();
305 int media_bytes = 0;
306 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
307 int media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000308 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
309 sequence_number++, capture_time_ms,
310 media_payload));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000311 media_bytes += media_payload;
312 TickTime::AdvanceFakeClock(kTimeStep);
313 send_bucket_->Process();
314 }
315 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
316 kBitrateWindow, 1);
317}
318
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000319TEST_F(PacedSenderTest, Priority) {
320 uint32_t ssrc_low_priority = 12345;
321 uint32_t ssrc = 12346;
322 uint16_t sequence_number = 1234;
323 int64_t capture_time_ms = 56789;
324 int64_t capture_time_ms_low_priority = 1234567;
325
326 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000327 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
328 capture_time_ms, 250);
329 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
330 capture_time_ms, 250);
331 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
332 capture_time_ms, 250);
333 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000334
335 // Expect normal and low priority to be queued and high to pass through.
336 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
337 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
338 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
339 ssrc, sequence_number++, capture_time_ms, 250));
340 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
341 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000342 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000343 ssrc, sequence_number++, capture_time_ms, 250));
344
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000345 // Expect all high and normal priority to be sent out first.
346 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000347 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms))
348 .Times(3)
349 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000350
351 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
352 TickTime::AdvanceFakeClock(5);
353 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
354 EXPECT_EQ(0, send_bucket_->Process());
355
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000356 EXPECT_CALL(callback_, TimeToSendPacket(
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000357 ssrc_low_priority, _, capture_time_ms_low_priority))
358 .Times(1)
359 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000360
361 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
362 TickTime::AdvanceFakeClock(5);
363 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
364 EXPECT_EQ(0, send_bucket_->Process());
365}
366
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000367TEST_F(PacedSenderTest, Pause) {
368 uint32_t ssrc_low_priority = 12345;
369 uint32_t ssrc = 12346;
370 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000371 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
372 TickTime::AdvanceFakeClock(10000);
373 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
374
375 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000376
377 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000378 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
379 capture_time_ms, 250);
380 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
381 capture_time_ms, 250);
382 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
383 capture_time_ms, 250);
384 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000385
386 send_bucket_->Pause();
387
388 // Expect everything to be queued.
389 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000390 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000391 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
392 ssrc, sequence_number++, capture_time_ms, 250));
393 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000394 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000395 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
396 ssrc, sequence_number++, capture_time_ms, 250));
397
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000398 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
399 send_bucket_->QueueInMs());
400
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000401 // Expect no packet to come out while paused.
402 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
403 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _)).Times(0);
404
405 for (int i = 0; i < 10; ++i) {
406 TickTime::AdvanceFakeClock(5);
407 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
408 EXPECT_EQ(0, send_bucket_->Process());
409 }
410 // Expect high prio packets to come out first followed by all packets in the
411 // way they were added.
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000412 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms))
413 .Times(3)
414 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000415 send_bucket_->Resume();
416
417 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
418 TickTime::AdvanceFakeClock(5);
419 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
420 EXPECT_EQ(0, send_bucket_->Process());
421
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000422 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms))
423 .Times(1)
424 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000425 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
426 TickTime::AdvanceFakeClock(5);
427 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
428 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000429 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000430}
431
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000432TEST_F(PacedSenderTest, ResendPacket) {
433 uint32_t ssrc = 12346;
434 uint16_t sequence_number = 1234;
435 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
436 EXPECT_EQ(0, send_bucket_->QueueInMs());
437
438 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
439 ssrc,
440 sequence_number,
441 capture_time_ms,
442 250));
443 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
444 ssrc,
445 sequence_number + 1,
446 capture_time_ms + 1,
447 250));
448 TickTime::AdvanceFakeClock(10000);
449 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
450 send_bucket_->QueueInMs());
451 // Fails to send first packet so only one call.
452 EXPECT_CALL(callback_, TimeToSendPacket(
453 ssrc, sequence_number, capture_time_ms))
454 .Times(1)
455 .WillOnce(Return(false));
456 TickTime::AdvanceFakeClock(10000);
457 send_bucket_->Process();
458
459 // Queue remains unchanged.
460 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
461 send_bucket_->QueueInMs());
462
463 // Fails to send second packet.
464 EXPECT_CALL(callback_, TimeToSendPacket(
465 ssrc, sequence_number, capture_time_ms))
466 .Times(1)
467 .WillOnce(Return(true));
468 EXPECT_CALL(callback_, TimeToSendPacket(
469 ssrc, sequence_number + 1, capture_time_ms + 1))
470 .Times(1)
471 .WillOnce(Return(false));
472 TickTime::AdvanceFakeClock(10000);
473 send_bucket_->Process();
474
475 // Queue is reduced by 1 packet.
476 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms - 1,
477 send_bucket_->QueueInMs());
478
479 // Send second packet and queue becomes empty.
480 EXPECT_CALL(callback_, TimeToSendPacket(
481 ssrc, sequence_number + 1, capture_time_ms + 1))
482 .Times(1)
483 .WillOnce(Return(true));
484 TickTime::AdvanceFakeClock(10000);
485 send_bucket_->Process();
486 EXPECT_EQ(0, send_bucket_->QueueInMs());
487}
488
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000489} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000490} // namespace webrtc