blob: 655c03da87de263168f2519fa3610d2858a07521 [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();
371 TickTime::AdvanceFakeClock(10000);
372 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
373
374 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000375
376 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000377 SendAndExpectPacket(PacedSender::kLowPriority, 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 SendAndExpectPacket(PacedSender::kNormalPriority, 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 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000384
385 send_bucket_->Pause();
386
387 // Expect everything to be queued.
388 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000389 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
390 false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000391 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000392 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000393 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000394 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000395 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
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
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000398 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
399 send_bucket_->QueueInMs());
400
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000401 // Expect no packet to come out while paused.
402 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000403 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000404
405 for (int i = 0; i < 10; ++i) {
406 TickTime::AdvanceFakeClock(5);
407 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
408 EXPECT_EQ(0, send_bucket_->Process());
409 }
410 // Expect high prio packets to come out first followed by all packets in the
411 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000412 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000413 .Times(3)
414 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000415 send_bucket_->Resume();
416
417 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
418 TickTime::AdvanceFakeClock(5);
419 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
420 EXPECT_EQ(0, send_bucket_->Process());
421
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000422 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000423 .Times(1)
424 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000425 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
426 TickTime::AdvanceFakeClock(5);
427 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
428 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000429 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000430}
431
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000432TEST_F(PacedSenderTest, ResendPacket) {
433 uint32_t ssrc = 12346;
434 uint16_t sequence_number = 1234;
435 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
436 EXPECT_EQ(0, send_bucket_->QueueInMs());
437
438 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
439 ssrc,
440 sequence_number,
441 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000442 250,
443 false));
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000444 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
445 ssrc,
446 sequence_number + 1,
447 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000448 250,
449 false));
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000450 TickTime::AdvanceFakeClock(10000);
451 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
452 send_bucket_->QueueInMs());
453 // Fails to send first packet so only one call.
454 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000455 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000456 .Times(1)
457 .WillOnce(Return(false));
458 TickTime::AdvanceFakeClock(10000);
459 send_bucket_->Process();
460
461 // Queue remains unchanged.
462 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
463 send_bucket_->QueueInMs());
464
465 // Fails to send second packet.
466 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000467 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000468 .Times(1)
469 .WillOnce(Return(true));
470 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000471 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000472 .Times(1)
473 .WillOnce(Return(false));
474 TickTime::AdvanceFakeClock(10000);
475 send_bucket_->Process();
476
477 // Queue is reduced by 1 packet.
478 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms - 1,
479 send_bucket_->QueueInMs());
480
481 // Send second packet and queue becomes empty.
482 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000483 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000484 .Times(1)
485 .WillOnce(Return(true));
486 TickTime::AdvanceFakeClock(10000);
487 send_bucket_->Process();
488 EXPECT_EQ(0, send_bucket_->QueueInMs());
489}
490
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000491TEST_F(PacedSenderTest, MaxQueueLength) {
492 uint32_t ssrc = 12346;
493 uint16_t sequence_number = 1234;
494 EXPECT_EQ(0, send_bucket_->QueueInMs());
495
496 send_bucket_->UpdateBitrate(30, 0, 0);
497 for (int i = 0; i < 30; ++i) {
498 SendAndExpectPacket(PacedSender::kNormalPriority,
499 ssrc,
500 sequence_number++,
501 TickTime::MillisecondTimestamp(),
502 1200,
503 false);
504 }
505
506 TickTime::AdvanceFakeClock(2001);
507 SendAndExpectPacket(PacedSender::kNormalPriority,
508 ssrc,
509 sequence_number++,
510 TickTime::MillisecondTimestamp(),
511 1200,
512 false);
513 EXPECT_EQ(2001, send_bucket_->QueueInMs());
514 send_bucket_->Process();
515 EXPECT_EQ(0, send_bucket_->QueueInMs());
516 TickTime::AdvanceFakeClock(31);
517 send_bucket_->Process();
518}
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000519} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000520} // namespace webrtc