blob: 247366c6b592beec6fa5513fac8ea04922e1bf47 [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::_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000017
18namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000019namespace test {
20
21static const int kTargetBitrate = 800;
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000022static const float kPaceMultiplier = 1.5f;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000023
24class MockPacedSenderCallback : public PacedSender::Callback {
25 public:
26 MOCK_METHOD3(TimeToSendPacket,
27 void(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms));
28 MOCK_METHOD1(TimeToSendPadding,
29 void(int bytes));
30};
31
32class PacedSenderTest : public ::testing::Test {
33 protected:
34 PacedSenderTest() {
35 TickTime::UseFakeClock(123456);
36 // Need to initialize PacedSender after we initialize clock.
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000037 send_bucket_.reset(new PacedSender(&callback_, kTargetBitrate,
38 kPaceMultiplier));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000039 send_bucket_->SetStatus(true);
40 }
41 MockPacedSenderCallback callback_;
42 scoped_ptr<PacedSender> send_bucket_;
43};
44
45TEST_F(PacedSenderTest, QueuePacket) {
46 uint32_t ssrc = 12345;
47 uint16_t sequence_number = 1234;
48 int64_t capture_time_ms = 56789;
49
50 // Due to the multiplicative factor we can send 3 packets not 2 packets.
51 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
52 sequence_number++, capture_time_ms, 250));
53 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
54 sequence_number++, capture_time_ms, 250));
55 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
56 sequence_number++, capture_time_ms, 250));
57 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
58 sequence_number, capture_time_ms, 250));
59 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000060 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000061 EXPECT_CALL(callback_,
62 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
63 TickTime::AdvanceFakeClock(4);
64 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
65 EXPECT_CALL(callback_,
66 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(1);
67 TickTime::AdvanceFakeClock(1);
68 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
69 EXPECT_EQ(0, send_bucket_->Process());
70 sequence_number++;
71 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
72 sequence_number++, capture_time_ms, 250));
73 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
74 sequence_number++, capture_time_ms, 250));
75 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
76 sequence_number++, capture_time_ms, 250));
77}
78
79TEST_F(PacedSenderTest, PaceQueuedPackets) {
80 uint32_t ssrc = 12345;
81 uint16_t sequence_number = 1234;
82 int64_t capture_time_ms = 56789;
83
84 // Due to the multiplicative factor we can send 3 packets not 2 packets.
85 for (int i = 0; i < 3; ++i) {
86 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
87 sequence_number++, capture_time_ms, 250));
88 }
89 for (int j = 0; j < 30; ++j) {
90 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
91 sequence_number++, capture_time_ms, 250));
92 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000093 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000094 for (int k = 0; k < 10; ++k) {
95 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
96 TickTime::AdvanceFakeClock(5);
97 EXPECT_CALL(callback_,
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000098 TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000099 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
100 EXPECT_EQ(0, send_bucket_->Process());
101 }
102 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
103 TickTime::AdvanceFakeClock(5);
104 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
105 EXPECT_EQ(0, send_bucket_->Process());
106 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
107 sequence_number++, capture_time_ms, 250));
108 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
109 sequence_number++, capture_time_ms, 250));
110 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
111 sequence_number++, capture_time_ms, 250));
112 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
113 sequence_number++, capture_time_ms, 250));
114}
115
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000116TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
117 uint32_t ssrc = 12345;
118 uint16_t sequence_number = 1234;
119 int64_t capture_time_ms = 56789;
120 uint16_t queued_sequence_number;
121
122 // Due to the multiplicative factor we can send 3 packets not 2 packets.
123 for (int i = 0; i < 3; ++i) {
124 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
125 sequence_number++, capture_time_ms, 250));
126 }
127 queued_sequence_number = sequence_number;
128
129 for (int j = 0; j < 30; ++j) {
130 // Send in duplicate packets.
131 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
132 sequence_number, capture_time_ms, 250));
133 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
134 sequence_number++, capture_time_ms, 250));
135 }
136 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
137 for (int k = 0; k < 10; ++k) {
138 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
139 TickTime::AdvanceFakeClock(5);
140
141 for (int i = 0; i < 3; ++i) {
142 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, queued_sequence_number++,
143 capture_time_ms)).Times(1);
144 }
145 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
146 EXPECT_EQ(0, send_bucket_->Process());
147 }
148 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
149 TickTime::AdvanceFakeClock(5);
150 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
151 EXPECT_EQ(0, send_bucket_->Process());
152 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
153 sequence_number++, capture_time_ms, 250));
154 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
155 sequence_number++, capture_time_ms, 250));
156 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
157 sequence_number++, capture_time_ms, 250));
158 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
159 sequence_number++, capture_time_ms, 250));
160}
161
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000162TEST_F(PacedSenderTest, Padding) {
163 uint32_t ssrc = 12345;
164 uint16_t sequence_number = 1234;
165 int64_t capture_time_ms = 56789;
166
167 // Due to the multiplicative factor we can send 3 packets not 2 packets.
168 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
169 sequence_number++, capture_time_ms, 250));
170 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
171 sequence_number++, capture_time_ms, 250));
172 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
173 sequence_number++, capture_time_ms, 250));
174 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1);
175 EXPECT_CALL(callback_,
176 TimeToSendPacket(ssrc, sequence_number, capture_time_ms)).Times(0);
177 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
178 TickTime::AdvanceFakeClock(5);
179 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
180 EXPECT_EQ(0, send_bucket_->Process());
181
182 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1);
183 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
184 TickTime::AdvanceFakeClock(5);
185 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
186 EXPECT_EQ(0, send_bucket_->Process());
187}
188
189TEST_F(PacedSenderTest, Priority) {
190 uint32_t ssrc_low_priority = 12345;
191 uint32_t ssrc = 12346;
192 uint16_t sequence_number = 1234;
193 int64_t capture_time_ms = 56789;
194 int64_t capture_time_ms_low_priority = 1234567;
195
196 // Due to the multiplicative factor we can send 3 packets not 2 packets.
197 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
198 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
199 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
200 ssrc, sequence_number++, capture_time_ms, 250));
201 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
202 ssrc, sequence_number++, capture_time_ms, 250));
203
204 // Expect normal and low priority to be queued and high to pass through.
205 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
206 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250));
207 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
208 ssrc, sequence_number++, capture_time_ms, 250));
209 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
210 ssrc, sequence_number++, capture_time_ms, 250));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000211 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000212 ssrc, sequence_number++, capture_time_ms, 250));
213
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000214 // Expect all high and normal priority to be sent out first.
215 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
216 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms)).Times(3);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000217
218 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
219 TickTime::AdvanceFakeClock(5);
220 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
221 EXPECT_EQ(0, send_bucket_->Process());
222
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000223 EXPECT_CALL(callback_, TimeToSendPacket(
224 ssrc_low_priority, _, capture_time_ms_low_priority)).Times(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000225
226 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
227 TickTime::AdvanceFakeClock(5);
228 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
229 EXPECT_EQ(0, send_bucket_->Process());
230}
231
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000232TEST_F(PacedSenderTest, Pause) {
233 uint32_t ssrc_low_priority = 12345;
234 uint32_t ssrc = 12346;
235 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000236 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
237 TickTime::AdvanceFakeClock(10000);
238 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
239
240 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000241
242 // Due to the multiplicative factor we can send 3 packets not 2 packets.
243 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kLowPriority,
244 ssrc_low_priority, sequence_number++, capture_time_ms, 250));
245 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
246 ssrc, sequence_number++, capture_time_ms, 250));
247 EXPECT_TRUE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
248 ssrc, sequence_number++, capture_time_ms, 250));
249
250 send_bucket_->Pause();
251
252 // Expect everything to be queued.
253 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
254 ssrc_low_priority, sequence_number++, capture_time_ms, 250));
255 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
256 ssrc, sequence_number++, capture_time_ms, 250));
257 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
258 ssrc, sequence_number++, second_capture_time_ms, 250));
259 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
260 ssrc, sequence_number++, capture_time_ms, 250));
261
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000262 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
263 send_bucket_->QueueInMs());
264
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000265 // Expect no packet to come out while paused.
266 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
267 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _)).Times(0);
268
269 for (int i = 0; i < 10; ++i) {
270 TickTime::AdvanceFakeClock(5);
271 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
272 EXPECT_EQ(0, send_bucket_->Process());
273 }
274 // Expect high prio packets to come out first followed by all packets in the
275 // way they were added.
276 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms)).Times(3);
277
278 send_bucket_->Resume();
279
280 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
281 TickTime::AdvanceFakeClock(5);
282 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
283 EXPECT_EQ(0, send_bucket_->Process());
284
285 EXPECT_CALL(callback_,
286 TimeToSendPacket(_, _, second_capture_time_ms)).Times(1);
287
288 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
289 TickTime::AdvanceFakeClock(5);
290 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
291 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000292 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000293}
294
295} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000296} // namespace webrtc