blob: e4adcd3f29b0235d8a8bdcc69a74948f9cd388c9 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/pacing/paced_sender.h"
15#include "system_wrappers/include/clock.h"
16#include "test/gmock.h"
17#include "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
philipel7dc719a2017-09-29 16:15:25 +0200258TEST_F(PacedSenderTest, RepeatedRetransmissionsAllowed) {
259 // Send one packet, then two retransmissions of that packet.
260 for (size_t i = 0; i < 3; i++) {
261 constexpr uint32_t ssrc = 333;
262 constexpr uint16_t sequence_number = 444;
263 constexpr size_t bytes = 250;
264 bool is_retransmission = (i != 0); // Original followed by retransmissions.
265 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number,
266 clock_.TimeInMilliseconds(), bytes, is_retransmission);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000267 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000268 }
pbosa26ac922016-02-25 04:50:01 -0800269 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000270}
271
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000272TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
273 uint32_t ssrc = 12345;
274 uint16_t sequence_number = 1234;
275
276 SendAndExpectPacket(PacedSender::kNormalPriority,
277 ssrc,
278 sequence_number,
279 clock_.TimeInMilliseconds(),
280 250,
281 false);
282
283 // Expect packet on second ssrc to be queued and sent as well.
284 SendAndExpectPacket(PacedSender::kNormalPriority,
285 ssrc + 1,
286 sequence_number,
287 clock_.TimeInMilliseconds(),
288 250,
289 false);
290
291 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000292 send_bucket_->Process();
293}
294
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000295TEST_F(PacedSenderTest, Padding) {
296 uint32_t ssrc = 12345;
297 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000298
perkjec81bcd2016-05-11 06:01:13 -0700299 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700300 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700301
302 // Due to the multiplicative factor we can send 5 packets during a send
303 // interval. (network capacity * multiplier / (8 bits per byte *
304 // (packet size * #send intervals per second)
305 const size_t packets_to_send_per_interval =
306 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
307 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
308 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
309 clock_.TimeInMilliseconds(), 250, false);
310 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000311 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700312 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700313 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
314 send_bucket_->Process();
315 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
316
317 // 5 milliseconds later should not send padding since we filled the buffers
318 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700319 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000320 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000321 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000322 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800323 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000324
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000325 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700326 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
327 .Times(1)
328 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000329 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000330 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000331 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800332 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000333}
334
perkj71ee44c2016-06-15 00:47:53 -0700335TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
336 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
337 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
338
339 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
340 send_bucket_->Process();
341 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
342
343 send_bucket_->Process();
344 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
345
346 uint32_t ssrc = 12345;
347 uint16_t sequence_number = 1234;
348 int64_t capture_time_ms = 56789;
349
350 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
351 capture_time_ms, 250, false);
352 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
353 .Times(1)
354 .WillOnce(Return(250));
355 send_bucket_->Process();
356}
357
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000358TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
359 uint32_t ssrc = 12345;
360 uint16_t sequence_number = 1234;
361 int64_t capture_time_ms = 56789;
362 const int kTimeStep = 5;
363 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700364 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700365 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700366
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000367 int64_t start_time = clock_.TimeInMilliseconds();
368 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000369 SendAndExpectPacket(PacedSender::kNormalPriority,
370 ssrc,
371 sequence_number++,
372 capture_time_ms,
373 250,
374 false);
philipela1ed0b32016-06-01 06:31:17 -0700375 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
376 .Times(1)
377 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000378 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700379 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000380 }
381}
382
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000383TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
384 uint32_t ssrc = 12345;
385 uint16_t sequence_number = 1234;
386 int64_t capture_time_ms = 56789;
387 const int kTimeStep = 5;
388 const int64_t kBitrateWindow = 10000;
389 PacedSenderPadding callback;
philipelc3b3f7a2017-03-29 01:23:13 -0700390 send_bucket_.reset(new PacedSender(&clock_, &callback, nullptr));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000391 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700392 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700393
394 send_bucket_->SetSendBitrateLimits(
395 0 /*allocated_bitrate_bps*/,
396 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700397
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000398 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000399 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000400 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800401 int rand_value = rand(); // NOLINT (rand_r instead of rand)
402 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200403 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
404 sequence_number++, capture_time_ms,
405 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000406 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000407 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000408 send_bucket_->Process();
409 }
perkjec81bcd2016-05-11 06:01:13 -0700410 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000411 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700412 kBitrateWindow),
413 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000414}
415
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000416TEST_F(PacedSenderTest, Priority) {
417 uint32_t ssrc_low_priority = 12345;
418 uint32_t ssrc = 12346;
419 uint16_t sequence_number = 1234;
420 int64_t capture_time_ms = 56789;
421 int64_t capture_time_ms_low_priority = 1234567;
422
perkjec81bcd2016-05-11 06:01:13 -0700423 // Due to the multiplicative factor we can send 5 packets during a send
424 // interval. (network capacity * multiplier / (8 bits per byte *
425 // (packet size * #send intervals per second)
426 const size_t packets_to_send_per_interval =
427 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
428 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
429 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
430 clock_.TimeInMilliseconds(), 250, false);
431 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000432 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700433 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000434
435 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200436 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
437 sequence_number++, capture_time_ms_low_priority,
438 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700439
440 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
441 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
442 sequence_number++, capture_time_ms, 250, false);
443 }
Peter Boströme23e7372015-10-08 11:44:14 +0200444 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
445 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000446
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000447 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700448 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200449 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700450 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000451 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000452
453 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000454 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000455 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800456 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700457 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000458
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000459 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200460 TimeToSendPacket(ssrc_low_priority, _,
461 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000462 .Times(1)
463 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000464
465 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000466 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000467 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800468 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000469}
470
tereliusf39f7d92016-07-20 03:36:19 -0700471TEST_F(PacedSenderTest, RetransmissionPriority) {
472 uint32_t ssrc = 12345;
473 uint16_t sequence_number = 1234;
474 int64_t capture_time_ms = 45678;
475 int64_t capture_time_ms_retransmission = 56789;
476
477 // Due to the multiplicative factor we can send 5 packets during a send
478 // interval. (network capacity * multiplier / (8 bits per byte *
479 // (packet size * #send intervals per second)
480 const size_t packets_to_send_per_interval =
481 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
482 send_bucket_->Process();
483 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
484
485 // Alternate retransmissions and normal packets.
486 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
487 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
488 sequence_number++,
489 capture_time_ms_retransmission, 250, true);
490 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
491 sequence_number++, capture_time_ms, 250, false);
492 }
493 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
494
495 // Expect all retransmissions to be sent out first despite having a later
496 // capture time.
497 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
498 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
499 EXPECT_CALL(callback_, TimeToSendPacket(
500 ssrc, _, capture_time_ms_retransmission, true, _))
501 .Times(packets_to_send_per_interval)
502 .WillRepeatedly(Return(true));
503
504 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
505 clock_.AdvanceTimeMilliseconds(5);
506 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
507 send_bucket_->Process();
508 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
509
510 // Expect the remaining (non-retransmission) packets to be sent.
511 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
512 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
513 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
514 .Times(packets_to_send_per_interval)
515 .WillRepeatedly(Return(true));
516
517 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
518 clock_.AdvanceTimeMilliseconds(5);
519 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
520 send_bucket_->Process();
521
522 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
523}
524
Stefan Holmerc482eb32015-12-16 16:55:03 +0100525TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
526 uint32_t ssrc = 12346;
527 uint16_t sequence_number = 1234;
528 int64_t capture_time_ms = 56789;
529
530 // As high prio packets doesn't affect the budget, we should be able to send
531 // a high number of them at once.
532 for (int i = 0; i < 25; ++i) {
533 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
534 capture_time_ms, 250, false);
535 }
536 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700537 // Low prio packets does affect the budget.
538 // Due to the multiplicative factor we can send 5 packets during a send
539 // interval. (network capacity * multiplier / (8 bits per byte *
540 // (packet size * #send intervals per second)
541 const size_t packets_to_send_per_interval =
542 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
543 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100544 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700545 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100546 }
547 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
548 capture_time_ms, 250, false);
549 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
550 clock_.AdvanceTimeMilliseconds(5);
551 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700552 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200553 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
554 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700555 .Times(1)
556 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100557 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
558 clock_.AdvanceTimeMilliseconds(5);
559 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700560 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100561}
562
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000563TEST_F(PacedSenderTest, Pause) {
564 uint32_t ssrc_low_priority = 12345;
565 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700566 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000567 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000568 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000569
570 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000571
perkjec81bcd2016-05-11 06:01:13 -0700572 // Due to the multiplicative factor we can send 5 packets during a send
573 // interval. (network capacity * multiplier / (8 bits per byte *
574 // (packet size * #send intervals per second)
575 const size_t packets_to_send_per_interval =
576 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
577 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
578 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
579 clock_.TimeInMilliseconds(), 250, false);
580 }
581
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000582 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000583
584 send_bucket_->Pause();
585
terelius8b70faf2016-08-01 09:47:31 -0700586 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
587 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
588 sequence_number++, capture_time_ms, 250, false);
589 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
590 sequence_number++, capture_time_ms, 250, false);
591 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
592 sequence_number++, capture_time_ms, 250, false);
593 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000594 clock_.AdvanceTimeMilliseconds(10000);
595 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700596 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
597 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
598 sequence_number++, second_capture_time_ms, 250,
599 false);
600 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
601 sequence_number++, second_capture_time_ms, 250,
602 false);
603 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
604 sequence_number++, second_capture_time_ms, 250,
605 false);
606 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000607
608 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700609 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000610 send_bucket_->QueueInMs());
611
stefan9e117c5e12017-08-16 08:16:25 -0700612 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
613 EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
614 send_bucket_->Process();
615
616 int64_t expected_time_until_send = 500;
617 EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
618 while (expected_time_until_send >= 0) {
tommi919dce22017-03-15 07:45:36 -0700619 // TimeUntilNextProcess must not return 0 when paused. If it does,
620 // we risk running a busy loop, so ideally it should return a large value.
stefan9e117c5e12017-08-16 08:16:25 -0700621 EXPECT_EQ(expected_time_until_send, send_bucket_->TimeUntilNextProcess());
622 if (expected_time_until_send == 0)
623 send_bucket_->Process();
624 clock_.AdvanceTimeMilliseconds(5);
625 expected_time_until_send -= 5;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000626 }
terelius8b70faf2016-08-01 09:47:31 -0700627
stefan099110c2017-02-01 03:57:42 -0800628 // Expect high prio packets to come out first followed by normal
629 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700630 {
631 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800632 EXPECT_CALL(callback_,
633 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
634 .Times(packets_to_send_per_interval)
635 .WillRepeatedly(Return(true));
636 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
637 second_capture_time_ms, _, _))
638 .Times(packets_to_send_per_interval)
639 .WillRepeatedly(Return(true));
640
terelius8b70faf2016-08-01 09:47:31 -0700641 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
642 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
643 .Times(1)
644 .WillRepeatedly(Return(true));
645 }
646 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
647 EXPECT_CALL(callback_,
648 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
649 .Times(1)
650 .WillRepeatedly(Return(true));
651 }
652 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
653 EXPECT_CALL(callback_,
654 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
655 .Times(1)
656 .WillRepeatedly(Return(true));
657 }
658 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
659 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
660 second_capture_time_ms, _, _))
661 .Times(1)
662 .WillRepeatedly(Return(true));
663 }
664 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000665 send_bucket_->Resume();
666
terelius8b70faf2016-08-01 09:47:31 -0700667 for (size_t i = 0; i < 4; i++) {
stefan64136af2017-08-14 08:03:17 -0700668 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
669 send_bucket_->Process();
stefan9e117c5e12017-08-16 08:16:25 -0700670 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
671 clock_.AdvanceTimeMilliseconds(5);
terelius8b70faf2016-08-01 09:47:31 -0700672 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000673
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000674 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000675}
676
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000677TEST_F(PacedSenderTest, ResendPacket) {
678 uint32_t ssrc = 12346;
679 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000680 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000681 EXPECT_EQ(0, send_bucket_->QueueInMs());
682
Peter Boströme23e7372015-10-08 11:44:14 +0200683 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
684 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000685 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200686 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
687 sequence_number + 1, capture_time_ms + 1, 250,
688 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000689 clock_.AdvanceTimeMilliseconds(9999);
690 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000691 send_bucket_->QueueInMs());
692 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200693 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
694 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000695 .Times(1)
696 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000697 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000698 send_bucket_->Process();
699
700 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000701 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000702 send_bucket_->QueueInMs());
703
704 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200705 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
706 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000707 .Times(1)
708 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200709 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
710 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000711 .Times(1)
712 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000713 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000714 send_bucket_->Process();
715
716 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000717 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000718 send_bucket_->QueueInMs());
719
720 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200721 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
722 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000723 .Times(1)
724 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000725 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000726 send_bucket_->Process();
727 EXPECT_EQ(0, send_bucket_->QueueInMs());
728}
729
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000730TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000731 uint32_t ssrc = 12346;
732 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000733 const size_t kNumPackets = 60;
734 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700735 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000736 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000737
perkjec81bcd2016-05-11 06:01:13 -0700738 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000739 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000740 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
741 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000742 }
743
perkjec81bcd2016-05-11 06:01:13 -0700744 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000745 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700746 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000747 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000748
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000749 int64_t time_start = clock_.TimeInMilliseconds();
750 while (send_bucket_->QueueSizePackets() > 0) {
751 int time_until_process = send_bucket_->TimeUntilNextProcess();
752 if (time_until_process <= 0) {
753 send_bucket_->Process();
754 } else {
755 clock_.AdvanceTimeMilliseconds(time_until_process);
756 }
757 }
758 int64_t duration = clock_.TimeInMilliseconds() - time_start;
759
760 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
761
sprang0a43fef2015-11-20 09:00:37 -0800762 // Allow for aliasing, duration should be within one pack of max time limit.
763 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700764 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000765}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000766
767TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
768 uint32_t ssrc = 12346;
769 uint16_t sequence_number = 1234;
770 EXPECT_EQ(0, send_bucket_->QueueInMs());
771
perkjec81bcd2016-05-11 06:01:13 -0700772 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000773 SendAndExpectPacket(PacedSender::kNormalPriority,
774 ssrc,
775 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000776 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000777 1200,
778 false);
779
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000780 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000781 EXPECT_EQ(500, send_bucket_->QueueInMs());
782 send_bucket_->Process();
783 EXPECT_EQ(0, send_bucket_->QueueInMs());
784}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000785
isheriffcc5903e2016-10-04 08:29:38 -0700786TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000787 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700788 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000789 uint32_t ssrc = 12346;
790 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700791
isheriffcc5903e2016-10-04 08:29:38 -0700792 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700793 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800794 send_bucket_->CreateProbeCluster(kFirstClusterBps);
795 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700796 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000797
philipelfd58b612017-01-04 07:05:25 -0800798 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200799 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
800 sequence_number++, clock_.TimeInMilliseconds(),
801 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000802 }
perkjec81bcd2016-05-11 06:01:13 -0700803
isheriffcc5903e2016-10-04 08:29:38 -0700804 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800805 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000806 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700807 clock_.AdvanceTimeMilliseconds(time_until_process);
808 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000809 }
isheriffcc5903e2016-10-04 08:29:38 -0700810 int packets_sent = packet_sender.packets_sent();
811 // Validate first cluster bitrate. Note that we have to account for number
812 // of intervals and hence (packets_sent - 1) on the first cluster.
813 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
814 (clock_.TimeInMilliseconds() - start),
815 kFirstClusterBps, kBitrateProbingError);
816 EXPECT_EQ(0, packet_sender.padding_sent());
817
sergeyu6dbbd892017-01-17 15:07:59 -0800818 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700819 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800820 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700821 int time_until_process = send_bucket_->TimeUntilNextProcess();
822 clock_.AdvanceTimeMilliseconds(time_until_process);
823 send_bucket_->Process();
824 }
825 packets_sent = packet_sender.packets_sent() - packets_sent;
826 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800827 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
828 (clock_.TimeInMilliseconds() - start),
829 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000830}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000831
isheriffcc5903e2016-10-04 08:29:38 -0700832TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200833 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700834 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200835 uint32_t ssrc = 12346;
836 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700837
838 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700839 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800840 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700841 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200842
philipelfd58b612017-01-04 07:05:25 -0800843 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200844 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
845 sequence_number++, clock_.TimeInMilliseconds(),
846 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200847 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200848
isheriffcc5903e2016-10-04 08:29:38 -0700849 int64_t start = clock_.TimeInMilliseconds();
850 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800851 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700852 int time_until_process = send_bucket_->TimeUntilNextProcess();
853 clock_.AdvanceTimeMilliseconds(time_until_process);
854 send_bucket_->Process();
855 ++process_count;
856 }
857 int packets_sent = packet_sender.packets_sent();
858 int padding_sent = packet_sender.padding_sent();
859 EXPECT_GT(packets_sent, 0);
860 EXPECT_GT(padding_sent, 0);
861 // Note that the number of intervals here for kPacketSize is
862 // packets_sent due to padding in the same cluster.
863 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
864 (clock_.TimeInMilliseconds() - start),
865 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200866}
867
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000868TEST_F(PacedSenderTest, PriorityInversion) {
869 uint32_t ssrc = 12346;
870 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000871 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000872
Peter Boströme23e7372015-10-08 11:44:14 +0200873 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000874 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200875 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000876
Peter Boströme23e7372015-10-08 11:44:14 +0200877 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000878 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200879 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000880
Peter Boströme23e7372015-10-08 11:44:14 +0200881 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
882 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000883
Peter Boströme23e7372015-10-08 11:44:14 +0200884 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
885 sequence_number + 1, clock_.TimeInMilliseconds(),
886 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000887
888 // Packets from earlier frames should be sent first.
889 {
890 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200891 EXPECT_CALL(callback_,
892 TimeToSendPacket(ssrc, sequence_number,
893 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000894 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200895 EXPECT_CALL(callback_,
896 TimeToSendPacket(ssrc, sequence_number + 1,
897 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000898 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200899 EXPECT_CALL(callback_,
900 TimeToSendPacket(ssrc, sequence_number + 3,
901 clock_.TimeInMilliseconds() + 33, true, _))
902 .WillOnce(Return(true));
903 EXPECT_CALL(callback_,
904 TimeToSendPacket(ssrc, sequence_number + 2,
905 clock_.TimeInMilliseconds() + 33, true, _))
906 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000907
908 while (send_bucket_->QueueSizePackets() > 0) {
909 int time_until_process = send_bucket_->TimeUntilNextProcess();
910 if (time_until_process <= 0) {
911 send_bucket_->Process();
912 } else {
913 clock_.AdvanceTimeMilliseconds(time_until_process);
914 }
915 }
916 }
917}
918
919TEST_F(PacedSenderTest, PaddingOveruse) {
920 uint32_t ssrc = 12346;
921 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000922 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000923
perkjec81bcd2016-05-11 06:01:13 -0700924 send_bucket_->Process();
925 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700926 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700927
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000928 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
929 clock_.TimeInMilliseconds(), kPacketSize, false);
930 send_bucket_->Process();
931
932 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700933 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000934 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700935 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000936
perkjec81bcd2016-05-11 06:01:13 -0700937 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
938 clock_.TimeInMilliseconds(), kPacketSize, false);
939 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000940 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700941 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000942 send_bucket_->Process();
943}
944
Erik Språngad113e52015-11-26 16:26:12 +0100945TEST_F(PacedSenderTest, AverageQueueTime) {
946 uint32_t ssrc = 12346;
947 uint16_t sequence_number = 1234;
948 const size_t kPacketSize = 1200;
949 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100950
perkjec81bcd2016-05-11 06:01:13 -0700951 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100952
953 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
954
955 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100956 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
957 sequence_number, first_capture_time, kPacketSize,
958 false);
Erik Språngad113e52015-11-26 16:26:12 +0100959 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100960 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100961 sequence_number + 1, clock_.TimeInMilliseconds(),
962 kPacketSize, false);
963 clock_.AdvanceTimeMilliseconds(10);
964
965 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
966
967 // Only first packet (queued for 20ms) should be removed, leave the second
968 // packet (queued for 10ms) alone in the queue.
969 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200970 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100971 .Times(1)
972 .WillRepeatedly(Return(true));
973 send_bucket_->Process();
974
975 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
976
977 clock_.AdvanceTimeMilliseconds(10);
978 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200979 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100980 .Times(1)
981 .WillRepeatedly(Return(true));
982 for (int i = 0; i < 3; ++i) {
983 clock_.AdvanceTimeMilliseconds(30); // Max delta.
984 send_bucket_->Process();
985 }
986
987 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
988}
989
philipel1a93cde2016-06-03 01:41:45 -0700990TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +0200991 uint32_t ssrc = 12346;
992 uint16_t sequence_number = 1234;
993 const size_t kPacketSize = 1200;
994
perkj71ee44c2016-06-15 00:47:53 -0700995 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +0200996 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -0800997 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +0200998 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
999 sequence_number + i, clock_.TimeInMilliseconds(),
1000 kPacketSize, false);
1001 }
1002
1003 // First probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001004 EXPECT_CALL(callback_,
1005 TimeToSendPacket(_, _, _, _,
1006 Field(&PacedPacketInfo::probe_cluster_id, 0)))
philipelfd58b612017-01-04 07:05:25 -08001007 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001008 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001009 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001010 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001011 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001012 }
philipel29dca2c2016-05-13 11:13:05 +02001013
1014 // Second probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001015 EXPECT_CALL(callback_,
1016 TimeToSendPacket(_, _, _, _,
1017 Field(&PacedPacketInfo::probe_cluster_id, 1)))
philipel29dca2c2016-05-13 11:13:05 +02001018 .Times(5)
1019 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001020 for (int i = 0; i < 5; ++i) {
1021 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001022 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001023 }
philipel29dca2c2016-05-13 11:13:05 +02001024
philipelc7bf32a2017-02-17 03:59:43 -08001025 // Needed for the Field comparer below.
1026 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
philipel29dca2c2016-05-13 11:13:05 +02001027 // No more probing packets.
philipelc7bf32a2017-02-17 03:59:43 -08001028 EXPECT_CALL(callback_,
1029 TimeToSendPadding(
1030 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1031 .Times(1)
1032 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001033 send_bucket_->Process();
1034}
1035
philipelb61927c2017-02-28 07:05:23 -08001036TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
1037 uint32_t ssrc = 12346;
1038 uint16_t sequence_number = 1234;
1039 const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
1040
1041 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
1042 send_bucket_->SetProbingEnabled(true);
1043 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1044 sequence_number, clock_.TimeInMilliseconds(),
1045 kPacketSize, false);
1046
1047 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
1048 .WillOnce(Return(true));
1049 send_bucket_->Process();
1050 EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
1051 clock_.AdvanceTimeMilliseconds(9);
1052
1053 EXPECT_CALL(callback_, TimeToSendPadding(_, _))
1054 .Times(2)
1055 .WillRepeatedly(Return(0));
1056 send_bucket_->Process();
1057 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
1058 clock_.AdvanceTimeMilliseconds(1);
1059 send_bucket_->Process();
1060 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
1061}
1062
sprangddcfb9f2017-08-16 05:38:49 -07001063TEST_F(PacedSenderTest, QueueTimeWithPause) {
1064 const size_t kPacketSize = 1200;
1065 const uint32_t kSsrc = 12346;
1066 uint16_t sequence_number = 1234;
1067
1068 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1069 sequence_number++, clock_.TimeInMilliseconds(),
1070 kPacketSize, false);
1071 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1072 sequence_number++, clock_.TimeInMilliseconds(),
1073 kPacketSize, false);
1074
1075 clock_.AdvanceTimeMilliseconds(100);
1076 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1077
1078 send_bucket_->Pause();
1079 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1080
1081 // In paused state, queue time should not increase.
1082 clock_.AdvanceTimeMilliseconds(100);
1083 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1084
1085 send_bucket_->Resume();
1086 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1087
1088 clock_.AdvanceTimeMilliseconds(100);
1089 EXPECT_EQ(200, send_bucket_->AverageQueueTimeMs());
1090}
1091
1092TEST_F(PacedSenderTest, QueueTimePausedDuringPush) {
1093 const size_t kPacketSize = 1200;
1094 const uint32_t kSsrc = 12346;
1095 uint16_t sequence_number = 1234;
1096
1097 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1098 sequence_number++, clock_.TimeInMilliseconds(),
1099 kPacketSize, false);
1100 clock_.AdvanceTimeMilliseconds(100);
1101 send_bucket_->Pause();
1102 clock_.AdvanceTimeMilliseconds(100);
1103 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1104
1105 // Add a new packet during paused phase.
1106 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1107 sequence_number++, clock_.TimeInMilliseconds(),
1108 kPacketSize, false);
1109 // From a queue time perspective, packet inserted during pause will have zero
1110 // queue time. Average queue time will then be (0 + 100) / 2 = 50.
1111 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1112
1113 clock_.AdvanceTimeMilliseconds(100);
1114 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1115
1116 send_bucket_->Resume();
1117 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1118
1119 clock_.AdvanceTimeMilliseconds(100);
1120 EXPECT_EQ(150, send_bucket_->AverageQueueTimeMs());
1121}
1122
1123// TODO(sprang): Extract PacketQueue from PacedSender so that we can test
1124// removing elements while paused. (This is possible, but only because of semi-
1125// racy condition so can't easily be tested).
1126
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001127} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001128} // namespace webrtc