blob: f8dcdfc69854ce258ee34554cc4b7ca7d0e3fcd3 [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
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000424 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000425 .Times(1)
426 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000427 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
428 TickTime::AdvanceFakeClock(5);
429 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
430 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000431 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000432}
433
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000434TEST_F(PacedSenderTest, ResendPacket) {
435 uint32_t ssrc = 12346;
436 uint16_t sequence_number = 1234;
437 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
438 EXPECT_EQ(0, send_bucket_->QueueInMs());
439
440 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
441 ssrc,
442 sequence_number,
443 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000444 250,
445 false));
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000446 TickTime::AdvanceFakeClock(1);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000447 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
448 ssrc,
449 sequence_number + 1,
450 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000451 250,
452 false));
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000453 TickTime::AdvanceFakeClock(9999);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000454 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
455 send_bucket_->QueueInMs());
456 // Fails to send first packet so only one call.
457 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000458 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000459 .Times(1)
460 .WillOnce(Return(false));
461 TickTime::AdvanceFakeClock(10000);
462 send_bucket_->Process();
463
464 // Queue remains unchanged.
465 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
466 send_bucket_->QueueInMs());
467
468 // Fails to send second packet.
469 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000470 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000471 .Times(1)
472 .WillOnce(Return(true));
473 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000474 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000475 .Times(1)
476 .WillOnce(Return(false));
477 TickTime::AdvanceFakeClock(10000);
478 send_bucket_->Process();
479
480 // Queue is reduced by 1 packet.
481 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms - 1,
482 send_bucket_->QueueInMs());
483
484 // Send second packet and queue becomes empty.
485 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000486 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000487 .Times(1)
488 .WillOnce(Return(true));
489 TickTime::AdvanceFakeClock(10000);
490 send_bucket_->Process();
491 EXPECT_EQ(0, send_bucket_->QueueInMs());
492}
493
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000494TEST_F(PacedSenderTest, MaxQueueLength) {
495 uint32_t ssrc = 12346;
496 uint16_t sequence_number = 1234;
497 EXPECT_EQ(0, send_bucket_->QueueInMs());
498
499 send_bucket_->UpdateBitrate(30, 0, 0);
500 for (int i = 0; i < 30; ++i) {
501 SendAndExpectPacket(PacedSender::kNormalPriority,
502 ssrc,
503 sequence_number++,
504 TickTime::MillisecondTimestamp(),
505 1200,
506 false);
507 }
508
509 TickTime::AdvanceFakeClock(2001);
510 SendAndExpectPacket(PacedSender::kNormalPriority,
511 ssrc,
512 sequence_number++,
513 TickTime::MillisecondTimestamp(),
514 1200,
515 false);
516 EXPECT_EQ(2001, send_bucket_->QueueInMs());
517 send_bucket_->Process();
518 EXPECT_EQ(0, send_bucket_->QueueInMs());
519 TickTime::AdvanceFakeClock(31);
520 send_bucket_->Process();
521}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000522
523TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
524 uint32_t ssrc = 12346;
525 uint16_t sequence_number = 1234;
526 EXPECT_EQ(0, send_bucket_->QueueInMs());
527
528 send_bucket_->UpdateBitrate(30, 0, 0);
529 SendAndExpectPacket(PacedSender::kNormalPriority,
530 ssrc,
531 sequence_number,
532 TickTime::MillisecondTimestamp(),
533 1200,
534 false);
535
536 TickTime::AdvanceFakeClock(500);
537 EXPECT_EQ(500, send_bucket_->QueueInMs());
538 send_bucket_->Process();
539 EXPECT_EQ(0, send_bucket_->QueueInMs());
540}
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000541} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000542} // namespace webrtc