blob: a99101db395a25a9ce3d711de8656c2d942e746a [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;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000086 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000087 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +000088 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000089 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +000090 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +000091 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +000092 TickTime::MillisecondTimestamp(), 250, false);
93 int64_t queued_packet_timestamp = TickTime::MillisecondTimestamp();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000094 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +000095 sequence_number, queued_packet_timestamp, 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 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(
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000104 ssrc, sequence_number++, queued_packet_timestamp, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000105 .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++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000110 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000111 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000112 TickTime::MillisecondTimestamp(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000113 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000114 sequence_number++, TickTime::MillisecondTimestamp(), 250, false));
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;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000121
122 // Due to the multiplicative factor we can send 3 packets not 2 packets.
123 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000124 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000125 TickTime::MillisecondTimestamp(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000126 }
127 for (int j = 0; j < 30; ++j) {
128 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000129 sequence_number++, TickTime::MillisecondTimestamp(), 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000130 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000131 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000132 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000133 for (int k = 0; k < 10; ++k) {
134 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
135 TickTime::AdvanceFakeClock(5);
136 EXPECT_CALL(callback_,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000137 TimeToSendPacket(ssrc, _, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000138 .Times(3)
139 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000140 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
141 EXPECT_EQ(0, send_bucket_->Process());
142 }
143 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
144 TickTime::AdvanceFakeClock(5);
145 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
146 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000147 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000148 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000149 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000150 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000151 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000152 TickTime::MillisecondTimestamp(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000153 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000154 sequence_number, TickTime::MillisecondTimestamp(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000155 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000156}
157
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000158TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
159 uint32_t ssrc = 12345;
160 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000161 uint16_t queued_sequence_number;
162
163 // Due to the multiplicative factor we can send 3 packets not 2 packets.
164 for (int i = 0; i < 3; ++i) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000165 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000166 TickTime::MillisecondTimestamp(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000167 }
168 queued_sequence_number = sequence_number;
169
170 for (int j = 0; j < 30; ++j) {
171 // Send in duplicate packets.
172 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000173 sequence_number, TickTime::MillisecondTimestamp(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000174 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000175 sequence_number++, TickTime::MillisecondTimestamp(), 250, false));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000176 }
177 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000178 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000179 for (int k = 0; k < 10; ++k) {
180 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
181 TickTime::AdvanceFakeClock(5);
182
183 for (int i = 0; i < 3; ++i) {
184 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, queued_sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000185 _,
186 false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000187 .Times(1)
188 .WillRepeatedly(Return(true));
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000189 }
190 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
191 EXPECT_EQ(0, send_bucket_->Process());
192 }
193 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
194 TickTime::AdvanceFakeClock(5);
195 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
196 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000197 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000198 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000199 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000200 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000201 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000202 TickTime::MillisecondTimestamp(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000203 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000204 sequence_number++, TickTime::MillisecondTimestamp(), 250, false));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000205 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000206}
207
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000208TEST_F(PacedSenderTest, Padding) {
209 uint32_t ssrc = 12345;
210 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000211
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000212 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000213 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000214 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000215 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000216 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000217 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000218 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000219 TickTime::MillisecondTimestamp(), 250, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000220 // No padding is expected since we have sent too much already.
221 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000222 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
223 TickTime::AdvanceFakeClock(5);
224 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
225 EXPECT_EQ(0, send_bucket_->Process());
226
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000227 // 5 milliseconds later we have enough budget to send some padding.
228 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
229 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000230 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
231 TickTime::AdvanceFakeClock(5);
232 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
233 EXPECT_EQ(0, send_bucket_->Process());
234}
235
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000236TEST_F(PacedSenderTest, NoPaddingWhenDisabled) {
237 send_bucket_->SetStatus(false);
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000238 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.org80865fd2013-08-09 11:31:23 +0000239 // No padding is expected since the pacer is disabled.
240 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
241 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
242 TickTime::AdvanceFakeClock(5);
243 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
244 EXPECT_EQ(0, send_bucket_->Process());
245 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
246 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
247 TickTime::AdvanceFakeClock(5);
248 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
249 EXPECT_EQ(0, send_bucket_->Process());
250}
251
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000252TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
253 uint32_t ssrc = 12345;
254 uint16_t sequence_number = 1234;
255 int64_t capture_time_ms = 56789;
256 const int kTimeStep = 5;
257 const int64_t kBitrateWindow = 100;
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000258 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000259 int64_t start_time = TickTime::MillisecondTimestamp();
260 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000261 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000262 capture_time_ms, 250, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000263 TickTime::AdvanceFakeClock(kTimeStep);
264 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
265 WillOnce(Return(250));
266 send_bucket_->Process();
267 }
268}
269
270TEST_F(PacedSenderTest, VerifyMaxPaddingBitrate) {
271 uint32_t ssrc = 12345;
272 uint16_t sequence_number = 1234;
273 int64_t capture_time_ms = 56789;
274 const int kTimeStep = 5;
275 const int64_t kBitrateWindow = 100;
276 const int kTargetBitrate = 1500;
stefan@webrtc.orgb2c8a952013-09-06 13:58:01 +0000277 const int kMaxPaddingBitrate = 800;
278 send_bucket_->UpdateBitrate(kTargetBitrate, kMaxPaddingBitrate,
279 kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000280 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++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000283 capture_time_ms, 250, false);
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.orgb2c8a952013-09-06 13:58:01 +0000301 send_bucket_->UpdateBitrate(kTargetBitrate, kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000302 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,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000308 media_payload, false));
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++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000326 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000327 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000328 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000329 SendAndExpectPacket(PacedSender::kNormalPriority, 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 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,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000335 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
336 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000337 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000338 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000339 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000340 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000341 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
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
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000344 // Expect all high and normal priority to be sent out first.
345 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000346 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000347 .Times(3)
348 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000349
350 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
351 TickTime::AdvanceFakeClock(5);
352 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
353 EXPECT_EQ(0, send_bucket_->Process());
354
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000355 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000356 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000357 .Times(1)
358 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000359
360 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
361 TickTime::AdvanceFakeClock(5);
362 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
363 EXPECT_EQ(0, send_bucket_->Process());
364}
365
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000366TEST_F(PacedSenderTest, Pause) {
367 uint32_t ssrc_low_priority = 12345;
368 uint32_t ssrc = 12346;
369 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000370 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000371
372 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000373
374 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000375 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000376 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000377 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000378 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000379 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000380 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000381 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000382
383 send_bucket_->Pause();
384
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000385 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000386 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000387 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000388 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000389 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000390 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000391
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000392 TickTime::AdvanceFakeClock(10000);
393 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
394
395 // Expect everything to be queued.
396 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
397 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
398 false));
399
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000400 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
401 send_bucket_->QueueInMs());
402
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000403 // Expect no packet to come out while paused.
404 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000405 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000406
407 for (int i = 0; i < 10; ++i) {
408 TickTime::AdvanceFakeClock(5);
409 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
410 EXPECT_EQ(0, send_bucket_->Process());
411 }
412 // Expect high prio packets to come out first followed by all packets in the
413 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000414 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000415 .Times(3)
416 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000417 send_bucket_->Resume();
418
419 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
420 TickTime::AdvanceFakeClock(5);
421 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
422 EXPECT_EQ(0, send_bucket_->Process());
423
jiayl@webrtc.org9fd8d872014-02-27 22:32:40 +0000424 EXPECT_CALL(
425 callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000426 .Times(1)
427 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000428 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
429 TickTime::AdvanceFakeClock(5);
430 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
431 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000432 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000433}
434
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000435TEST_F(PacedSenderTest, ResendPacket) {
436 uint32_t ssrc = 12346;
437 uint16_t sequence_number = 1234;
438 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
439 EXPECT_EQ(0, send_bucket_->QueueInMs());
440
441 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
442 ssrc,
443 sequence_number,
444 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000445 250,
446 false));
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000447 TickTime::AdvanceFakeClock(1);
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));
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000454 TickTime::AdvanceFakeClock(9999);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000455 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
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000495TEST_F(PacedSenderTest, MaxQueueLength) {
496 uint32_t ssrc = 12346;
497 uint16_t sequence_number = 1234;
498 EXPECT_EQ(0, send_bucket_->QueueInMs());
499
500 send_bucket_->UpdateBitrate(30, 0, 0);
501 for (int i = 0; i < 30; ++i) {
502 SendAndExpectPacket(PacedSender::kNormalPriority,
503 ssrc,
504 sequence_number++,
505 TickTime::MillisecondTimestamp(),
506 1200,
507 false);
508 }
509
510 TickTime::AdvanceFakeClock(2001);
511 SendAndExpectPacket(PacedSender::kNormalPriority,
512 ssrc,
513 sequence_number++,
514 TickTime::MillisecondTimestamp(),
515 1200,
516 false);
517 EXPECT_EQ(2001, send_bucket_->QueueInMs());
518 send_bucket_->Process();
519 EXPECT_EQ(0, send_bucket_->QueueInMs());
520 TickTime::AdvanceFakeClock(31);
521 send_bucket_->Process();
522}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000523
524TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
525 uint32_t ssrc = 12346;
526 uint16_t sequence_number = 1234;
527 EXPECT_EQ(0, send_bucket_->QueueInMs());
528
529 send_bucket_->UpdateBitrate(30, 0, 0);
530 SendAndExpectPacket(PacedSender::kNormalPriority,
531 ssrc,
532 sequence_number,
533 TickTime::MillisecondTimestamp(),
534 1200,
535 false);
536
537 TickTime::AdvanceFakeClock(500);
538 EXPECT_EQ(500, send_bucket_->QueueInMs());
539 send_bucket_->Process();
540 EXPECT_EQ(0, send_bucket_->QueueInMs());
541}
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000542} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000543} // namespace webrtc