blob: 66a33831126466f8ab070ae0729b25188827e811 [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:
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000027 MOCK_METHOD4(TimeToSendPacket,
28 bool(uint32_t ssrc, uint16_t sequence_number, int64_t capture_time_ms,
29 bool retransmission));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000030 MOCK_METHOD1(TimeToSendPadding,
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000031 int(int bytes));
32};
33
34class PacedSenderPadding : public PacedSender::Callback {
35 public:
36 PacedSenderPadding() : padding_sent_(0) {}
37
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000038 bool TimeToSendPacket(uint32_t ssrc, uint16_t sequence_number,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000039 int64_t capture_time_ms, bool retransmission) {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000040 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000041 }
42
43 int TimeToSendPadding(int bytes) {
44 const int kPaddingPacketSize = 224;
45 int num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
46 padding_sent_ += kPaddingPacketSize * num_packets;
47 return kPaddingPacketSize * num_packets;
48 }
49
50 int padding_sent() { return padding_sent_; }
51
52 private:
53 int padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000054};
55
56class PacedSenderTest : public ::testing::Test {
57 protected:
58 PacedSenderTest() {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000059 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000060 TickTime::UseFakeClock(123456);
61 // Need to initialize PacedSender after we initialize clock.
pwestin@webrtc.org52b4e882013-05-02 19:02:17 +000062 send_bucket_.reset(new PacedSender(&callback_, kTargetBitrate,
63 kPaceMultiplier));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000064 send_bucket_->SetStatus(true);
65 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000066
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000067 void SendAndExpectPacket(PacedSender::Priority priority,
68 uint32_t ssrc, uint16_t sequence_number,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000069 int64_t capture_time_ms, int size,
70 bool retransmission) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000071 EXPECT_FALSE(send_bucket_->SendPacket(priority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000072 sequence_number, capture_time_ms, size, retransmission));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000073 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000074 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000075 .Times(1)
76 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000077 }
78
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000079 MockPacedSenderCallback callback_;
80 scoped_ptr<PacedSender> send_bucket_;
81};
82
83TEST_F(PacedSenderTest, QueuePacket) {
84 uint32_t ssrc = 12345;
85 uint16_t sequence_number = 1234;
86 int64_t capture_time_ms = 56789;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000087 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000088 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000089 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000090 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000091 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000092 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000093 capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000094 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000095 sequence_number, capture_time_ms, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000096 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000097 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000098 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000099 EXPECT_CALL(callback_,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000100 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000101 TickTime::AdvanceFakeClock(4);
102 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000103 TickTime::AdvanceFakeClock(1);
104 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000105 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000106 ssrc, sequence_number++, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000107 .Times(1)
108 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000109 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000110 sequence_number++;
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000111 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000112 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000113 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000114 capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000115 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000116 sequence_number++, capture_time_ms, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000117 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000118}
119
120TEST_F(PacedSenderTest, PaceQueuedPackets) {
121 uint32_t ssrc = 12345;
122 uint16_t sequence_number = 1234;
123 int64_t capture_time_ms = 56789;
124
125 // Due to the multiplicative factor we can send 3 packets not 2 packets.
126 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000127 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000128 capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000129 }
130 for (int j = 0; j < 30; ++j) {
131 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000132 sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000133 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000134 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000135 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000136 for (int k = 0; k < 10; ++k) {
137 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
138 TickTime::AdvanceFakeClock(5);
139 EXPECT_CALL(callback_,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000140 TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000141 .Times(3)
142 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000143 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
144 EXPECT_EQ(0, send_bucket_->Process());
145 }
146 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
147 TickTime::AdvanceFakeClock(5);
148 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
149 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000150 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000151 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000152 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000153 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000154 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000155 capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000156 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000157 sequence_number, capture_time_ms, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000158 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000159}
160
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000161TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
162 uint32_t ssrc = 12345;
163 uint16_t sequence_number = 1234;
164 int64_t capture_time_ms = 56789;
165 uint16_t queued_sequence_number;
166
167 // Due to the multiplicative factor we can send 3 packets not 2 packets.
168 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000169 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000170 capture_time_ms, 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000171 }
172 queued_sequence_number = sequence_number;
173
174 for (int j = 0; j < 30; ++j) {
175 // Send in duplicate packets.
176 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000177 sequence_number, capture_time_ms, 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000178 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000179 sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000180 }
181 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000182 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000183 for (int k = 0; k < 10; ++k) {
184 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
185 TickTime::AdvanceFakeClock(5);
186
187 for (int i = 0; i < 3; ++i) {
188 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, queued_sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000189 capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000190 .Times(1)
191 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000192 }
193 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
194 EXPECT_EQ(0, send_bucket_->Process());
195 }
196 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
197 TickTime::AdvanceFakeClock(5);
198 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
199 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000200 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000201 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000202 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000203 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000204 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000205 capture_time_ms, 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000206 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000207 sequence_number++, capture_time_ms, 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000208 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000209}
210
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000211TEST_F(PacedSenderTest, Padding) {
212 uint32_t ssrc = 12345;
213 uint16_t sequence_number = 1234;
214 int64_t capture_time_ms = 56789;
215
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000216 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000217 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000218 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000219 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000220 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000221 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000222 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000223 capture_time_ms, 250, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000224 // No padding is expected since we have sent too much already.
225 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000226 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
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000231 // 5 milliseconds later we have enough budget to send some padding.
232 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
233 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000234 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
235 TickTime::AdvanceFakeClock(5);
236 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
237 EXPECT_EQ(0, send_bucket_->Process());
238}
239
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000240TEST_F(PacedSenderTest, NoPaddingWhenDisabled) {
241 send_bucket_->SetStatus(false);
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000242 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000243 // No padding is expected since the pacer is disabled.
244 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
245 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
246 TickTime::AdvanceFakeClock(5);
247 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
248 EXPECT_EQ(0, send_bucket_->Process());
249 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
250 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
251 TickTime::AdvanceFakeClock(5);
252 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
253 EXPECT_EQ(0, send_bucket_->Process());
254}
255
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000256TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
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 = 100;
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000262 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000263 int64_t start_time = TickTime::MillisecondTimestamp();
264 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000265 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000266 capture_time_ms, 250, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000267 TickTime::AdvanceFakeClock(kTimeStep);
268 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
269 WillOnce(Return(250));
270 send_bucket_->Process();
271 }
272}
273
274TEST_F(PacedSenderTest, VerifyMaxPaddingBitrate) {
275 uint32_t ssrc = 12345;
276 uint16_t sequence_number = 1234;
277 int64_t capture_time_ms = 56789;
278 const int kTimeStep = 5;
279 const int64_t kBitrateWindow = 100;
280 const int kTargetBitrate = 1500;
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000281 const int kMaxPaddingBitrate = 800;
282 send_bucket_->UpdateBitrate(kTargetBitrate, kMaxPaddingBitrate,
283 kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000284 int64_t start_time = TickTime::MillisecondTimestamp();
285 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000286 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000287 capture_time_ms, 250, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000288 TickTime::AdvanceFakeClock(kTimeStep);
289 EXPECT_CALL(callback_, TimeToSendPadding(500)).Times(1).
290 WillOnce(Return(250));
291 send_bucket_->Process();
292 }
293}
294
295TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
296 uint32_t ssrc = 12345;
297 uint16_t sequence_number = 1234;
298 int64_t capture_time_ms = 56789;
299 const int kTimeStep = 5;
300 const int64_t kBitrateWindow = 10000;
301 PacedSenderPadding callback;
302 send_bucket_.reset(new PacedSender(&callback, kTargetBitrate,
303 kPaceMultiplier));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000304 send_bucket_->SetStatus(true);
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000305 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000306 int64_t start_time = TickTime::MillisecondTimestamp();
307 int media_bytes = 0;
308 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
309 int media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000310 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
311 sequence_number++, capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000312 media_payload, false));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000313 media_bytes += media_payload;
314 TickTime::AdvanceFakeClock(kTimeStep);
315 send_bucket_->Process();
316 }
317 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
318 kBitrateWindow, 1);
319}
320
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000321TEST_F(PacedSenderTest, Priority) {
322 uint32_t ssrc_low_priority = 12345;
323 uint32_t ssrc = 12346;
324 uint16_t sequence_number = 1234;
325 int64_t capture_time_ms = 56789;
326 int64_t capture_time_ms_low_priority = 1234567;
327
328 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000329 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000330 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000331 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000332 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000333 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000334 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000335 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000336
337 // Expect normal and low priority to be queued and high to pass through.
338 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000339 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
340 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000341 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000342 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000343 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000344 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000345 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000346 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000347
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000348 // Expect all high and normal priority to be sent out first.
349 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000350 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000351 .Times(3)
352 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000353
354 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
355 TickTime::AdvanceFakeClock(5);
356 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
357 EXPECT_EQ(0, send_bucket_->Process());
358
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000359 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000360 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000361 .Times(1)
362 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000363
364 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
365 TickTime::AdvanceFakeClock(5);
366 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
367 EXPECT_EQ(0, send_bucket_->Process());
368}
369
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000370TEST_F(PacedSenderTest, Pause) {
371 uint32_t ssrc_low_priority = 12345;
372 uint32_t ssrc = 12346;
373 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000374 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
375 TickTime::AdvanceFakeClock(10000);
376 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
377
378 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000379
380 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000381 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000382 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000383 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000384 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000385 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000386 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000387 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000388
389 send_bucket_->Pause();
390
391 // Expect everything to be queued.
392 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000393 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
394 false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000395 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000396 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000397 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000398 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000399 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000400 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000401
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000402 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
403 send_bucket_->QueueInMs());
404
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000405 // Expect no packet to come out while paused.
406 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000407 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000408
409 for (int i = 0; i < 10; ++i) {
410 TickTime::AdvanceFakeClock(5);
411 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
412 EXPECT_EQ(0, send_bucket_->Process());
413 }
414 // Expect high prio packets to come out first followed by all packets in the
415 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000416 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000417 .Times(3)
418 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000419 send_bucket_->Resume();
420
421 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
422 TickTime::AdvanceFakeClock(5);
423 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
424 EXPECT_EQ(0, send_bucket_->Process());
425
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000426 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000427 .Times(1)
428 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000429 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
430 TickTime::AdvanceFakeClock(5);
431 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
432 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000433 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000434}
435
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000436TEST_F(PacedSenderTest, ResendPacket) {
437 uint32_t ssrc = 12346;
438 uint16_t sequence_number = 1234;
439 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
440 EXPECT_EQ(0, send_bucket_->QueueInMs());
441
442 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
443 ssrc,
444 sequence_number,
445 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000446 250,
447 false));
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000448 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
449 ssrc,
450 sequence_number + 1,
451 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000452 250,
453 false));
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000454 TickTime::AdvanceFakeClock(10000);
455 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
456 send_bucket_->QueueInMs());
457 // Fails to send first packet so only one call.
458 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000459 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000460 .Times(1)
461 .WillOnce(Return(false));
462 TickTime::AdvanceFakeClock(10000);
463 send_bucket_->Process();
464
465 // Queue remains unchanged.
466 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
467 send_bucket_->QueueInMs());
468
469 // Fails to send second packet.
470 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000471 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000472 .Times(1)
473 .WillOnce(Return(true));
474 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000475 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000476 .Times(1)
477 .WillOnce(Return(false));
478 TickTime::AdvanceFakeClock(10000);
479 send_bucket_->Process();
480
481 // Queue is reduced by 1 packet.
482 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms - 1,
483 send_bucket_->QueueInMs());
484
485 // Send second packet and queue becomes empty.
486 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000487 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000488 .Times(1)
489 .WillOnce(Return(true));
490 TickTime::AdvanceFakeClock(10000);
491 send_bucket_->Process();
492 EXPECT_EQ(0, send_bucket_->QueueInMs());
493}
494
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000495} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000496} // namespace webrtc