blob: c8dcd97340b45ace4ada03ba2b63affa88cb4a1e [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
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000065 void SendAndExpectPacket(PacedSender::Priority priority,
66 uint32_t ssrc, uint16_t sequence_number,
67 int64_t capture_time_ms, int size) {
68 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc,
69 sequence_number, capture_time_ms, size));
70 EXPECT_CALL(callback_, TimeToSendPacket(
71 ssrc, sequence_number, capture_time_ms)).Times(1);
72 }
73
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000074 MockPacedSenderCallback callback_;
75 scoped_ptr<PacedSender> send_bucket_;
76};
77
78TEST_F(PacedSenderTest, QueuePacket) {
79 uint32_t ssrc = 12345;
80 uint16_t sequence_number = 1234;
81 int64_t capture_time_ms = 56789;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000082 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000083 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
84 capture_time_ms, 250);
85 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
86 capture_time_ms, 250);
87 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
88 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000089 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
90 sequence_number, capture_time_ms, 250));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000091 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000092 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000093 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000094 EXPECT_CALL(callback_,
95 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
96 TickTime::AdvanceFakeClock(4);
97 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000098 TickTime::AdvanceFakeClock(1);
99 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000100 EXPECT_CALL(callback_, TimeToSendPacket(
101 ssrc, sequence_number++, capture_time_ms)).Times(1);
102 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000103 sequence_number++;
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000104 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
105 capture_time_ms, 250);
106 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
107 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000108 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
109 sequence_number++, capture_time_ms, 250));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000110 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000111}
112
113TEST_F(PacedSenderTest, PaceQueuedPackets) {
114 uint32_t ssrc = 12345;
115 uint16_t sequence_number = 1234;
116 int64_t capture_time_ms = 56789;
117
118 // Due to the multiplicative factor we can send 3 packets not 2 packets.
119 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000120 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
121 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000122 }
123 for (int j = 0; j < 30; ++j) {
124 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
125 sequence_number++, capture_time_ms, 250));
126 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000127 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000128 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000129 for (int k = 0; k < 10; ++k) {
130 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
131 TickTime::AdvanceFakeClock(5);
132 EXPECT_CALL(callback_,
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000133 TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000134 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
135 EXPECT_EQ(0, send_bucket_->Process());
136 }
137 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
138 TickTime::AdvanceFakeClock(5);
139 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
140 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000141 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
142 capture_time_ms, 250);
143 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
144 capture_time_ms, 250);
145 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
146 capture_time_ms, 250);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000147 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000148 sequence_number, capture_time_ms, 250));
149 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000150}
151
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000152TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
153 uint32_t ssrc = 12345;
154 uint16_t sequence_number = 1234;
155 int64_t capture_time_ms = 56789;
156 uint16_t queued_sequence_number;
157
158 // Due to the multiplicative factor we can send 3 packets not 2 packets.
159 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000160 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
161 capture_time_ms, 250);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000162 }
163 queued_sequence_number = sequence_number;
164
165 for (int j = 0; j < 30; ++j) {
166 // Send in duplicate packets.
167 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
168 sequence_number, capture_time_ms, 250));
169 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
170 sequence_number++, capture_time_ms, 250));
171 }
172 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000173 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000174 for (int k = 0; k < 10; ++k) {
175 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
176 TickTime::AdvanceFakeClock(5);
177
178 for (int i = 0; i < 3; ++i) {
179 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, queued_sequence_number++,
180 capture_time_ms)).Times(1);
181 }
182 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
183 EXPECT_EQ(0, send_bucket_->Process());
184 }
185 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
186 TickTime::AdvanceFakeClock(5);
187 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
188 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000189 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
190 capture_time_ms, 250);
191 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
192 capture_time_ms, 250);
193 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
194 capture_time_ms, 250);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000195 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
196 sequence_number++, capture_time_ms, 250));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000197 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000198}
199
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000200TEST_F(PacedSenderTest, Padding) {
201 uint32_t ssrc = 12345;
202 uint16_t sequence_number = 1234;
203 int64_t capture_time_ms = 56789;
204
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000205 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000206 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000207 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
208 capture_time_ms, 250);
209 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
210 capture_time_ms, 250);
211 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
212 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000213 // No padding is expected since we have sent too much already.
214 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000215 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
216 TickTime::AdvanceFakeClock(5);
217 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
218 EXPECT_EQ(0, send_bucket_->Process());
219
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000220 // 5 milliseconds later we have enough budget to send some padding.
221 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
222 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000223 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
224 TickTime::AdvanceFakeClock(5);
225 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
226 EXPECT_EQ(0, send_bucket_->Process());
227}
228
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000229TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
230 uint32_t ssrc = 12345;
231 uint16_t sequence_number = 1234;
232 int64_t capture_time_ms = 56789;
233 const int kTimeStep = 5;
234 const int64_t kBitrateWindow = 100;
235 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
236 int64_t start_time = TickTime::MillisecondTimestamp();
237 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000238 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
239 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000240 TickTime::AdvanceFakeClock(kTimeStep);
241 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
242 WillOnce(Return(250));
243 send_bucket_->Process();
244 }
245}
246
247TEST_F(PacedSenderTest, VerifyMaxPaddingBitrate) {
248 uint32_t ssrc = 12345;
249 uint16_t sequence_number = 1234;
250 int64_t capture_time_ms = 56789;
251 const int kTimeStep = 5;
252 const int64_t kBitrateWindow = 100;
253 const int kTargetBitrate = 1500;
254 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
255 int64_t start_time = TickTime::MillisecondTimestamp();
256 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000257 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
258 capture_time_ms, 250);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000259 TickTime::AdvanceFakeClock(kTimeStep);
260 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1).
261 WillOnce(Return(250));
262 send_bucket_->Process();
263 }
264}
265
266TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
267 uint32_t ssrc = 12345;
268 uint16_t sequence_number = 1234;
269 int64_t capture_time_ms = 56789;
270 const int kTimeStep = 5;
271 const int64_t kBitrateWindow = 10000;
272 PacedSenderPadding callback;
273 send_bucket_.reset(new PacedSender(&callback, kTargetBitrate,
274 kPaceMultiplier));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000275 send_bucket_->SetStatus(true);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000276 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate);
277 int64_t start_time = TickTime::MillisecondTimestamp();
278 int media_bytes = 0;
279 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
280 int media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000281 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
282 sequence_number++, capture_time_ms,
283 media_payload));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000284 media_bytes += media_payload;
285 TickTime::AdvanceFakeClock(kTimeStep);
286 send_bucket_->Process();
287 }
288 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
289 kBitrateWindow, 1);
290}
291
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000292TEST_F(PacedSenderTest, Priority) {
293 uint32_t ssrc_low_priority = 12345;
294 uint32_t ssrc = 12346;
295 uint16_t sequence_number = 1234;
296 int64_t capture_time_ms = 56789;
297 int64_t capture_time_ms_low_priority = 1234567;
298
299 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000300 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
301 capture_time_ms, 250);
302 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
303 capture_time_ms, 250);
304 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
305 capture_time_ms, 250);
306 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000307
308 // Expect normal and low priority to be queued and high to pass through.
309 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
310 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
311 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
312 ssrc, sequence_number++, capture_time_ms, 250));
313 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
314 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000315 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000316 ssrc, sequence_number++, capture_time_ms, 250));
317
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000318 // Expect all high and normal priority to be sent out first.
319 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
320 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000321
322 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
323 TickTime::AdvanceFakeClock(5);
324 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
325 EXPECT_EQ(0, send_bucket_->Process());
326
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000327 EXPECT_CALL(callback_, TimeToSendPacket(
328 ssrc_low_priority, _, capture_time_ms_low_priority)).Times(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000329
330 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
331 TickTime::AdvanceFakeClock(5);
332 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
333 EXPECT_EQ(0, send_bucket_->Process());
334}
335
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000336TEST_F(PacedSenderTest, Pause) {
337 uint32_t ssrc_low_priority = 12345;
338 uint32_t ssrc = 12346;
339 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000340 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
341 TickTime::AdvanceFakeClock(10000);
342 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
343
344 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000345
346 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000347 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
348 capture_time_ms, 250);
349 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
350 capture_time_ms, 250);
351 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
352 capture_time_ms, 250);
353 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000354
355 send_bucket_->Pause();
356
357 // Expect everything to be queued.
358 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000359 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000360 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
361 ssrc, sequence_number++, capture_time_ms, 250));
362 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000363 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000364 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
365 ssrc, sequence_number++, capture_time_ms, 250));
366
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000367 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
368 send_bucket_->QueueInMs());
369
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000370 // Expect no packet to come out while paused.
371 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
372 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _)).Times(0);
373
374 for (int i = 0; i < 10; ++i) {
375 TickTime::AdvanceFakeClock(5);
376 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
377 EXPECT_EQ(0, send_bucket_->Process());
378 }
379 // Expect high prio packets to come out first followed by all packets in the
380 // way they were added.
381 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms)).Times(3);
382
383 send_bucket_->Resume();
384
385 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
386 TickTime::AdvanceFakeClock(5);
387 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
388 EXPECT_EQ(0, send_bucket_->Process());
389
390 EXPECT_CALL(callback_,
391 TimeToSendPacket(_, _, second_capture_time_ms)).Times(1);
392
393 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
394 TickTime::AdvanceFakeClock(5);
395 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
396 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000397 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000398}
399
400} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000401} // namespace webrtc