blob: 15bb462949b4394e160db3703aad94b246d44816 [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
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000011#include <list>
kwiberg22feaa32016-03-17 09:17:43 -070012#include <memory>
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000013
pbos@webrtc.orgdb6e3f82013-07-11 09:50:05 +000014#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010016#include "webrtc/modules/pacing/paced_sender.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010017#include "webrtc/system_wrappers/include/clock.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000018
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000019using testing::_;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000020using testing::Return;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000021
22namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000023namespace test {
24
Per28a44562016-05-04 17:12:51 +020025static const int kTargetBitrateBps = 800000;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000026
Per28a44562016-05-04 17:12:51 +020027class MockPacedSenderCallback : public PacedSender::PacketSender {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000028 public:
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +000029 MOCK_METHOD4(TimeToSendPacket,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000030 bool(uint32_t ssrc,
31 uint16_t sequence_number,
32 int64_t capture_time_ms,
33 bool retransmission));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000034 MOCK_METHOD1(TimeToSendPadding,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000035 size_t(size_t bytes));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000036};
37
Per28a44562016-05-04 17:12:51 +020038class PacedSenderPadding : public PacedSender::PacketSender {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000039 public:
40 PacedSenderPadding() : padding_sent_(0) {}
41
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000042 bool TimeToSendPacket(uint32_t ssrc,
43 uint16_t sequence_number,
44 int64_t capture_time_ms,
45 bool retransmission) {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000046 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000047 }
48
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000049 size_t TimeToSendPadding(size_t bytes) {
50 const size_t kPaddingPacketSize = 224;
51 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000052 padding_sent_ += kPaddingPacketSize * num_packets;
53 return kPaddingPacketSize * num_packets;
54 }
55
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000056 size_t padding_sent() { return padding_sent_; }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000057
58 private:
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000059 size_t padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000060};
61
Per28a44562016-05-04 17:12:51 +020062class PacedSenderProbing : public PacedSender::PacketSender {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000063 public:
64 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock)
65 : prev_packet_time_ms_(-1),
66 expected_deltas_(expected_deltas),
67 packets_sent_(0),
68 clock_(clock) {}
69
70 bool TimeToSendPacket(uint32_t ssrc,
71 uint16_t sequence_number,
72 int64_t capture_time_ms,
73 bool retransmission) {
Stefan Holmer01b48882015-05-05 10:21:24 +020074 ExpectAndCountPacket();
75 return true;
76 }
77
78 size_t TimeToSendPadding(size_t bytes) {
79 ExpectAndCountPacket();
80 return bytes;
81 }
82
83 void ExpectAndCountPacket() {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000084 ++packets_sent_;
85 EXPECT_FALSE(expected_deltas_.empty());
86 if (expected_deltas_.empty())
Stefan Holmer01b48882015-05-05 10:21:24 +020087 return;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000088 int64_t now_ms = clock_->TimeInMilliseconds();
89 if (prev_packet_time_ms_ >= 0) {
90 EXPECT_EQ(expected_deltas_.front(), now_ms - prev_packet_time_ms_);
91 expected_deltas_.pop_front();
92 }
93 prev_packet_time_ms_ = now_ms;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000094 }
95
96 int packets_sent() const { return packets_sent_; }
97
98 private:
99 int64_t prev_packet_time_ms_;
100 std::list<int> expected_deltas_;
101 int packets_sent_;
102 Clock* clock_;
103};
104
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000105class PacedSenderTest : public ::testing::Test {
106 protected:
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000107 PacedSenderTest() : clock_(123456) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000108 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000109 // Need to initialize PacedSender after we initialize clock.
Per28a44562016-05-04 17:12:51 +0200110 send_bucket_.reset(new PacedSender(&clock_, &callback_, kTargetBitrateBps));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000111 // Default to bitrate probing disabled for testing purposes. Probing tests
112 // have to enable probing, either by creating a new PacedSender instance or
113 // by calling SetProbingEnabled(true).
114 send_bucket_->SetProbingEnabled(false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000115 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000116
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000117 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000118 uint32_t ssrc,
119 uint16_t sequence_number,
120 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000121 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000122 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200123 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
124 size, retransmission);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000125 EXPECT_CALL(callback_,
126 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000127 .Times(1)
128 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000129 }
130
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000131 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000132 MockPacedSenderCallback callback_;
kwiberg22feaa32016-03-17 09:17:43 -0700133 std::unique_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000134};
135
136TEST_F(PacedSenderTest, QueuePacket) {
137 uint32_t ssrc = 12345;
138 uint16_t sequence_number = 1234;
Per28a44562016-05-04 17:12:51 +0200139 // Due to the multiplicative factor we can send 5 packets during a send
140 // interval. (network capacity * multiplier / (8 bits per byte *
141 // (packet size * #send intervals per second)
142 const size_t packets_to_send =
143 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
144 for (size_t i = 0; i < packets_to_send; ++i) {
145 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
146 clock_.TimeInMilliseconds(), 250, false);
147 }
148
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000149 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200150 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
151 sequence_number, queued_packet_timestamp, 250,
152 false);
Per28a44562016-05-04 17:12:51 +0200153 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000154 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000155 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000156 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000157 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000158 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000159 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000160 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
Per28a44562016-05-04 17:12:51 +0200161 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
162 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
163 queued_packet_timestamp, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000164 .Times(1)
165 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000166 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000167 sequence_number++;
Per28a44562016-05-04 17:12:51 +0200168 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
169
170 // We can send packets_to_send -1 packets of size 250 during the current
171 // interval since one packet has already been sent.
172 for (size_t i = 0; i < packets_to_send - 1; ++i) {
173 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
174 clock_.TimeInMilliseconds(), 250, false);
175 }
Peter Boströme23e7372015-10-08 11:44:14 +0200176 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
177 sequence_number++, clock_.TimeInMilliseconds(),
178 250, false);
Per28a44562016-05-04 17:12:51 +0200179 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000180 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200181 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000182}
183
184TEST_F(PacedSenderTest, PaceQueuedPackets) {
185 uint32_t ssrc = 12345;
186 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000187
Per28a44562016-05-04 17:12:51 +0200188 // Due to the multiplicative factor we can send 5 packets during a send
189 // interval. (network capacity * multiplier / (8 bits per byte *
190 // (packet size * #send intervals per second)
191 const size_t packets_to_send_per_interval =
192 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
193 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
194 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
195 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000196 }
Per28a44562016-05-04 17:12:51 +0200197
198 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200199 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
200 sequence_number++, clock_.TimeInMilliseconds(),
201 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000202 }
Per28a44562016-05-04 17:12:51 +0200203 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
204 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000205 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200206 EXPECT_EQ(packets_to_send_per_interval * 10,
207 send_bucket_->QueueSizePackets());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000208 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000209 for (int k = 0; k < 10; ++k) {
210 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000211 clock_.AdvanceTimeMilliseconds(5);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000212 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
Per28a44562016-05-04 17:12:51 +0200213 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000214 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000215 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800216 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000217 }
Per28a44562016-05-04 17:12:51 +0200218 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000219 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000220 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000221 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
Per28a44562016-05-04 17:12:51 +0200222 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800223 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200224
225 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
226 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
227 clock_.TimeInMilliseconds(), 250, false);
228 }
Peter Boströme23e7372015-10-08 11:44:14 +0200229 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
230 sequence_number, clock_.TimeInMilliseconds(), 250,
231 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000232 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200233 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000234}
235
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000236TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
237 uint32_t ssrc = 12345;
238 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000239 uint16_t queued_sequence_number;
240
Per28a44562016-05-04 17:12:51 +0200241 // Due to the multiplicative factor we can send 5 packets during a send
242 // interval. (network capacity * multiplier / (8 bits per byte *
243 // (packet size * #send intervals per second)
244 const size_t packets_to_send_per_interval =
245 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
246 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
247 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
248 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000249 }
250 queued_sequence_number = sequence_number;
251
Per28a44562016-05-04 17:12:51 +0200252 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000253 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200254 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
255 sequence_number, clock_.TimeInMilliseconds(),
256 250, false);
257 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
258 sequence_number++, clock_.TimeInMilliseconds(),
259 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000260 }
261 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000262 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000263 for (int k = 0; k < 10; ++k) {
264 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000265 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000266
Per28a44562016-05-04 17:12:51 +0200267 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000268 EXPECT_CALL(callback_,
269 TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000270 .Times(1)
271 .WillRepeatedly(Return(true));
jbauchd2a22962016-02-08 23:18:25 -0800272 }
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000273 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800274 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000275 }
276 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000277 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000278 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800279 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200280
281 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
282 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
283 clock_.TimeInMilliseconds(), 250, false);
284 }
Peter Boströme23e7372015-10-08 11:44:14 +0200285 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
286 sequence_number++, clock_.TimeInMilliseconds(),
287 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000288 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200289 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000290}
291
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000292TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
293 uint32_t ssrc = 12345;
294 uint16_t sequence_number = 1234;
295
296 SendAndExpectPacket(PacedSender::kNormalPriority,
297 ssrc,
298 sequence_number,
299 clock_.TimeInMilliseconds(),
300 250,
301 false);
302
303 // Expect packet on second ssrc to be queued and sent as well.
304 SendAndExpectPacket(PacedSender::kNormalPriority,
305 ssrc + 1,
306 sequence_number,
307 clock_.TimeInMilliseconds(),
308 250,
309 false);
310
311 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000312 send_bucket_->Process();
313}
314
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000315TEST_F(PacedSenderTest, Padding) {
316 uint32_t ssrc = 12345;
317 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000318
Per28a44562016-05-04 17:12:51 +0200319 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
320 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
321
322 // Due to the multiplicative factor we can send 5 packets during a send
323 // interval. (network capacity * multiplier / (8 bits per byte *
324 // (packet size * #send intervals per second)
325 const size_t packets_to_send_per_interval =
326 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
327 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
328 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
329 clock_.TimeInMilliseconds(), 250, false);
330 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000331 // No padding is expected since we have sent too much already.
332 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000333 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000334 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000335 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800336 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200337 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
338
339 // 5 milliseconds later should not send padding since we filled the buffers
340 // initially.
341 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(0);
342 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
343 clock_.AdvanceTimeMilliseconds(5);
344 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
345 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000346
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000347 // 5 milliseconds later we have enough budget to send some padding.
348 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
349 WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000350 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000351 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000352 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800353 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000354}
355
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000356TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
357 uint32_t ssrc = 12345;
358 uint16_t sequence_number = 1234;
359 int64_t capture_time_ms = 56789;
360 const int kTimeStep = 5;
361 const int64_t kBitrateWindow = 100;
Per28a44562016-05-04 17:12:51 +0200362 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
363 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
364
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000365 int64_t start_time = clock_.TimeInMilliseconds();
366 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000367 SendAndExpectPacket(PacedSender::kNormalPriority,
368 ssrc,
369 sequence_number++,
370 capture_time_ms,
371 250,
372 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000373 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000374 EXPECT_CALL(callback_, TimeToSendPadding(250)).Times(1).
375 WillOnce(Return(250));
376 send_bucket_->Process();
377 }
378}
379
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000380TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
381 uint32_t ssrc = 12345;
382 uint16_t sequence_number = 1234;
383 int64_t capture_time_ms = 56789;
384 const int kTimeStep = 5;
385 const int64_t kBitrateWindow = 10000;
386 PacedSenderPadding callback;
Per28a44562016-05-04 17:12:51 +0200387 send_bucket_.reset(new PacedSender(&clock_, &callback, kTargetBitrateBps));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000388 send_bucket_->SetProbingEnabled(false);
Per28a44562016-05-04 17:12:51 +0200389 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
390 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
391
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000392 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000393 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000394 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800395 int rand_value = rand(); // NOLINT (rand_r instead of rand)
396 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200397 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
398 sequence_number++, capture_time_ms,
399 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000400 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000401 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000402 send_bucket_->Process();
403 }
Per28a44562016-05-04 17:12:51 +0200404 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000405 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
Per28a44562016-05-04 17:12:51 +0200406 kBitrateWindow),
407 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000408}
409
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000410TEST_F(PacedSenderTest, Priority) {
411 uint32_t ssrc_low_priority = 12345;
412 uint32_t ssrc = 12346;
413 uint16_t sequence_number = 1234;
414 int64_t capture_time_ms = 56789;
415 int64_t capture_time_ms_low_priority = 1234567;
416
Per28a44562016-05-04 17:12:51 +0200417 // Due to the multiplicative factor we can send 5 packets during a send
418 // interval. (network capacity * multiplier / (8 bits per byte *
419 // (packet size * #send intervals per second)
420 const size_t packets_to_send_per_interval =
421 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
422 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
423 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
424 clock_.TimeInMilliseconds(), 250, false);
425 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000426 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200427 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000428
429 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200430 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
431 sequence_number++, capture_time_ms_low_priority,
432 250, false);
Per28a44562016-05-04 17:12:51 +0200433
434 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
435 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
436 sequence_number++, capture_time_ms, 250, false);
437 }
Peter Boströme23e7372015-10-08 11:44:14 +0200438 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
439 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000440
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000441 // Expect all high and normal priority to be sent out first.
442 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000443 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
Per28a44562016-05-04 17:12:51 +0200444 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000445 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000446
447 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000448 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000449 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800450 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200451 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000452
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000453 EXPECT_CALL(callback_,
454 TimeToSendPacket(
455 ssrc_low_priority, _, capture_time_ms_low_priority, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000456 .Times(1)
457 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000458
459 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000460 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000461 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800462 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000463}
464
Stefan Holmerc482eb32015-12-16 16:55:03 +0100465TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
466 uint32_t ssrc = 12346;
467 uint16_t sequence_number = 1234;
468 int64_t capture_time_ms = 56789;
469
470 // As high prio packets doesn't affect the budget, we should be able to send
471 // a high number of them at once.
472 for (int i = 0; i < 25; ++i) {
473 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
474 capture_time_ms, 250, false);
475 }
476 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200477 // Low prio packets does affect the budget.
478 // Due to the multiplicative factor we can send 5 packets during a send
479 // interval. (network capacity * multiplier / (8 bits per byte *
480 // (packet size * #send intervals per second)
481 const size_t packets_to_send_per_interval =
482 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
483 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100484 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
Per28a44562016-05-04 17:12:51 +0200485 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100486 }
487 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
488 capture_time_ms, 250, false);
489 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
490 clock_.AdvanceTimeMilliseconds(5);
491 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200492 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100493 EXPECT_CALL(callback_,
494 TimeToSendPacket(ssrc, sequence_number++, capture_time_ms, false))
Per28a44562016-05-04 17:12:51 +0200495 .Times(1)
496 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100497 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
498 clock_.AdvanceTimeMilliseconds(5);
499 send_bucket_->Process();
Per28a44562016-05-04 17:12:51 +0200500 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100501}
502
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000503TEST_F(PacedSenderTest, Pause) {
504 uint32_t ssrc_low_priority = 12345;
505 uint32_t ssrc = 12346;
506 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000507 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000508
509 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000510
Per28a44562016-05-04 17:12:51 +0200511 // Due to the multiplicative factor we can send 5 packets during a send
512 // interval. (network capacity * multiplier / (8 bits per byte *
513 // (packet size * #send intervals per second)
514 const size_t packets_to_send_per_interval =
515 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
516 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
517 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
518 clock_.TimeInMilliseconds(), 250, false);
519 }
520
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000521 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000522
523 send_bucket_->Pause();
524
Peter Boströme23e7372015-10-08 11:44:14 +0200525 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
526 sequence_number++, capture_time_ms, 250, false);
527 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
528 sequence_number++, capture_time_ms, 250, false);
529 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
530 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000531
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000532 clock_.AdvanceTimeMilliseconds(10000);
533 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000534
535 // Expect everything to be queued.
Peter Boströme23e7372015-10-08 11:44:14 +0200536 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
537 sequence_number++, second_capture_time_ms, 250,
538 false);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000539
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000540 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000541 send_bucket_->QueueInMs());
542
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000543 // Expect no packet to come out while paused.
544 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000545 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000546
547 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000548 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000549 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800550 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000551 }
552 // Expect high prio packets to come out first followed by all packets in the
553 // way they were added.
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000554 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000555 .Times(3)
556 .WillRepeatedly(Return(true));
sprang0a43fef2015-11-20 09:00:37 -0800557 EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
558 .Times(1)
559 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000560 send_bucket_->Resume();
561
562 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000563 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000564 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800565 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000566
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000567 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000568}
569
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000570TEST_F(PacedSenderTest, ResendPacket) {
571 uint32_t ssrc = 12346;
572 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000573 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000574 EXPECT_EQ(0, send_bucket_->QueueInMs());
575
Peter Boströme23e7372015-10-08 11:44:14 +0200576 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
577 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000578 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200579 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
580 sequence_number + 1, capture_time_ms + 1, 250,
581 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000582 clock_.AdvanceTimeMilliseconds(9999);
583 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000584 send_bucket_->QueueInMs());
585 // Fails to send first packet so only one call.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000586 EXPECT_CALL(callback_,
587 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000588 .Times(1)
589 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000590 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000591 send_bucket_->Process();
592
593 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000594 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000595 send_bucket_->QueueInMs());
596
597 // Fails to send second packet.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000598 EXPECT_CALL(callback_,
599 TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000600 .Times(1)
601 .WillOnce(Return(true));
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000602 EXPECT_CALL(
603 callback_,
604 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000605 .Times(1)
606 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000607 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000608 send_bucket_->Process();
609
610 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000611 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000612 send_bucket_->QueueInMs());
613
614 // Send second packet and queue becomes empty.
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000615 EXPECT_CALL(
616 callback_,
617 TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000618 .Times(1)
619 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000620 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000621 send_bucket_->Process();
622 EXPECT_EQ(0, send_bucket_->QueueInMs());
623}
624
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000625TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000626 uint32_t ssrc = 12346;
627 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000628 const size_t kNumPackets = 60;
629 const size_t kPacketSize = 1200;
Per28a44562016-05-04 17:12:51 +0200630 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000631 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000632
Per28a44562016-05-04 17:12:51 +0200633 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000634 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000635 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
636 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000637 }
638
Per28a44562016-05-04 17:12:51 +0200639 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000640 int64_t queue_in_ms =
Per28a44562016-05-04 17:12:51 +0200641 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000642 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000643
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000644 int64_t time_start = clock_.TimeInMilliseconds();
645 while (send_bucket_->QueueSizePackets() > 0) {
646 int time_until_process = send_bucket_->TimeUntilNextProcess();
647 if (time_until_process <= 0) {
648 send_bucket_->Process();
649 } else {
650 clock_.AdvanceTimeMilliseconds(time_until_process);
651 }
652 }
653 int64_t duration = clock_.TimeInMilliseconds() - time_start;
654
655 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
656
sprang0a43fef2015-11-20 09:00:37 -0800657 // Allow for aliasing, duration should be within one pack of max time limit.
658 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
Per28a44562016-05-04 17:12:51 +0200659 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000660}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000661
662TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
663 uint32_t ssrc = 12346;
664 uint16_t sequence_number = 1234;
665 EXPECT_EQ(0, send_bucket_->QueueInMs());
666
Per28a44562016-05-04 17:12:51 +0200667 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000668 SendAndExpectPacket(PacedSender::kNormalPriority,
669 ssrc,
670 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000671 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000672 1200,
673 false);
674
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000675 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000676 EXPECT_EQ(500, send_bucket_->QueueInMs());
677 send_bucket_->Process();
678 EXPECT_EQ(0, send_bucket_->QueueInMs());
679}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000680
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000681TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000682 const int kNumPackets = 11;
683 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000684 const size_t kPacketSize = 1200;
Per28a44562016-05-04 17:12:51 +0200685 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000686 uint32_t ssrc = 12346;
687 uint16_t sequence_number = 1234;
Per28a44562016-05-04 17:12:51 +0200688
stefan0665f052016-02-24 03:04:17 -0800689 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000690 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800691 expected_deltas + kNumDeltas);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000692 PacedSenderProbing callback(expected_deltas_list, &clock_);
Per28a44562016-05-04 17:12:51 +0200693 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateBps));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000694
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000695 for (int i = 0; i < kNumPackets; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200696 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
697 sequence_number++, clock_.TimeInMilliseconds(),
698 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000699 }
Per28a44562016-05-04 17:12:51 +0200700
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000701 while (callback.packets_sent() < kNumPackets) {
702 int time_until_process = send_bucket_->TimeUntilNextProcess();
703 if (time_until_process <= 0) {
704 send_bucket_->Process();
705 } else {
706 clock_.AdvanceTimeMilliseconds(time_until_process);
707 }
708 }
709}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000710
Stefan Holmer01b48882015-05-05 10:21:24 +0200711TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
712 const int kNumPackets = 11;
713 const int kNumDeltas = kNumPackets - 1;
714 const size_t kPacketSize = 1200;
Per28a44562016-05-04 17:12:51 +0200715 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200716 uint32_t ssrc = 12346;
717 uint16_t sequence_number = 1234;
718 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
719 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800720 expected_deltas + kNumDeltas);
Stefan Holmer01b48882015-05-05 10:21:24 +0200721 PacedSenderProbing callback(expected_deltas_list, &clock_);
Per28a44562016-05-04 17:12:51 +0200722 send_bucket_.reset(new PacedSender(&clock_, &callback, kInitialBitrateBps));
Stefan Holmer01b48882015-05-05 10:21:24 +0200723
724 for (int i = 0; i < kNumPackets - 5; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200725 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
726 sequence_number++, clock_.TimeInMilliseconds(),
727 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200728 }
729 while (callback.packets_sent() < kNumPackets) {
730 int time_until_process = send_bucket_->TimeUntilNextProcess();
731 if (time_until_process <= 0) {
732 send_bucket_->Process();
733 } else {
734 clock_.AdvanceTimeMilliseconds(time_until_process);
735 }
736 }
737
738 // Process one more time and make sure we don't send any more probes.
739 int time_until_process = send_bucket_->TimeUntilNextProcess();
740 clock_.AdvanceTimeMilliseconds(time_until_process);
741 send_bucket_->Process();
742 EXPECT_EQ(kNumPackets, callback.packets_sent());
743}
744
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000745TEST_F(PacedSenderTest, PriorityInversion) {
746 uint32_t ssrc = 12346;
747 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000748 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000749
Peter Boströme23e7372015-10-08 11:44:14 +0200750 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000751 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200752 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000753
Peter Boströme23e7372015-10-08 11:44:14 +0200754 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000755 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200756 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000757
Peter Boströme23e7372015-10-08 11:44:14 +0200758 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
759 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000760
Peter Boströme23e7372015-10-08 11:44:14 +0200761 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
762 sequence_number + 1, clock_.TimeInMilliseconds(),
763 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000764
765 // Packets from earlier frames should be sent first.
766 {
767 ::testing::InSequence sequence;
768 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
769 clock_.TimeInMilliseconds(), true))
770 .WillOnce(Return(true));
771 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
772 clock_.TimeInMilliseconds(), true))
773 .WillOnce(Return(true));
774 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
775 clock_.TimeInMilliseconds() + 33,
776 true)).WillOnce(Return(true));
777 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
778 clock_.TimeInMilliseconds() + 33,
779 true)).WillOnce(Return(true));
780
781 while (send_bucket_->QueueSizePackets() > 0) {
782 int time_until_process = send_bucket_->TimeUntilNextProcess();
783 if (time_until_process <= 0) {
784 send_bucket_->Process();
785 } else {
786 clock_.AdvanceTimeMilliseconds(time_until_process);
787 }
788 }
789 }
790}
791
792TEST_F(PacedSenderTest, PaddingOveruse) {
793 uint32_t ssrc = 12346;
794 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000795 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000796
Per28a44562016-05-04 17:12:51 +0200797 send_bucket_->SetEstimatedBitrate(60000);
798 send_bucket_->SetAllocatedSendBitrate(60000, 0);
799
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000800 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
801 clock_.TimeInMilliseconds(), kPacketSize, false);
802 send_bucket_->Process();
803
804 // Add 30kbit padding. When increasing budget, media budget will increase from
Per28a44562016-05-04 17:12:51 +0200805 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000806 clock_.AdvanceTimeMilliseconds(5);
Per28a44562016-05-04 17:12:51 +0200807 send_bucket_->SetAllocatedSendBitrate(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000808
Per28a44562016-05-04 17:12:51 +0200809 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
810 clock_.TimeInMilliseconds(), kPacketSize, false);
811 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000812 // Don't send padding if queue is non-empty, even if padding budget > 0.
813 EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
814 send_bucket_->Process();
815}
816
Erik Språngad113e52015-11-26 16:26:12 +0100817TEST_F(PacedSenderTest, AverageQueueTime) {
818 uint32_t ssrc = 12346;
819 uint16_t sequence_number = 1234;
820 const size_t kPacketSize = 1200;
821 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100822
Per28a44562016-05-04 17:12:51 +0200823 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100824
825 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
826
827 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100828 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
829 sequence_number, first_capture_time, kPacketSize,
830 false);
Erik Språngad113e52015-11-26 16:26:12 +0100831 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100832 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100833 sequence_number + 1, clock_.TimeInMilliseconds(),
834 kPacketSize, false);
835 clock_.AdvanceTimeMilliseconds(10);
836
837 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
838
839 // Only first packet (queued for 20ms) should be removed, leave the second
840 // packet (queued for 10ms) alone in the queue.
841 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
842 first_capture_time, false))
843 .Times(1)
844 .WillRepeatedly(Return(true));
845 send_bucket_->Process();
846
847 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
848
849 clock_.AdvanceTimeMilliseconds(10);
850 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
851 first_capture_time + 10, false))
852 .Times(1)
853 .WillRepeatedly(Return(true));
854 for (int i = 0; i < 3; ++i) {
855 clock_.AdvanceTimeMilliseconds(30); // Max delta.
856 send_bucket_->Process();
857 }
858
859 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
860}
861
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000862} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000863} // namespace webrtc