blob: 8a3cee09911d317cd68dc2f965504070d7686912 [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
stefan9e117c5e12017-08-16 08:16:25 -0700654 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
655 EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
656 send_bucket_->Process();
657
658 int64_t expected_time_until_send = 500;
659 EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
660 while (expected_time_until_send >= 0) {
tommi919dce22017-03-15 07:45:36 -0700661 // TimeUntilNextProcess must not return 0 when paused. If it does,
662 // we risk running a busy loop, so ideally it should return a large value.
stefan9e117c5e12017-08-16 08:16:25 -0700663 EXPECT_EQ(expected_time_until_send, send_bucket_->TimeUntilNextProcess());
664 if (expected_time_until_send == 0)
665 send_bucket_->Process();
666 clock_.AdvanceTimeMilliseconds(5);
667 expected_time_until_send -= 5;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000668 }
terelius8b70faf2016-08-01 09:47:31 -0700669
stefan099110c2017-02-01 03:57:42 -0800670 // Expect high prio packets to come out first followed by normal
671 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700672 {
673 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800674 EXPECT_CALL(callback_,
675 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
676 .Times(packets_to_send_per_interval)
677 .WillRepeatedly(Return(true));
678 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
679 second_capture_time_ms, _, _))
680 .Times(packets_to_send_per_interval)
681 .WillRepeatedly(Return(true));
682
terelius8b70faf2016-08-01 09:47:31 -0700683 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
684 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
685 .Times(1)
686 .WillRepeatedly(Return(true));
687 }
688 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
689 EXPECT_CALL(callback_,
690 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
691 .Times(1)
692 .WillRepeatedly(Return(true));
693 }
694 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
695 EXPECT_CALL(callback_,
696 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
697 .Times(1)
698 .WillRepeatedly(Return(true));
699 }
700 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
701 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
702 second_capture_time_ms, _, _))
703 .Times(1)
704 .WillRepeatedly(Return(true));
705 }
706 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000707 send_bucket_->Resume();
708
terelius8b70faf2016-08-01 09:47:31 -0700709 for (size_t i = 0; i < 4; i++) {
stefan64136af2017-08-14 08:03:17 -0700710 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
711 send_bucket_->Process();
stefan9e117c5e12017-08-16 08:16:25 -0700712 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
713 clock_.AdvanceTimeMilliseconds(5);
terelius8b70faf2016-08-01 09:47:31 -0700714 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000715
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000716 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000717}
718
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000719TEST_F(PacedSenderTest, ResendPacket) {
720 uint32_t ssrc = 12346;
721 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000722 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000723 EXPECT_EQ(0, send_bucket_->QueueInMs());
724
Peter Boströme23e7372015-10-08 11:44:14 +0200725 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
726 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000727 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200728 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
729 sequence_number + 1, capture_time_ms + 1, 250,
730 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000731 clock_.AdvanceTimeMilliseconds(9999);
732 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000733 send_bucket_->QueueInMs());
734 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200735 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
736 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000737 .Times(1)
738 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000739 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000740 send_bucket_->Process();
741
742 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000743 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000744 send_bucket_->QueueInMs());
745
746 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200747 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
748 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000749 .Times(1)
750 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200751 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
752 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000753 .Times(1)
754 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000755 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000756 send_bucket_->Process();
757
758 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000759 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000760 send_bucket_->QueueInMs());
761
762 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200763 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
764 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000765 .Times(1)
766 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000767 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000768 send_bucket_->Process();
769 EXPECT_EQ(0, send_bucket_->QueueInMs());
770}
771
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000772TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000773 uint32_t ssrc = 12346;
774 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000775 const size_t kNumPackets = 60;
776 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700777 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000778 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000779
perkjec81bcd2016-05-11 06:01:13 -0700780 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000781 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000782 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
783 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000784 }
785
perkjec81bcd2016-05-11 06:01:13 -0700786 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000787 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700788 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000789 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000790
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000791 int64_t time_start = clock_.TimeInMilliseconds();
792 while (send_bucket_->QueueSizePackets() > 0) {
793 int time_until_process = send_bucket_->TimeUntilNextProcess();
794 if (time_until_process <= 0) {
795 send_bucket_->Process();
796 } else {
797 clock_.AdvanceTimeMilliseconds(time_until_process);
798 }
799 }
800 int64_t duration = clock_.TimeInMilliseconds() - time_start;
801
802 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
803
sprang0a43fef2015-11-20 09:00:37 -0800804 // Allow for aliasing, duration should be within one pack of max time limit.
805 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700806 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000807}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000808
809TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
810 uint32_t ssrc = 12346;
811 uint16_t sequence_number = 1234;
812 EXPECT_EQ(0, send_bucket_->QueueInMs());
813
perkjec81bcd2016-05-11 06:01:13 -0700814 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000815 SendAndExpectPacket(PacedSender::kNormalPriority,
816 ssrc,
817 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000818 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000819 1200,
820 false);
821
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000822 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000823 EXPECT_EQ(500, send_bucket_->QueueInMs());
824 send_bucket_->Process();
825 EXPECT_EQ(0, send_bucket_->QueueInMs());
826}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000827
isheriffcc5903e2016-10-04 08:29:38 -0700828TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000829 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700830 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000831 uint32_t ssrc = 12346;
832 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700833
isheriffcc5903e2016-10-04 08:29:38 -0700834 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700835 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800836 send_bucket_->CreateProbeCluster(kFirstClusterBps);
837 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700838 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000839
philipelfd58b612017-01-04 07:05:25 -0800840 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200841 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
842 sequence_number++, clock_.TimeInMilliseconds(),
843 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000844 }
perkjec81bcd2016-05-11 06:01:13 -0700845
isheriffcc5903e2016-10-04 08:29:38 -0700846 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800847 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000848 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700849 clock_.AdvanceTimeMilliseconds(time_until_process);
850 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000851 }
isheriffcc5903e2016-10-04 08:29:38 -0700852 int packets_sent = packet_sender.packets_sent();
853 // Validate first cluster bitrate. Note that we have to account for number
854 // of intervals and hence (packets_sent - 1) on the first cluster.
855 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
856 (clock_.TimeInMilliseconds() - start),
857 kFirstClusterBps, kBitrateProbingError);
858 EXPECT_EQ(0, packet_sender.padding_sent());
859
sergeyu6dbbd892017-01-17 15:07:59 -0800860 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700861 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800862 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700863 int time_until_process = send_bucket_->TimeUntilNextProcess();
864 clock_.AdvanceTimeMilliseconds(time_until_process);
865 send_bucket_->Process();
866 }
867 packets_sent = packet_sender.packets_sent() - packets_sent;
868 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800869 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
870 (clock_.TimeInMilliseconds() - start),
871 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000872}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000873
isheriffcc5903e2016-10-04 08:29:38 -0700874TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200875 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700876 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200877 uint32_t ssrc = 12346;
878 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700879
880 PacedSenderProbing packet_sender;
philipelc3b3f7a2017-03-29 01:23:13 -0700881 send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
philipelfd58b612017-01-04 07:05:25 -0800882 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700883 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200884
philipelfd58b612017-01-04 07:05:25 -0800885 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200886 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
887 sequence_number++, clock_.TimeInMilliseconds(),
888 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200889 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200890
isheriffcc5903e2016-10-04 08:29:38 -0700891 int64_t start = clock_.TimeInMilliseconds();
892 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800893 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700894 int time_until_process = send_bucket_->TimeUntilNextProcess();
895 clock_.AdvanceTimeMilliseconds(time_until_process);
896 send_bucket_->Process();
897 ++process_count;
898 }
899 int packets_sent = packet_sender.packets_sent();
900 int padding_sent = packet_sender.padding_sent();
901 EXPECT_GT(packets_sent, 0);
902 EXPECT_GT(padding_sent, 0);
903 // Note that the number of intervals here for kPacketSize is
904 // packets_sent due to padding in the same cluster.
905 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
906 (clock_.TimeInMilliseconds() - start),
907 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200908}
909
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000910TEST_F(PacedSenderTest, PriorityInversion) {
911 uint32_t ssrc = 12346;
912 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000913 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000914
Peter Boströme23e7372015-10-08 11:44:14 +0200915 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000916 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200917 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000918
Peter Boströme23e7372015-10-08 11:44:14 +0200919 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000920 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200921 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000922
Peter Boströme23e7372015-10-08 11:44:14 +0200923 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
924 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000925
Peter Boströme23e7372015-10-08 11:44:14 +0200926 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
927 sequence_number + 1, clock_.TimeInMilliseconds(),
928 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000929
930 // Packets from earlier frames should be sent first.
931 {
932 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200933 EXPECT_CALL(callback_,
934 TimeToSendPacket(ssrc, sequence_number,
935 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000936 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200937 EXPECT_CALL(callback_,
938 TimeToSendPacket(ssrc, sequence_number + 1,
939 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000940 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200941 EXPECT_CALL(callback_,
942 TimeToSendPacket(ssrc, sequence_number + 3,
943 clock_.TimeInMilliseconds() + 33, true, _))
944 .WillOnce(Return(true));
945 EXPECT_CALL(callback_,
946 TimeToSendPacket(ssrc, sequence_number + 2,
947 clock_.TimeInMilliseconds() + 33, true, _))
948 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000949
950 while (send_bucket_->QueueSizePackets() > 0) {
951 int time_until_process = send_bucket_->TimeUntilNextProcess();
952 if (time_until_process <= 0) {
953 send_bucket_->Process();
954 } else {
955 clock_.AdvanceTimeMilliseconds(time_until_process);
956 }
957 }
958 }
959}
960
961TEST_F(PacedSenderTest, PaddingOveruse) {
962 uint32_t ssrc = 12346;
963 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000964 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000965
perkjec81bcd2016-05-11 06:01:13 -0700966 send_bucket_->Process();
967 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700968 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700969
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000970 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
971 clock_.TimeInMilliseconds(), kPacketSize, false);
972 send_bucket_->Process();
973
974 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700975 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000976 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700977 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000978
perkjec81bcd2016-05-11 06:01:13 -0700979 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
980 clock_.TimeInMilliseconds(), kPacketSize, false);
981 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000982 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700983 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000984 send_bucket_->Process();
985}
986
Erik Språngad113e52015-11-26 16:26:12 +0100987TEST_F(PacedSenderTest, AverageQueueTime) {
988 uint32_t ssrc = 12346;
989 uint16_t sequence_number = 1234;
990 const size_t kPacketSize = 1200;
991 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100992
perkjec81bcd2016-05-11 06:01:13 -0700993 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100994
995 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
996
997 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100998 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
999 sequence_number, first_capture_time, kPacketSize,
1000 false);
Erik Språngad113e52015-11-26 16:26:12 +01001001 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +01001002 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +01001003 sequence_number + 1, clock_.TimeInMilliseconds(),
1004 kPacketSize, false);
1005 clock_.AdvanceTimeMilliseconds(10);
1006
1007 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
1008
1009 // Only first packet (queued for 20ms) should be removed, leave the second
1010 // packet (queued for 10ms) alone in the queue.
1011 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +02001012 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +01001013 .Times(1)
1014 .WillRepeatedly(Return(true));
1015 send_bucket_->Process();
1016
1017 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
1018
1019 clock_.AdvanceTimeMilliseconds(10);
1020 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +02001021 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +01001022 .Times(1)
1023 .WillRepeatedly(Return(true));
1024 for (int i = 0; i < 3; ++i) {
1025 clock_.AdvanceTimeMilliseconds(30); // Max delta.
1026 send_bucket_->Process();
1027 }
1028
1029 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
1030}
1031
philipel1a93cde2016-06-03 01:41:45 -07001032TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +02001033 uint32_t ssrc = 12346;
1034 uint16_t sequence_number = 1234;
1035 const size_t kPacketSize = 1200;
1036
perkj71ee44c2016-06-15 00:47:53 -07001037 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001038 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -08001039 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +02001040 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1041 sequence_number + i, clock_.TimeInMilliseconds(),
1042 kPacketSize, false);
1043 }
1044
1045 // First probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001046 EXPECT_CALL(callback_,
1047 TimeToSendPacket(_, _, _, _,
1048 Field(&PacedPacketInfo::probe_cluster_id, 0)))
philipelfd58b612017-01-04 07:05:25 -08001049 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001050 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001051 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001052 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001053 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001054 }
philipel29dca2c2016-05-13 11:13:05 +02001055
1056 // Second probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001057 EXPECT_CALL(callback_,
1058 TimeToSendPacket(_, _, _, _,
1059 Field(&PacedPacketInfo::probe_cluster_id, 1)))
philipel29dca2c2016-05-13 11:13:05 +02001060 .Times(5)
1061 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001062 for (int i = 0; i < 5; ++i) {
1063 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001064 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001065 }
philipel29dca2c2016-05-13 11:13:05 +02001066
philipelc7bf32a2017-02-17 03:59:43 -08001067 // Needed for the Field comparer below.
1068 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
philipel29dca2c2016-05-13 11:13:05 +02001069 // No more probing packets.
philipelc7bf32a2017-02-17 03:59:43 -08001070 EXPECT_CALL(callback_,
1071 TimeToSendPadding(
1072 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1073 .Times(1)
1074 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001075 send_bucket_->Process();
1076}
1077
philipelb61927c2017-02-28 07:05:23 -08001078TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
1079 uint32_t ssrc = 12346;
1080 uint16_t sequence_number = 1234;
1081 const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
1082
1083 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
1084 send_bucket_->SetProbingEnabled(true);
1085 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1086 sequence_number, clock_.TimeInMilliseconds(),
1087 kPacketSize, false);
1088
1089 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
1090 .WillOnce(Return(true));
1091 send_bucket_->Process();
1092 EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
1093 clock_.AdvanceTimeMilliseconds(9);
1094
1095 EXPECT_CALL(callback_, TimeToSendPadding(_, _))
1096 .Times(2)
1097 .WillRepeatedly(Return(0));
1098 send_bucket_->Process();
1099 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
1100 clock_.AdvanceTimeMilliseconds(1);
1101 send_bucket_->Process();
1102 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
1103}
1104
sprangddcfb9f2017-08-16 05:38:49 -07001105TEST_F(PacedSenderTest, QueueTimeWithPause) {
1106 const size_t kPacketSize = 1200;
1107 const uint32_t kSsrc = 12346;
1108 uint16_t sequence_number = 1234;
1109
1110 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1111 sequence_number++, clock_.TimeInMilliseconds(),
1112 kPacketSize, false);
1113 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1114 sequence_number++, clock_.TimeInMilliseconds(),
1115 kPacketSize, false);
1116
1117 clock_.AdvanceTimeMilliseconds(100);
1118 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1119
1120 send_bucket_->Pause();
1121 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1122
1123 // In paused state, queue time should not increase.
1124 clock_.AdvanceTimeMilliseconds(100);
1125 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1126
1127 send_bucket_->Resume();
1128 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1129
1130 clock_.AdvanceTimeMilliseconds(100);
1131 EXPECT_EQ(200, send_bucket_->AverageQueueTimeMs());
1132}
1133
1134TEST_F(PacedSenderTest, QueueTimePausedDuringPush) {
1135 const size_t kPacketSize = 1200;
1136 const uint32_t kSsrc = 12346;
1137 uint16_t sequence_number = 1234;
1138
1139 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1140 sequence_number++, clock_.TimeInMilliseconds(),
1141 kPacketSize, false);
1142 clock_.AdvanceTimeMilliseconds(100);
1143 send_bucket_->Pause();
1144 clock_.AdvanceTimeMilliseconds(100);
1145 EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
1146
1147 // Add a new packet during paused phase.
1148 send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
1149 sequence_number++, clock_.TimeInMilliseconds(),
1150 kPacketSize, false);
1151 // From a queue time perspective, packet inserted during pause will have zero
1152 // queue time. Average queue time will then be (0 + 100) / 2 = 50.
1153 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1154
1155 clock_.AdvanceTimeMilliseconds(100);
1156 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1157
1158 send_bucket_->Resume();
1159 EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
1160
1161 clock_.AdvanceTimeMilliseconds(100);
1162 EXPECT_EQ(150, send_bucket_->AverageQueueTimeMs());
1163}
1164
1165// TODO(sprang): Extract PacketQueue from PacedSender so that we can test
1166// removing elements while paused. (This is possible, but only because of semi-
1167// racy condition so can't easily be tested).
1168
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001169} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001170} // namespace webrtc