blob: 0b2ac1c9877d1bade60ad64d0cdf43ff22697513 [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
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010014#include "webrtc/modules/pacing/paced_sender.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010015#include "webrtc/system_wrappers/include/clock.h"
kwibergac9f8762016-09-30 22:29:43 -070016#include "webrtc/test/gmock.h"
17#include "webrtc/test/gtest.h"
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000018
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000019using testing::_;
philipelc7bf32a2017-02-17 03:59:43 -080020using testing::Field;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000021using testing::Return;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000022
isheriffcc5903e2016-10-04 08:29:38 -070023namespace {
24constexpr unsigned kFirstClusterBps = 900000;
isheriffcc5903e2016-10-04 08:29:38 -070025constexpr unsigned kSecondClusterBps = 1800000;
isheriffcc5903e2016-10-04 08:29:38 -070026
27// The error stems from truncating the time interval of probe packets to integer
28// values. This results in probing slightly higher than the target bitrate.
29// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
30constexpr int kBitrateProbingError = 150000;
31} // namespace
32
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000033namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000034namespace test {
35
perkjec81bcd2016-05-11 06:01:13 -070036static const int kTargetBitrateBps = 800000;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000037
perkjec81bcd2016-05-11 06:01:13 -070038class MockPacedSenderCallback : public PacedSender::PacketSender {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000039 public:
philipel29dca2c2016-05-13 11:13:05 +020040 MOCK_METHOD5(TimeToSendPacket,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000041 bool(uint32_t ssrc,
42 uint16_t sequence_number,
43 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020044 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080045 const PacedPacketInfo& pacing_info));
46 MOCK_METHOD2(TimeToSendPadding,
47 size_t(size_t bytes, const PacedPacketInfo& pacing_info));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000048};
49
perkjec81bcd2016-05-11 06:01:13 -070050class PacedSenderPadding : public PacedSender::PacketSender {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000051 public:
52 PacedSenderPadding() : padding_sent_(0) {}
53
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000054 bool TimeToSendPacket(uint32_t ssrc,
55 uint16_t sequence_number,
56 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020057 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080058 const PacedPacketInfo& pacing_info) override {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000059 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000060 }
61
philipelc7bf32a2017-02-17 03:59:43 -080062 size_t TimeToSendPadding(size_t bytes,
63 const PacedPacketInfo& pacing_info) override {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000064 const size_t kPaddingPacketSize = 224;
65 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000066 padding_sent_ += kPaddingPacketSize * num_packets;
67 return kPaddingPacketSize * num_packets;
68 }
69
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000070 size_t padding_sent() { return padding_sent_; }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000071
72 private:
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000073 size_t padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000074};
75
perkjec81bcd2016-05-11 06:01:13 -070076class PacedSenderProbing : public PacedSender::PacketSender {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000077 public:
isheriffcc5903e2016-10-04 08:29:38 -070078 PacedSenderProbing() : packets_sent_(0), padding_sent_(0) {}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000079
80 bool TimeToSendPacket(uint32_t ssrc,
81 uint16_t sequence_number,
82 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020083 bool retransmission,
philipelc7bf32a2017-02-17 03:59:43 -080084 const PacedPacketInfo& pacing_info) override {
isheriffcc5903e2016-10-04 08:29:38 -070085 packets_sent_++;
Stefan Holmer01b48882015-05-05 10:21:24 +020086 return true;
87 }
88
philipelc7bf32a2017-02-17 03:59:43 -080089 size_t TimeToSendPadding(size_t bytes,
90 const PacedPacketInfo& pacing_info) override {
isheriffcc5903e2016-10-04 08:29:38 -070091 padding_sent_ += bytes;
92 return padding_sent_;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000093 }
94
95 int packets_sent() const { return packets_sent_; }
96
isheriffcc5903e2016-10-04 08:29:38 -070097 int padding_sent() const { return padding_sent_; }
98
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000099 private:
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000100 int packets_sent_;
isheriffcc5903e2016-10-04 08:29:38 -0700101 int padding_sent_;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000102};
103
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000104class PacedSenderTest : public ::testing::Test {
105 protected:
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000106 PacedSenderTest() : clock_(123456) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000107 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000108 // Need to initialize PacedSender after we initialize clock.
philipelc3b3f7a2017-03-29 01:23:13 -0700109 send_bucket_.reset(new PacedSender(&clock_, &callback_, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800110 send_bucket_->CreateProbeCluster(kFirstClusterBps);
111 send_bucket_->CreateProbeCluster(kSecondClusterBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000112 // Default to bitrate probing disabled for testing purposes. Probing tests
113 // have to enable probing, either by creating a new PacedSender instance or
114 // by calling SetProbingEnabled(true).
115 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700116 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
117
118 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000119 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000120
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000121 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000122 uint32_t ssrc,
123 uint16_t sequence_number,
124 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000125 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000126 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200127 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
128 size, retransmission);
philipel29dca2c2016-05-13 11:13:05 +0200129 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
tereliusf39f7d92016-07-20 03:36:19 -0700130 capture_time_ms, retransmission, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000131 .Times(1)
132 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000133 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000134 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000135 MockPacedSenderCallback callback_;
kwiberg22feaa32016-03-17 09:17:43 -0700136 std::unique_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000137};
138
asaperssonfc5e81c2017-04-19 23:28:53 -0700139TEST_F(PacedSenderTest, FirstSentPacketTimeIsSet) {
140 uint16_t sequence_number = 1234;
141 const uint32_t kSsrc = 12345;
142 const size_t kSizeBytes = 250;
143 const size_t kPacketToSend = 3;
144 const int64_t kStartMs = clock_.TimeInMilliseconds();
145
146 // No packet sent.
147 EXPECT_EQ(-1, send_bucket_->FirstSentPacketTimeMs());
148
149 for (size_t i = 0; i < kPacketToSend; ++i) {
150 SendAndExpectPacket(PacedSender::kNormalPriority, kSsrc, sequence_number++,
151 clock_.TimeInMilliseconds(), kSizeBytes, false);
152 send_bucket_->Process();
153 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
154 }
155 EXPECT_EQ(kStartMs, send_bucket_->FirstSentPacketTimeMs());
156}
157
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000158TEST_F(PacedSenderTest, QueuePacket) {
159 uint32_t ssrc = 12345;
160 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700161 // Due to the multiplicative factor we can send 5 packets during a send
162 // interval. (network capacity * multiplier / (8 bits per byte *
163 // (packet size * #send intervals per second)
164 const size_t packets_to_send =
165 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
166 for (size_t i = 0; i < packets_to_send; ++i) {
167 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
168 clock_.TimeInMilliseconds(), 250, false);
169 }
170
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000171 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200172 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
173 sequence_number, queued_packet_timestamp, 250,
174 false);
perkjec81bcd2016-05-11 06:01:13 -0700175 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000176 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000177 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
philipela1ed0b32016-06-01 06:31:17 -0700178 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000179 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000180 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000181 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000182 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700183 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200184 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
185 queued_packet_timestamp, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000186 .Times(1)
187 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000188 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000189 sequence_number++;
perkjec81bcd2016-05-11 06:01:13 -0700190 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
191
192 // We can send packets_to_send -1 packets of size 250 during the current
193 // interval since one packet has already been sent.
194 for (size_t i = 0; i < packets_to_send - 1; ++i) {
195 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
196 clock_.TimeInMilliseconds(), 250, false);
197 }
Peter Boströme23e7372015-10-08 11:44:14 +0200198 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
199 sequence_number++, clock_.TimeInMilliseconds(),
200 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700201 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000202 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700203 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000204}
205
206TEST_F(PacedSenderTest, PaceQueuedPackets) {
207 uint32_t ssrc = 12345;
208 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000209
perkjec81bcd2016-05-11 06:01:13 -0700210 // Due to the multiplicative factor we can send 5 packets during a send
211 // interval. (network capacity * multiplier / (8 bits per byte *
212 // (packet size * #send intervals per second)
213 const size_t packets_to_send_per_interval =
214 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
215 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
216 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
217 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000218 }
perkjec81bcd2016-05-11 06:01:13 -0700219
220 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200221 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
222 sequence_number++, clock_.TimeInMilliseconds(),
223 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000224 }
perkjec81bcd2016-05-11 06:01:13 -0700225 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
226 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000227 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700228 EXPECT_EQ(packets_to_send_per_interval * 10,
229 send_bucket_->QueueSizePackets());
philipela1ed0b32016-06-01 06:31:17 -0700230 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000231 for (int k = 0; k < 10; ++k) {
232 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000233 clock_.AdvanceTimeMilliseconds(5);
philipel29dca2c2016-05-13 11:13:05 +0200234 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700235 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000236 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000237 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800238 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000239 }
perkjec81bcd2016-05-11 06:01:13 -0700240 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000241 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000242 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000243 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700244 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800245 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700246
247 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
248 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
249 clock_.TimeInMilliseconds(), 250, false);
250 }
Peter Boströme23e7372015-10-08 11:44:14 +0200251 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
252 sequence_number, clock_.TimeInMilliseconds(), 250,
253 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000254 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700255 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000256}
257
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000258TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
259 uint32_t ssrc = 12345;
260 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000261 uint16_t queued_sequence_number;
262
perkjec81bcd2016-05-11 06:01:13 -0700263 // Due to the multiplicative factor we can send 5 packets during a send
264 // interval. (network capacity * multiplier / (8 bits per byte *
265 // (packet size * #send intervals per second)
266 const size_t packets_to_send_per_interval =
267 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
268 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
269 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
270 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000271 }
272 queued_sequence_number = sequence_number;
273
perkjec81bcd2016-05-11 06:01:13 -0700274 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000275 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200276 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
277 sequence_number, clock_.TimeInMilliseconds(),
278 250, false);
279 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
280 sequence_number++, clock_.TimeInMilliseconds(),
281 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000282 }
philipela1ed0b32016-06-01 06:31:17 -0700283 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000284 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000285 for (int k = 0; k < 10; ++k) {
286 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000287 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000288
perkjec81bcd2016-05-11 06:01:13 -0700289 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000290 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200291 TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000292 .Times(1)
293 .WillRepeatedly(Return(true));
jbauchd2a22962016-02-08 23:18:25 -0800294 }
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000295 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800296 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000297 }
298 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000299 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000300 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800301 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700302
303 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
304 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
305 clock_.TimeInMilliseconds(), 250, false);
306 }
Peter Boströme23e7372015-10-08 11:44:14 +0200307 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
308 sequence_number++, clock_.TimeInMilliseconds(),
309 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000310 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700311 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000312}
313
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000314TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
315 uint32_t ssrc = 12345;
316 uint16_t sequence_number = 1234;
317
318 SendAndExpectPacket(PacedSender::kNormalPriority,
319 ssrc,
320 sequence_number,
321 clock_.TimeInMilliseconds(),
322 250,
323 false);
324
325 // Expect packet on second ssrc to be queued and sent as well.
326 SendAndExpectPacket(PacedSender::kNormalPriority,
327 ssrc + 1,
328 sequence_number,
329 clock_.TimeInMilliseconds(),
330 250,
331 false);
332
333 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000334 send_bucket_->Process();
335}
336
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000337TEST_F(PacedSenderTest, Padding) {
338 uint32_t ssrc = 12345;
339 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000340
perkjec81bcd2016-05-11 06:01:13 -0700341 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700342 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700343
344 // Due to the multiplicative factor we can send 5 packets during a send
345 // interval. (network capacity * multiplier / (8 bits per byte *
346 // (packet size * #send intervals per second)
347 const size_t packets_to_send_per_interval =
348 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
349 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
350 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
351 clock_.TimeInMilliseconds(), 250, false);
352 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000353 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700354 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700355 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
356 send_bucket_->Process();
357 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
358
359 // 5 milliseconds later should not send padding since we filled the buffers
360 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700361 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000362 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000363 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000364 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800365 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000366
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000367 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700368 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
369 .Times(1)
370 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000371 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000372 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000373 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800374 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000375}
376
perkj71ee44c2016-06-15 00:47:53 -0700377TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
378 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
379 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
380
381 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
382 send_bucket_->Process();
383 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
384
385 send_bucket_->Process();
386 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
387
388 uint32_t ssrc = 12345;
389 uint16_t sequence_number = 1234;
390 int64_t capture_time_ms = 56789;
391
392 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
393 capture_time_ms, 250, false);
394 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
395 .Times(1)
396 .WillOnce(Return(250));
397 send_bucket_->Process();
398}
399
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000400TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
401 uint32_t ssrc = 12345;
402 uint16_t sequence_number = 1234;
403 int64_t capture_time_ms = 56789;
404 const int kTimeStep = 5;
405 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700406 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700407 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700408
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000409 int64_t start_time = clock_.TimeInMilliseconds();
410 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000411 SendAndExpectPacket(PacedSender::kNormalPriority,
412 ssrc,
413 sequence_number++,
414 capture_time_ms,
415 250,
416 false);
philipela1ed0b32016-06-01 06:31:17 -0700417 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
418 .Times(1)
419 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000420 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700421 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000422 }
423}
424
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000425TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
426 uint32_t ssrc = 12345;
427 uint16_t sequence_number = 1234;
428 int64_t capture_time_ms = 56789;
429 const int kTimeStep = 5;
430 const int64_t kBitrateWindow = 10000;
431 PacedSenderPadding callback;
philipelc3b3f7a2017-03-29 01:23:13 -0700432 send_bucket_.reset(new PacedSender(&clock_, &callback, nullptr));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000433 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700434 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700435
436 send_bucket_->SetSendBitrateLimits(
437 0 /*allocated_bitrate_bps*/,
438 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700439
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000440 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000441 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000442 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800443 int rand_value = rand(); // NOLINT (rand_r instead of rand)
444 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200445 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
446 sequence_number++, capture_time_ms,
447 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000448 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000449 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000450 send_bucket_->Process();
451 }
perkjec81bcd2016-05-11 06:01:13 -0700452 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000453 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700454 kBitrateWindow),
455 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000456}
457
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000458TEST_F(PacedSenderTest, Priority) {
459 uint32_t ssrc_low_priority = 12345;
460 uint32_t ssrc = 12346;
461 uint16_t sequence_number = 1234;
462 int64_t capture_time_ms = 56789;
463 int64_t capture_time_ms_low_priority = 1234567;
464
perkjec81bcd2016-05-11 06:01:13 -0700465 // Due to the multiplicative factor we can send 5 packets during a send
466 // interval. (network capacity * multiplier / (8 bits per byte *
467 // (packet size * #send intervals per second)
468 const size_t packets_to_send_per_interval =
469 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
470 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
471 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
472 clock_.TimeInMilliseconds(), 250, false);
473 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000474 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700475 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000476
477 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200478 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
479 sequence_number++, capture_time_ms_low_priority,
480 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700481
482 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
483 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
484 sequence_number++, capture_time_ms, 250, false);
485 }
Peter Boströme23e7372015-10-08 11:44:14 +0200486 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
487 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000488
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000489 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700490 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200491 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700492 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000493 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000494
495 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000496 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000497 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800498 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700499 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000500
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000501 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200502 TimeToSendPacket(ssrc_low_priority, _,
503 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000504 .Times(1)
505 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000506
507 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000508 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000509 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800510 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000511}
512
tereliusf39f7d92016-07-20 03:36:19 -0700513TEST_F(PacedSenderTest, RetransmissionPriority) {
514 uint32_t ssrc = 12345;
515 uint16_t sequence_number = 1234;
516 int64_t capture_time_ms = 45678;
517 int64_t capture_time_ms_retransmission = 56789;
518
519 // Due to the multiplicative factor we can send 5 packets during a send
520 // interval. (network capacity * multiplier / (8 bits per byte *
521 // (packet size * #send intervals per second)
522 const size_t packets_to_send_per_interval =
523 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
524 send_bucket_->Process();
525 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
526
527 // Alternate retransmissions and normal packets.
528 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
529 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
530 sequence_number++,
531 capture_time_ms_retransmission, 250, true);
532 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
533 sequence_number++, capture_time_ms, 250, false);
534 }
535 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
536
537 // Expect all retransmissions to be sent out first despite having a later
538 // capture time.
539 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
540 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
541 EXPECT_CALL(callback_, TimeToSendPacket(
542 ssrc, _, capture_time_ms_retransmission, true, _))
543 .Times(packets_to_send_per_interval)
544 .WillRepeatedly(Return(true));
545
546 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
547 clock_.AdvanceTimeMilliseconds(5);
548 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
549 send_bucket_->Process();
550 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
551
552 // Expect the remaining (non-retransmission) packets to be sent.
553 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
554 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
555 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
556 .Times(packets_to_send_per_interval)
557 .WillRepeatedly(Return(true));
558
559 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
560 clock_.AdvanceTimeMilliseconds(5);
561 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
562 send_bucket_->Process();
563
564 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
565}
566
Stefan Holmerc482eb32015-12-16 16:55:03 +0100567TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
568 uint32_t ssrc = 12346;
569 uint16_t sequence_number = 1234;
570 int64_t capture_time_ms = 56789;
571
572 // As high prio packets doesn't affect the budget, we should be able to send
573 // a high number of them at once.
574 for (int i = 0; i < 25; ++i) {
575 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
576 capture_time_ms, 250, false);
577 }
578 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700579 // Low prio packets does affect the budget.
580 // Due to the multiplicative factor we can send 5 packets during a send
581 // interval. (network capacity * multiplier / (8 bits per byte *
582 // (packet size * #send intervals per second)
583 const size_t packets_to_send_per_interval =
584 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
585 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100586 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700587 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100588 }
589 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
590 capture_time_ms, 250, false);
591 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
592 clock_.AdvanceTimeMilliseconds(5);
593 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700594 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200595 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
596 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700597 .Times(1)
598 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100599 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
600 clock_.AdvanceTimeMilliseconds(5);
601 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700602 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100603}
604
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000605TEST_F(PacedSenderTest, Pause) {
606 uint32_t ssrc_low_priority = 12345;
607 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700608 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000609 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000610 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000611
612 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000613
perkjec81bcd2016-05-11 06:01:13 -0700614 // Due to the multiplicative factor we can send 5 packets during a send
615 // interval. (network capacity * multiplier / (8 bits per byte *
616 // (packet size * #send intervals per second)
617 const size_t packets_to_send_per_interval =
618 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
619 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
620 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
621 clock_.TimeInMilliseconds(), 250, false);
622 }
623
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000624 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000625
626 send_bucket_->Pause();
627
terelius8b70faf2016-08-01 09:47:31 -0700628 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
629 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
630 sequence_number++, capture_time_ms, 250, false);
631 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
632 sequence_number++, capture_time_ms, 250, false);
633 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
634 sequence_number++, capture_time_ms, 250, false);
635 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000636 clock_.AdvanceTimeMilliseconds(10000);
637 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700638 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
639 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
640 sequence_number++, second_capture_time_ms, 250,
641 false);
642 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
643 sequence_number++, second_capture_time_ms, 250,
644 false);
645 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
646 sequence_number++, second_capture_time_ms, 250,
647 false);
648 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000649
650 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700651 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000652 send_bucket_->QueueInMs());
653
stefan64136af2017-08-14 08:03:17 -0700654 for (int i = 0; i < 10; ++i) {
655 clock_.AdvanceTimeMilliseconds(5);
tommi919dce22017-03-15 07:45:36 -0700656 // TimeUntilNextProcess must not return 0 when paused. If it does,
657 // we risk running a busy loop, so ideally it should return a large value.
stefan64136af2017-08-14 08:03:17 -0700658 EXPECT_GE(send_bucket_->TimeUntilNextProcess(), 1000);
659 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000660 }
terelius8b70faf2016-08-01 09:47:31 -0700661
stefan099110c2017-02-01 03:57:42 -0800662 // Expect high prio packets to come out first followed by normal
663 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700664 {
665 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800666 EXPECT_CALL(callback_,
667 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
668 .Times(packets_to_send_per_interval)
669 .WillRepeatedly(Return(true));
670 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
671 second_capture_time_ms, _, _))
672 .Times(packets_to_send_per_interval)
673 .WillRepeatedly(Return(true));
674
terelius8b70faf2016-08-01 09:47:31 -0700675 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
676 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
677 .Times(1)
678 .WillRepeatedly(Return(true));
679 }
680 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
681 EXPECT_CALL(callback_,
682 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
683 .Times(1)
684 .WillRepeatedly(Return(true));
685 }
686 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
687 EXPECT_CALL(callback_,
688 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
689 .Times(1)
690 .WillRepeatedly(Return(true));
691 }
692 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
693 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
694 second_capture_time_ms, _, _))
695 .Times(1)
696 .WillRepeatedly(Return(true));
697 }
698 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000699 send_bucket_->Resume();
700
terelius8b70faf2016-08-01 09:47:31 -0700701 for (size_t i = 0; i < 4; i++) {
stefan8497fdd2017-08-09 07:17:33 -0700702 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
703 clock_.AdvanceTimeMilliseconds(5);
stefan64136af2017-08-14 08:03:17 -0700704 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
705 send_bucket_->Process();
terelius8b70faf2016-08-01 09:47:31 -0700706 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000707
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000708 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000709}
710
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000711TEST_F(PacedSenderTest, ResendPacket) {
712 uint32_t ssrc = 12346;
713 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000714 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000715 EXPECT_EQ(0, send_bucket_->QueueInMs());
716
Peter Boströme23e7372015-10-08 11:44:14 +0200717 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
718 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000719 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200720 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
721 sequence_number + 1, capture_time_ms + 1, 250,
722 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000723 clock_.AdvanceTimeMilliseconds(9999);
724 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000725 send_bucket_->QueueInMs());
726 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200727 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
728 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000729 .Times(1)
730 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000731 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000732 send_bucket_->Process();
733
734 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000735 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000736 send_bucket_->QueueInMs());
737
738 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200739 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
740 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000741 .Times(1)
742 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200743 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
744 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000745 .Times(1)
746 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000747 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000748 send_bucket_->Process();
749
750 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000751 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000752 send_bucket_->QueueInMs());
753
754 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200755 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
756 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000757 .Times(1)
758 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000759 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000760 send_bucket_->Process();
761 EXPECT_EQ(0, send_bucket_->QueueInMs());
762}
763
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000764TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000765 uint32_t ssrc = 12346;
766 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000767 const size_t kNumPackets = 60;
768 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700769 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000770 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000771
perkjec81bcd2016-05-11 06:01:13 -0700772 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000773 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000774 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
775 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000776 }
777
perkjec81bcd2016-05-11 06:01:13 -0700778 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000779 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700780 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000781 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000782
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000783 int64_t time_start = clock_.TimeInMilliseconds();
784 while (send_bucket_->QueueSizePackets() > 0) {
785 int time_until_process = send_bucket_->TimeUntilNextProcess();
786 if (time_until_process <= 0) {
787 send_bucket_->Process();
788 } else {
789 clock_.AdvanceTimeMilliseconds(time_until_process);
790 }
791 }
792 int64_t duration = clock_.TimeInMilliseconds() - time_start;
793
794 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
795
sprang0a43fef2015-11-20 09:00:37 -0800796 // Allow for aliasing, duration should be within one pack of max time limit.
797 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700798 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000799}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000800
801TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
802 uint32_t ssrc = 12346;
803 uint16_t sequence_number = 1234;
804 EXPECT_EQ(0, send_bucket_->QueueInMs());
805
perkjec81bcd2016-05-11 06:01:13 -0700806 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000807 SendAndExpectPacket(PacedSender::kNormalPriority,
808 ssrc,
809 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000810 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000811 1200,
812 false);
813
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000814 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000815 EXPECT_EQ(500, send_bucket_->QueueInMs());
816 send_bucket_->Process();
817 EXPECT_EQ(0, send_bucket_->QueueInMs());
818}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000819
isheriffcc5903e2016-10-04 08:29:38 -0700820TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000821 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700822 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000823 uint32_t ssrc = 12346;
824 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700825
isheriffcc5903e2016-10-04 08:29:38 -0700826 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700827 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800828 send_bucket_->CreateProbeCluster(kFirstClusterBps);
829 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700830 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000831
philipelfd58b612017-01-04 07:05:25 -0800832 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200833 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
834 sequence_number++, clock_.TimeInMilliseconds(),
835 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000836 }
perkjec81bcd2016-05-11 06:01:13 -0700837
isheriffcc5903e2016-10-04 08:29:38 -0700838 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800839 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000840 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700841 clock_.AdvanceTimeMilliseconds(time_until_process);
842 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000843 }
isheriffcc5903e2016-10-04 08:29:38 -0700844 int packets_sent = packet_sender.packets_sent();
845 // Validate first cluster bitrate. Note that we have to account for number
846 // of intervals and hence (packets_sent - 1) on the first cluster.
847 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
848 (clock_.TimeInMilliseconds() - start),
849 kFirstClusterBps, kBitrateProbingError);
850 EXPECT_EQ(0, packet_sender.padding_sent());
851
sergeyu6dbbd892017-01-17 15:07:59 -0800852 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700853 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800854 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700855 int time_until_process = send_bucket_->TimeUntilNextProcess();
856 clock_.AdvanceTimeMilliseconds(time_until_process);
857 send_bucket_->Process();
858 }
859 packets_sent = packet_sender.packets_sent() - packets_sent;
860 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800861 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
862 (clock_.TimeInMilliseconds() - start),
863 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000864}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000865
isheriffcc5903e2016-10-04 08:29:38 -0700866TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200867 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700868 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200869 uint32_t ssrc = 12346;
870 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700871
872 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700873 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800874 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700875 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200876
philipelfd58b612017-01-04 07:05:25 -0800877 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200878 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
879 sequence_number++, clock_.TimeInMilliseconds(),
880 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200881 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200882
isheriffcc5903e2016-10-04 08:29:38 -0700883 int64_t start = clock_.TimeInMilliseconds();
884 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800885 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700886 int time_until_process = send_bucket_->TimeUntilNextProcess();
887 clock_.AdvanceTimeMilliseconds(time_until_process);
888 send_bucket_->Process();
889 ++process_count;
890 }
891 int packets_sent = packet_sender.packets_sent();
892 int padding_sent = packet_sender.padding_sent();
893 EXPECT_GT(packets_sent, 0);
894 EXPECT_GT(padding_sent, 0);
895 // Note that the number of intervals here for kPacketSize is
896 // packets_sent due to padding in the same cluster.
897 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
898 (clock_.TimeInMilliseconds() - start),
899 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200900}
901
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000902TEST_F(PacedSenderTest, PriorityInversion) {
903 uint32_t ssrc = 12346;
904 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000905 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000906
Peter Boströme23e7372015-10-08 11:44:14 +0200907 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000908 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200909 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000910
Peter Boströme23e7372015-10-08 11:44:14 +0200911 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000912 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200913 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000914
Peter Boströme23e7372015-10-08 11:44:14 +0200915 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
916 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000917
Peter Boströme23e7372015-10-08 11:44:14 +0200918 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
919 sequence_number + 1, clock_.TimeInMilliseconds(),
920 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000921
922 // Packets from earlier frames should be sent first.
923 {
924 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200925 EXPECT_CALL(callback_,
926 TimeToSendPacket(ssrc, sequence_number,
927 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000928 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200929 EXPECT_CALL(callback_,
930 TimeToSendPacket(ssrc, sequence_number + 1,
931 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000932 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200933 EXPECT_CALL(callback_,
934 TimeToSendPacket(ssrc, sequence_number + 3,
935 clock_.TimeInMilliseconds() + 33, true, _))
936 .WillOnce(Return(true));
937 EXPECT_CALL(callback_,
938 TimeToSendPacket(ssrc, sequence_number + 2,
939 clock_.TimeInMilliseconds() + 33, true, _))
940 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000941
942 while (send_bucket_->QueueSizePackets() > 0) {
943 int time_until_process = send_bucket_->TimeUntilNextProcess();
944 if (time_until_process <= 0) {
945 send_bucket_->Process();
946 } else {
947 clock_.AdvanceTimeMilliseconds(time_until_process);
948 }
949 }
950 }
951}
952
953TEST_F(PacedSenderTest, PaddingOveruse) {
954 uint32_t ssrc = 12346;
955 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000956 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000957
perkjec81bcd2016-05-11 06:01:13 -0700958 send_bucket_->Process();
959 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700960 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700961
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000962 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
963 clock_.TimeInMilliseconds(), kPacketSize, false);
964 send_bucket_->Process();
965
966 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700967 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000968 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700969 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000970
perkjec81bcd2016-05-11 06:01:13 -0700971 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
972 clock_.TimeInMilliseconds(), kPacketSize, false);
973 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000974 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700975 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000976 send_bucket_->Process();
977}
978
Erik Språngad113e52015-11-26 16:26:12 +0100979TEST_F(PacedSenderTest, AverageQueueTime) {
980 uint32_t ssrc = 12346;
981 uint16_t sequence_number = 1234;
982 const size_t kPacketSize = 1200;
983 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100984
perkjec81bcd2016-05-11 06:01:13 -0700985 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100986
987 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
988
989 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100990 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
991 sequence_number, first_capture_time, kPacketSize,
992 false);
Erik Språngad113e52015-11-26 16:26:12 +0100993 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100994 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100995 sequence_number + 1, clock_.TimeInMilliseconds(),
996 kPacketSize, false);
997 clock_.AdvanceTimeMilliseconds(10);
998
999 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
1000
1001 // Only first packet (queued for 20ms) should be removed, leave the second
1002 // packet (queued for 10ms) alone in the queue.
1003 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +02001004 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +01001005 .Times(1)
1006 .WillRepeatedly(Return(true));
1007 send_bucket_->Process();
1008
1009 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
1010
1011 clock_.AdvanceTimeMilliseconds(10);
1012 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +02001013 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +01001014 .Times(1)
1015 .WillRepeatedly(Return(true));
1016 for (int i = 0; i < 3; ++i) {
1017 clock_.AdvanceTimeMilliseconds(30); // Max delta.
1018 send_bucket_->Process();
1019 }
1020
1021 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
1022}
1023
philipel1a93cde2016-06-03 01:41:45 -07001024TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +02001025 uint32_t ssrc = 12346;
1026 uint16_t sequence_number = 1234;
1027 const size_t kPacketSize = 1200;
1028
perkj71ee44c2016-06-15 00:47:53 -07001029 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001030 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -08001031 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +02001032 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1033 sequence_number + i, clock_.TimeInMilliseconds(),
1034 kPacketSize, false);
1035 }
1036
1037 // First probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001038 EXPECT_CALL(callback_,
1039 TimeToSendPacket(_, _, _, _,
1040 Field(&PacedPacketInfo::probe_cluster_id, 0)))
philipelfd58b612017-01-04 07:05:25 -08001041 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001042 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001043 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001044 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001045 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001046 }
philipel29dca2c2016-05-13 11:13:05 +02001047
1048 // Second probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001049 EXPECT_CALL(callback_,
1050 TimeToSendPacket(_, _, _, _,
1051 Field(&PacedPacketInfo::probe_cluster_id, 1)))
philipel29dca2c2016-05-13 11:13:05 +02001052 .Times(5)
1053 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001054 for (int i = 0; i < 5; ++i) {
1055 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001056 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001057 }
philipel29dca2c2016-05-13 11:13:05 +02001058
philipelc7bf32a2017-02-17 03:59:43 -08001059 // Needed for the Field comparer below.
1060 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
philipel29dca2c2016-05-13 11:13:05 +02001061 // No more probing packets.
philipelc7bf32a2017-02-17 03:59:43 -08001062 EXPECT_CALL(callback_,
1063 TimeToSendPadding(
1064 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1065 .Times(1)
1066 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001067 send_bucket_->Process();
1068}
1069
philipelb61927c2017-02-28 07:05:23 -08001070TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
1071 uint32_t ssrc = 12346;
1072 uint16_t sequence_number = 1234;
1073 const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
1074
1075 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
1076 send_bucket_->SetProbingEnabled(true);
1077 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1078 sequence_number, clock_.TimeInMilliseconds(),
1079 kPacketSize, false);
1080
1081 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
1082 .WillOnce(Return(true));
1083 send_bucket_->Process();
1084 EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
1085 clock_.AdvanceTimeMilliseconds(9);
1086
1087 EXPECT_CALL(callback_, TimeToSendPadding(_, _))
1088 .Times(2)
1089 .WillRepeatedly(Return(0));
1090 send_bucket_->Process();
1091 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
1092 clock_.AdvanceTimeMilliseconds(1);
1093 send_bucket_->Process();
1094 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
1095}
1096
sprangddcfb9f2017-08-16 05:38:49 -07001097TEST_F(PacedSenderTest, QueueTimeWithPause) {
1098 const size_t kPacketSize = 1200;
1099 const uint32_t kSsrc = 12346;
1100 uint16_t sequence_number = 1234;
1101
1102 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1103 sequence_number++, clock_.TimeInMilliseconds(),
1104 kPacketSize, false);
1105 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1106 sequence_number++, clock_.TimeInMilliseconds(),
1107 kPacketSize, false);
1108
1109 clock_.AdvanceTimeMilliseconds(100);
1110 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1111
1112 send_bucket_->Pause();
1113 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1114
1115 // In paused state, queue time should not increase.
1116 clock_.AdvanceTimeMilliseconds(100);
1117 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1118
1119 send_bucket_->Resume();
1120 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1121
1122 clock_.AdvanceTimeMilliseconds(100);
1123 EXPECT_EQ(200, send_bucket_->AverageQueueTimeMs());
1124}
1125
1126TEST_F(PacedSenderTest, QueueTimePausedDuringPush) {
1127 const size_t kPacketSize = 1200;
1128 const uint32_t kSsrc = 12346;
1129 uint16_t sequence_number = 1234;
1130
1131 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1132 sequence_number++, clock_.TimeInMilliseconds(),
1133 kPacketSize, false);
1134 clock_.AdvanceTimeMilliseconds(100);
1135 send_bucket_->Pause();
1136 clock_.AdvanceTimeMilliseconds(100);
1137 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1138
1139 // Add a new packet during paused phase.
1140 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1141 sequence_number++, clock_.TimeInMilliseconds(),
1142 kPacketSize, false);
1143 // From a queue time perspective, packet inserted during pause will have zero
1144 // queue time. Average queue time will then be (0 + 100) / 2 = 50.
1145 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1146
1147 clock_.AdvanceTimeMilliseconds(100);
1148 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1149
1150 send_bucket_->Resume();
1151 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1152
1153 clock_.AdvanceTimeMilliseconds(100);
1154 EXPECT_EQ(150, send_bucket_->AverageQueueTimeMs());
1155}
1156
1157// TODO(sprang): Extract PacketQueue from PacedSender so that we can test
1158// removing elements while paused. (This is possible, but only because of semi-
1159// racy condition so can't easily be tested).
1160
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001161} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001162} // namespace webrtc