blob: 435c93c54a06299c7c0e3821fd0e1db280db8e0e [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.
pbos@webrtc.org709e2972014-03-19 10:59:52 +000062 send_bucket_.reset(
63 new PacedSender(&callback_, kPaceMultiplier * kTargetBitrate, 0));
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
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000212 send_bucket_->UpdateBitrate(kPaceMultiplier * 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);
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000238 send_bucket_->UpdateBitrate(kPaceMultiplier * 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;
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000258 send_bucket_->UpdateBitrate(kPaceMultiplier * 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
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000270TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
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 = 10000;
276 PacedSenderPadding callback;
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000277 send_bucket_.reset(
278 new PacedSender(&callback, kPaceMultiplier * kTargetBitrate, 0));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000279 send_bucket_->SetStatus(true);
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000280 send_bucket_->UpdateBitrate(kPaceMultiplier * kTargetBitrate, kTargetBitrate);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000281 int64_t start_time = TickTime::MillisecondTimestamp();
282 int media_bytes = 0;
283 while (TickTime::MillisecondTimestamp() - start_time < kBitrateWindow) {
284 int media_payload = rand() % 100 + 200; // [200, 300] bytes.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000285 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority, ssrc,
286 sequence_number++, capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000287 media_payload, false));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000288 media_bytes += media_payload;
289 TickTime::AdvanceFakeClock(kTimeStep);
290 send_bucket_->Process();
291 }
292 EXPECT_NEAR(kTargetBitrate, 8 * (media_bytes + callback.padding_sent()) /
293 kBitrateWindow, 1);
294}
295
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000296TEST_F(PacedSenderTest, Priority) {
297 uint32_t ssrc_low_priority = 12345;
298 uint32_t ssrc = 12346;
299 uint16_t sequence_number = 1234;
300 int64_t capture_time_ms = 56789;
301 int64_t capture_time_ms_low_priority = 1234567;
302
303 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000304 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000305 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000306 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000307 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000308 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000309 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000310 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000311
312 // Expect normal and low priority to be queued and high to pass through.
313 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000314 ssrc_low_priority, sequence_number++, capture_time_ms_low_priority, 250,
315 false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000316 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000317 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000318 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000319 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000320 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000321 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000322
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000323 // Expect all high and normal priority to be sent out first.
324 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000325 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000326 .Times(3)
327 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000328
329 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
330 TickTime::AdvanceFakeClock(5);
331 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
332 EXPECT_EQ(0, send_bucket_->Process());
333
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000334 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000335 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000336 .Times(1)
337 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000338
339 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
340 TickTime::AdvanceFakeClock(5);
341 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
342 EXPECT_EQ(0, send_bucket_->Process());
343}
344
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000345TEST_F(PacedSenderTest, Pause) {
346 uint32_t ssrc_low_priority = 12345;
347 uint32_t ssrc = 12346;
348 uint16_t sequence_number = 1234;
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000349 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000350
351 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000352
353 // Due to the multiplicative factor we can send 3 packets not 2 packets.
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000354 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000355 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000356 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000357 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000358 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000359 capture_time_ms, 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000360 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000361
362 send_bucket_->Pause();
363
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000364 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000365 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000366 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000367 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000368 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kHighPriority,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000369 ssrc, sequence_number++, capture_time_ms, 250, false));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000370
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000371 TickTime::AdvanceFakeClock(10000);
372 int64_t second_capture_time_ms = TickTime::MillisecondTimestamp();
373
374 // Expect everything to be queued.
375 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kLowPriority,
376 ssrc_low_priority, sequence_number++, second_capture_time_ms, 250,
377 false));
378
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000379 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
380 send_bucket_->QueueInMs());
381
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000382 // Expect no packet to come out while paused.
383 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000384 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000385
386 for (int i = 0; i < 10; ++i) {
387 TickTime::AdvanceFakeClock(5);
388 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
389 EXPECT_EQ(0, send_bucket_->Process());
390 }
391 // Expect high prio packets to come out first followed by all packets in the
392 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000393 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000394 .Times(3)
395 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000396 send_bucket_->Resume();
397
398 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
399 TickTime::AdvanceFakeClock(5);
400 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
401 EXPECT_EQ(0, send_bucket_->Process());
402
jiayl@webrtc.org9fd8d872014-02-27 22:32:40 +0000403 EXPECT_CALL(
404 callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000405 .Times(1)
406 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000407 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
408 TickTime::AdvanceFakeClock(5);
409 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
410 EXPECT_EQ(0, send_bucket_->Process());
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000411 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000412}
413
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000414TEST_F(PacedSenderTest, ResendPacket) {
415 uint32_t ssrc = 12346;
416 uint16_t sequence_number = 1234;
417 int64_t capture_time_ms = TickTime::MillisecondTimestamp();
418 EXPECT_EQ(0, send_bucket_->QueueInMs());
419
420 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
421 ssrc,
422 sequence_number,
423 capture_time_ms,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000424 250,
425 false));
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000426 TickTime::AdvanceFakeClock(1);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000427 EXPECT_FALSE(send_bucket_->SendPacket(PacedSender::kNormalPriority,
428 ssrc,
429 sequence_number + 1,
430 capture_time_ms + 1,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000431 250,
432 false));
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000433 TickTime::AdvanceFakeClock(9999);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000434 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
435 send_bucket_->QueueInMs());
436 // Fails to send first packet so only one call.
437 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000438 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000439 .Times(1)
440 .WillOnce(Return(false));
441 TickTime::AdvanceFakeClock(10000);
442 send_bucket_->Process();
443
444 // Queue remains unchanged.
445 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms,
446 send_bucket_->QueueInMs());
447
448 // Fails to send second packet.
449 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000450 ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000451 .Times(1)
452 .WillOnce(Return(true));
453 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000454 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000455 .Times(1)
456 .WillOnce(Return(false));
457 TickTime::AdvanceFakeClock(10000);
458 send_bucket_->Process();
459
460 // Queue is reduced by 1 packet.
461 EXPECT_EQ(TickTime::MillisecondTimestamp() - capture_time_ms - 1,
462 send_bucket_->QueueInMs());
463
464 // Send second packet and queue becomes empty.
465 EXPECT_CALL(callback_, TimeToSendPacket(
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000466 ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000467 .Times(1)
468 .WillOnce(Return(true));
469 TickTime::AdvanceFakeClock(10000);
470 send_bucket_->Process();
471 EXPECT_EQ(0, send_bucket_->QueueInMs());
472}
473
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000474TEST_F(PacedSenderTest, MaxQueueLength) {
475 uint32_t ssrc = 12346;
476 uint16_t sequence_number = 1234;
477 EXPECT_EQ(0, send_bucket_->QueueInMs());
478
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000479 send_bucket_->UpdateBitrate(kPaceMultiplier * 30, 0);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000480 for (int i = 0; i < 30; ++i) {
481 SendAndExpectPacket(PacedSender::kNormalPriority,
482 ssrc,
483 sequence_number++,
484 TickTime::MillisecondTimestamp(),
485 1200,
486 false);
487 }
488
489 TickTime::AdvanceFakeClock(2001);
490 SendAndExpectPacket(PacedSender::kNormalPriority,
491 ssrc,
492 sequence_number++,
493 TickTime::MillisecondTimestamp(),
494 1200,
495 false);
496 EXPECT_EQ(2001, send_bucket_->QueueInMs());
497 send_bucket_->Process();
498 EXPECT_EQ(0, send_bucket_->QueueInMs());
499 TickTime::AdvanceFakeClock(31);
500 send_bucket_->Process();
501}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000502
503TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
504 uint32_t ssrc = 12346;
505 uint16_t sequence_number = 1234;
506 EXPECT_EQ(0, send_bucket_->QueueInMs());
507
pbos@webrtc.org709e2972014-03-19 10:59:52 +0000508 send_bucket_->UpdateBitrate(kPaceMultiplier * 30, 0);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000509 SendAndExpectPacket(PacedSender::kNormalPriority,
510 ssrc,
511 sequence_number,
512 TickTime::MillisecondTimestamp(),
513 1200,
514 false);
515
516 TickTime::AdvanceFakeClock(500);
517 EXPECT_EQ(500, send_bucket_->QueueInMs());
518 send_bucket_->Process();
519 EXPECT_EQ(0, send_bucket_->QueueInMs());
520}
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000521} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000522} // namespace webrtc