blob: 62359785ae1e764eb98588179fef0fd7fc2e45a9 [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.
philipele3b354b2017-03-28 07:59:51 -0700109 send_bucket_.reset(new PacedSender(&clock_, &callback_));
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
139TEST_F(PacedSenderTest, QueuePacket) {
140 uint32_t ssrc = 12345;
141 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700142 // Due to the multiplicative factor we can send 5 packets during a send
143 // interval. (network capacity * multiplier / (8 bits per byte *
144 // (packet size * #send intervals per second)
145 const size_t packets_to_send =
146 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
147 for (size_t i = 0; i < packets_to_send; ++i) {
148 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
149 clock_.TimeInMilliseconds(), 250, false);
150 }
151
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000152 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200153 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
154 sequence_number, queued_packet_timestamp, 250,
155 false);
perkjec81bcd2016-05-11 06:01:13 -0700156 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000157 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000158 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
philipela1ed0b32016-06-01 06:31:17 -0700159 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000160 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000161 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000162 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000163 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700164 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200165 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
166 queued_packet_timestamp, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000167 .Times(1)
168 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000169 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000170 sequence_number++;
perkjec81bcd2016-05-11 06:01:13 -0700171 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
172
173 // We can send packets_to_send -1 packets of size 250 during the current
174 // interval since one packet has already been sent.
175 for (size_t i = 0; i < packets_to_send - 1; ++i) {
176 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
177 clock_.TimeInMilliseconds(), 250, false);
178 }
Peter Boströme23e7372015-10-08 11:44:14 +0200179 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
180 sequence_number++, clock_.TimeInMilliseconds(),
181 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700182 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000183 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700184 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000185}
186
187TEST_F(PacedSenderTest, PaceQueuedPackets) {
188 uint32_t ssrc = 12345;
189 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000190
perkjec81bcd2016-05-11 06:01:13 -0700191 // Due to the multiplicative factor we can send 5 packets during a send
192 // interval. (network capacity * multiplier / (8 bits per byte *
193 // (packet size * #send intervals per second)
194 const size_t packets_to_send_per_interval =
195 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
196 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
197 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
198 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000199 }
perkjec81bcd2016-05-11 06:01:13 -0700200
201 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200202 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
203 sequence_number++, clock_.TimeInMilliseconds(),
204 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000205 }
perkjec81bcd2016-05-11 06:01:13 -0700206 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
207 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000208 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700209 EXPECT_EQ(packets_to_send_per_interval * 10,
210 send_bucket_->QueueSizePackets());
philipela1ed0b32016-06-01 06:31:17 -0700211 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000212 for (int k = 0; k < 10; ++k) {
213 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000214 clock_.AdvanceTimeMilliseconds(5);
philipel29dca2c2016-05-13 11:13:05 +0200215 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700216 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000217 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000218 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800219 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000220 }
perkjec81bcd2016-05-11 06:01:13 -0700221 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000222 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000223 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000224 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700225 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800226 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700227
228 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
229 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
230 clock_.TimeInMilliseconds(), 250, false);
231 }
Peter Boströme23e7372015-10-08 11:44:14 +0200232 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
233 sequence_number, clock_.TimeInMilliseconds(), 250,
234 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000235 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700236 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000237}
238
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000239TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
240 uint32_t ssrc = 12345;
241 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000242 uint16_t queued_sequence_number;
243
perkjec81bcd2016-05-11 06:01:13 -0700244 // Due to the multiplicative factor we can send 5 packets during a send
245 // interval. (network capacity * multiplier / (8 bits per byte *
246 // (packet size * #send intervals per second)
247 const size_t packets_to_send_per_interval =
248 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
249 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
250 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
251 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000252 }
253 queued_sequence_number = sequence_number;
254
perkjec81bcd2016-05-11 06:01:13 -0700255 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000256 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200257 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
258 sequence_number, clock_.TimeInMilliseconds(),
259 250, false);
260 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
261 sequence_number++, clock_.TimeInMilliseconds(),
262 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000263 }
philipela1ed0b32016-06-01 06:31:17 -0700264 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000265 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000266 for (int k = 0; k < 10; ++k) {
267 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000268 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000269
perkjec81bcd2016-05-11 06:01:13 -0700270 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000271 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200272 TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000273 .Times(1)
274 .WillRepeatedly(Return(true));
jbauchd2a22962016-02-08 23:18:25 -0800275 }
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000276 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800277 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000278 }
279 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000280 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000281 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800282 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700283
284 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
285 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
286 clock_.TimeInMilliseconds(), 250, false);
287 }
Peter Boströme23e7372015-10-08 11:44:14 +0200288 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
289 sequence_number++, clock_.TimeInMilliseconds(),
290 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000291 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700292 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000293}
294
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000295TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
296 uint32_t ssrc = 12345;
297 uint16_t sequence_number = 1234;
298
299 SendAndExpectPacket(PacedSender::kNormalPriority,
300 ssrc,
301 sequence_number,
302 clock_.TimeInMilliseconds(),
303 250,
304 false);
305
306 // Expect packet on second ssrc to be queued and sent as well.
307 SendAndExpectPacket(PacedSender::kNormalPriority,
308 ssrc + 1,
309 sequence_number,
310 clock_.TimeInMilliseconds(),
311 250,
312 false);
313
314 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000315 send_bucket_->Process();
316}
317
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000318TEST_F(PacedSenderTest, Padding) {
319 uint32_t ssrc = 12345;
320 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000321
perkjec81bcd2016-05-11 06:01:13 -0700322 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700323 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700324
325 // Due to the multiplicative factor we can send 5 packets during a send
326 // interval. (network capacity * multiplier / (8 bits per byte *
327 // (packet size * #send intervals per second)
328 const size_t packets_to_send_per_interval =
329 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
330 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
331 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
332 clock_.TimeInMilliseconds(), 250, false);
333 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000334 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700335 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700336 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
337 send_bucket_->Process();
338 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
339
340 // 5 milliseconds later should not send padding since we filled the buffers
341 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700342 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000343 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000344 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000345 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800346 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000347
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000348 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700349 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
350 .Times(1)
351 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000352 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000353 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000354 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800355 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000356}
357
perkj71ee44c2016-06-15 00:47:53 -0700358TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
359 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
360 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
361
362 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
363 send_bucket_->Process();
364 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
365
366 send_bucket_->Process();
367 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
368
369 uint32_t ssrc = 12345;
370 uint16_t sequence_number = 1234;
371 int64_t capture_time_ms = 56789;
372
373 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
374 capture_time_ms, 250, false);
375 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
376 .Times(1)
377 .WillOnce(Return(250));
378 send_bucket_->Process();
379}
380
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000381TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
382 uint32_t ssrc = 12345;
383 uint16_t sequence_number = 1234;
384 int64_t capture_time_ms = 56789;
385 const int kTimeStep = 5;
386 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700387 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700388 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700389
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000390 int64_t start_time = clock_.TimeInMilliseconds();
391 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000392 SendAndExpectPacket(PacedSender::kNormalPriority,
393 ssrc,
394 sequence_number++,
395 capture_time_ms,
396 250,
397 false);
philipela1ed0b32016-06-01 06:31:17 -0700398 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
399 .Times(1)
400 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000401 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700402 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000403 }
404}
405
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000406TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
407 uint32_t ssrc = 12345;
408 uint16_t sequence_number = 1234;
409 int64_t capture_time_ms = 56789;
410 const int kTimeStep = 5;
411 const int64_t kBitrateWindow = 10000;
412 PacedSenderPadding callback;
philipele3b354b2017-03-28 07:59:51 -0700413 send_bucket_.reset(new PacedSender(&clock_, &callback));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000414 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700415 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700416
417 send_bucket_->SetSendBitrateLimits(
418 0 /*allocated_bitrate_bps*/,
419 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700420
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000421 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000422 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000423 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800424 int rand_value = rand(); // NOLINT (rand_r instead of rand)
425 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200426 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
427 sequence_number++, capture_time_ms,
428 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000429 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000430 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000431 send_bucket_->Process();
432 }
perkjec81bcd2016-05-11 06:01:13 -0700433 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000434 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700435 kBitrateWindow),
436 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000437}
438
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000439TEST_F(PacedSenderTest, Priority) {
440 uint32_t ssrc_low_priority = 12345;
441 uint32_t ssrc = 12346;
442 uint16_t sequence_number = 1234;
443 int64_t capture_time_ms = 56789;
444 int64_t capture_time_ms_low_priority = 1234567;
445
perkjec81bcd2016-05-11 06:01:13 -0700446 // Due to the multiplicative factor we can send 5 packets during a send
447 // interval. (network capacity * multiplier / (8 bits per byte *
448 // (packet size * #send intervals per second)
449 const size_t packets_to_send_per_interval =
450 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
451 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
452 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
453 clock_.TimeInMilliseconds(), 250, false);
454 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000455 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700456 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000457
458 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200459 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
460 sequence_number++, capture_time_ms_low_priority,
461 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700462
463 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
464 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
465 sequence_number++, capture_time_ms, 250, false);
466 }
Peter Boströme23e7372015-10-08 11:44:14 +0200467 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
468 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000469
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000470 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700471 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200472 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700473 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000474 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000475
476 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000477 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000478 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800479 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700480 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000481
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000482 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200483 TimeToSendPacket(ssrc_low_priority, _,
484 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000485 .Times(1)
486 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000487
488 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000489 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000490 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800491 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000492}
493
tereliusf39f7d92016-07-20 03:36:19 -0700494TEST_F(PacedSenderTest, RetransmissionPriority) {
495 uint32_t ssrc = 12345;
496 uint16_t sequence_number = 1234;
497 int64_t capture_time_ms = 45678;
498 int64_t capture_time_ms_retransmission = 56789;
499
500 // Due to the multiplicative factor we can send 5 packets during a send
501 // interval. (network capacity * multiplier / (8 bits per byte *
502 // (packet size * #send intervals per second)
503 const size_t packets_to_send_per_interval =
504 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
505 send_bucket_->Process();
506 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
507
508 // Alternate retransmissions and normal packets.
509 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
510 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
511 sequence_number++,
512 capture_time_ms_retransmission, 250, true);
513 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
514 sequence_number++, capture_time_ms, 250, false);
515 }
516 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
517
518 // Expect all retransmissions to be sent out first despite having a later
519 // capture time.
520 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
521 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
522 EXPECT_CALL(callback_, TimeToSendPacket(
523 ssrc, _, capture_time_ms_retransmission, true, _))
524 .Times(packets_to_send_per_interval)
525 .WillRepeatedly(Return(true));
526
527 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
528 clock_.AdvanceTimeMilliseconds(5);
529 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
530 send_bucket_->Process();
531 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
532
533 // Expect the remaining (non-retransmission) packets to be sent.
534 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
535 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
536 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
537 .Times(packets_to_send_per_interval)
538 .WillRepeatedly(Return(true));
539
540 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
541 clock_.AdvanceTimeMilliseconds(5);
542 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
543 send_bucket_->Process();
544
545 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
546}
547
Stefan Holmerc482eb32015-12-16 16:55:03 +0100548TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
549 uint32_t ssrc = 12346;
550 uint16_t sequence_number = 1234;
551 int64_t capture_time_ms = 56789;
552
553 // As high prio packets doesn't affect the budget, we should be able to send
554 // a high number of them at once.
555 for (int i = 0; i < 25; ++i) {
556 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
557 capture_time_ms, 250, false);
558 }
559 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700560 // Low prio packets does affect the budget.
561 // Due to the multiplicative factor we can send 5 packets during a send
562 // interval. (network capacity * multiplier / (8 bits per byte *
563 // (packet size * #send intervals per second)
564 const size_t packets_to_send_per_interval =
565 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
566 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100567 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700568 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100569 }
570 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
571 capture_time_ms, 250, false);
572 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
573 clock_.AdvanceTimeMilliseconds(5);
574 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700575 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200576 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
577 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700578 .Times(1)
579 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100580 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
581 clock_.AdvanceTimeMilliseconds(5);
582 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700583 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100584}
585
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000586TEST_F(PacedSenderTest, Pause) {
587 uint32_t ssrc_low_priority = 12345;
588 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700589 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000590 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000591 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000592
593 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000594
perkjec81bcd2016-05-11 06:01:13 -0700595 // Due to the multiplicative factor we can send 5 packets during a send
596 // interval. (network capacity * multiplier / (8 bits per byte *
597 // (packet size * #send intervals per second)
598 const size_t packets_to_send_per_interval =
599 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
600 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
601 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
602 clock_.TimeInMilliseconds(), 250, false);
603 }
604
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000605 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000606
607 send_bucket_->Pause();
608
terelius8b70faf2016-08-01 09:47:31 -0700609 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
610 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
611 sequence_number++, capture_time_ms, 250, false);
612 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
613 sequence_number++, capture_time_ms, 250, false);
614 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
615 sequence_number++, capture_time_ms, 250, false);
616 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000617 clock_.AdvanceTimeMilliseconds(10000);
618 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700619 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
620 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
621 sequence_number++, second_capture_time_ms, 250,
622 false);
623 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
624 sequence_number++, second_capture_time_ms, 250,
625 false);
626 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
627 sequence_number++, second_capture_time_ms, 250,
628 false);
629 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000630
631 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700632 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000633 send_bucket_->QueueInMs());
634
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000635 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000636 clock_.AdvanceTimeMilliseconds(5);
tommi919dce22017-03-15 07:45:36 -0700637 // TimeUntilNextProcess must not return 0 when paused. If it does,
638 // we risk running a busy loop, so ideally it should return a large value.
639 EXPECT_GE(send_bucket_->TimeUntilNextProcess(), 1000);
pbosa26ac922016-02-25 04:50:01 -0800640 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000641 }
terelius8b70faf2016-08-01 09:47:31 -0700642
stefan099110c2017-02-01 03:57:42 -0800643 // Expect high prio packets to come out first followed by normal
644 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700645 {
646 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800647 EXPECT_CALL(callback_,
648 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
649 .Times(packets_to_send_per_interval)
650 .WillRepeatedly(Return(true));
651 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
652 second_capture_time_ms, _, _))
653 .Times(packets_to_send_per_interval)
654 .WillRepeatedly(Return(true));
655
terelius8b70faf2016-08-01 09:47:31 -0700656 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
657 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
658 .Times(1)
659 .WillRepeatedly(Return(true));
660 }
661 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
662 EXPECT_CALL(callback_,
663 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
664 .Times(1)
665 .WillRepeatedly(Return(true));
666 }
667 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
668 EXPECT_CALL(callback_,
669 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
670 .Times(1)
671 .WillRepeatedly(Return(true));
672 }
673 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
674 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
675 second_capture_time_ms, _, _))
676 .Times(1)
677 .WillRepeatedly(Return(true));
678 }
679 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000680 send_bucket_->Resume();
681
terelius8b70faf2016-08-01 09:47:31 -0700682 for (size_t i = 0; i < 4; i++) {
683 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
684 clock_.AdvanceTimeMilliseconds(5);
685 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
686 send_bucket_->Process();
687 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000688
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000689 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000690}
691
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000692TEST_F(PacedSenderTest, ResendPacket) {
693 uint32_t ssrc = 12346;
694 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000695 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000696 EXPECT_EQ(0, send_bucket_->QueueInMs());
697
Peter Boströme23e7372015-10-08 11:44:14 +0200698 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
699 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000700 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200701 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
702 sequence_number + 1, capture_time_ms + 1, 250,
703 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000704 clock_.AdvanceTimeMilliseconds(9999);
705 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000706 send_bucket_->QueueInMs());
707 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200708 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
709 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000710 .Times(1)
711 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000712 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000713 send_bucket_->Process();
714
715 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000716 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000717 send_bucket_->QueueInMs());
718
719 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200720 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
721 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000722 .Times(1)
723 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200724 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
725 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000726 .Times(1)
727 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000728 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000729 send_bucket_->Process();
730
731 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000732 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000733 send_bucket_->QueueInMs());
734
735 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200736 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
737 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000738 .Times(1)
739 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000740 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000741 send_bucket_->Process();
742 EXPECT_EQ(0, send_bucket_->QueueInMs());
743}
744
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000745TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000746 uint32_t ssrc = 12346;
747 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000748 const size_t kNumPackets = 60;
749 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700750 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000751 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000752
perkjec81bcd2016-05-11 06:01:13 -0700753 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000754 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000755 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
756 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000757 }
758
perkjec81bcd2016-05-11 06:01:13 -0700759 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000760 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700761 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000762 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000763
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000764 int64_t time_start = clock_.TimeInMilliseconds();
765 while (send_bucket_->QueueSizePackets() > 0) {
766 int time_until_process = send_bucket_->TimeUntilNextProcess();
767 if (time_until_process <= 0) {
768 send_bucket_->Process();
769 } else {
770 clock_.AdvanceTimeMilliseconds(time_until_process);
771 }
772 }
773 int64_t duration = clock_.TimeInMilliseconds() - time_start;
774
775 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
776
sprang0a43fef2015-11-20 09:00:37 -0800777 // Allow for aliasing, duration should be within one pack of max time limit.
778 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700779 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000780}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000781
782TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
783 uint32_t ssrc = 12346;
784 uint16_t sequence_number = 1234;
785 EXPECT_EQ(0, send_bucket_->QueueInMs());
786
perkjec81bcd2016-05-11 06:01:13 -0700787 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000788 SendAndExpectPacket(PacedSender::kNormalPriority,
789 ssrc,
790 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000791 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000792 1200,
793 false);
794
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000795 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000796 EXPECT_EQ(500, send_bucket_->QueueInMs());
797 send_bucket_->Process();
798 EXPECT_EQ(0, send_bucket_->QueueInMs());
799}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000800
isheriffcc5903e2016-10-04 08:29:38 -0700801TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000802 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700803 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000804 uint32_t ssrc = 12346;
805 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700806
isheriffcc5903e2016-10-04 08:29:38 -0700807 PacedSenderProbing packet_sender;
philipele3b354b2017-03-28 07:59:51 -0700808 send_bucket_.reset(new PacedSender(&clock_, &packet_sender));
philipelfd58b612017-01-04 07:05:25 -0800809 send_bucket_->CreateProbeCluster(kFirstClusterBps);
810 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700811 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000812
philipelfd58b612017-01-04 07:05:25 -0800813 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200814 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
815 sequence_number++, clock_.TimeInMilliseconds(),
816 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000817 }
perkjec81bcd2016-05-11 06:01:13 -0700818
isheriffcc5903e2016-10-04 08:29:38 -0700819 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800820 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000821 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700822 clock_.AdvanceTimeMilliseconds(time_until_process);
823 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000824 }
isheriffcc5903e2016-10-04 08:29:38 -0700825 int packets_sent = packet_sender.packets_sent();
826 // Validate first cluster bitrate. Note that we have to account for number
827 // of intervals and hence (packets_sent - 1) on the first cluster.
828 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
829 (clock_.TimeInMilliseconds() - start),
830 kFirstClusterBps, kBitrateProbingError);
831 EXPECT_EQ(0, packet_sender.padding_sent());
832
sergeyu6dbbd892017-01-17 15:07:59 -0800833 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700834 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800835 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700836 int time_until_process = send_bucket_->TimeUntilNextProcess();
837 clock_.AdvanceTimeMilliseconds(time_until_process);
838 send_bucket_->Process();
839 }
840 packets_sent = packet_sender.packets_sent() - packets_sent;
841 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800842 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
843 (clock_.TimeInMilliseconds() - start),
844 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000845}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000846
isheriffcc5903e2016-10-04 08:29:38 -0700847TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200848 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700849 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200850 uint32_t ssrc = 12346;
851 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700852
853 PacedSenderProbing packet_sender;
philipele3b354b2017-03-28 07:59:51 -0700854 send_bucket_.reset(new PacedSender(&clock_, &packet_sender));
philipelfd58b612017-01-04 07:05:25 -0800855 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700856 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200857
philipelfd58b612017-01-04 07:05:25 -0800858 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200859 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
860 sequence_number++, clock_.TimeInMilliseconds(),
861 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200862 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200863
isheriffcc5903e2016-10-04 08:29:38 -0700864 int64_t start = clock_.TimeInMilliseconds();
865 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800866 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700867 int time_until_process = send_bucket_->TimeUntilNextProcess();
868 clock_.AdvanceTimeMilliseconds(time_until_process);
869 send_bucket_->Process();
870 ++process_count;
871 }
872 int packets_sent = packet_sender.packets_sent();
873 int padding_sent = packet_sender.padding_sent();
874 EXPECT_GT(packets_sent, 0);
875 EXPECT_GT(padding_sent, 0);
876 // Note that the number of intervals here for kPacketSize is
877 // packets_sent due to padding in the same cluster.
878 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
879 (clock_.TimeInMilliseconds() - start),
880 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200881}
882
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000883TEST_F(PacedSenderTest, PriorityInversion) {
884 uint32_t ssrc = 12346;
885 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000886 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000887
Peter Boströme23e7372015-10-08 11:44:14 +0200888 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000889 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200890 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000891
Peter Boströme23e7372015-10-08 11:44:14 +0200892 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000893 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200894 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000895
Peter Boströme23e7372015-10-08 11:44:14 +0200896 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
897 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000898
Peter Boströme23e7372015-10-08 11:44:14 +0200899 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
900 sequence_number + 1, clock_.TimeInMilliseconds(),
901 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000902
903 // Packets from earlier frames should be sent first.
904 {
905 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200906 EXPECT_CALL(callback_,
907 TimeToSendPacket(ssrc, sequence_number,
908 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000909 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200910 EXPECT_CALL(callback_,
911 TimeToSendPacket(ssrc, sequence_number + 1,
912 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000913 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200914 EXPECT_CALL(callback_,
915 TimeToSendPacket(ssrc, sequence_number + 3,
916 clock_.TimeInMilliseconds() + 33, true, _))
917 .WillOnce(Return(true));
918 EXPECT_CALL(callback_,
919 TimeToSendPacket(ssrc, sequence_number + 2,
920 clock_.TimeInMilliseconds() + 33, true, _))
921 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000922
923 while (send_bucket_->QueueSizePackets() > 0) {
924 int time_until_process = send_bucket_->TimeUntilNextProcess();
925 if (time_until_process <= 0) {
926 send_bucket_->Process();
927 } else {
928 clock_.AdvanceTimeMilliseconds(time_until_process);
929 }
930 }
931 }
932}
933
934TEST_F(PacedSenderTest, PaddingOveruse) {
935 uint32_t ssrc = 12346;
936 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000937 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000938
perkjec81bcd2016-05-11 06:01:13 -0700939 send_bucket_->Process();
940 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700941 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700942
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000943 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
944 clock_.TimeInMilliseconds(), kPacketSize, false);
945 send_bucket_->Process();
946
947 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700948 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000949 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700950 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000951
perkjec81bcd2016-05-11 06:01:13 -0700952 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
953 clock_.TimeInMilliseconds(), kPacketSize, false);
954 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000955 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700956 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000957 send_bucket_->Process();
958}
959
Erik Språngad113e52015-11-26 16:26:12 +0100960TEST_F(PacedSenderTest, AverageQueueTime) {
961 uint32_t ssrc = 12346;
962 uint16_t sequence_number = 1234;
963 const size_t kPacketSize = 1200;
964 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100965
perkjec81bcd2016-05-11 06:01:13 -0700966 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100967
968 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
969
970 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100971 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
972 sequence_number, first_capture_time, kPacketSize,
973 false);
Erik Språngad113e52015-11-26 16:26:12 +0100974 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100975 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100976 sequence_number + 1, clock_.TimeInMilliseconds(),
977 kPacketSize, false);
978 clock_.AdvanceTimeMilliseconds(10);
979
980 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
981
982 // Only first packet (queued for 20ms) should be removed, leave the second
983 // packet (queued for 10ms) alone in the queue.
984 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200985 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100986 .Times(1)
987 .WillRepeatedly(Return(true));
988 send_bucket_->Process();
989
990 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
991
992 clock_.AdvanceTimeMilliseconds(10);
993 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200994 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100995 .Times(1)
996 .WillRepeatedly(Return(true));
997 for (int i = 0; i < 3; ++i) {
998 clock_.AdvanceTimeMilliseconds(30); // Max delta.
999 send_bucket_->Process();
1000 }
1001
1002 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
1003}
1004
philipel1a93cde2016-06-03 01:41:45 -07001005TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +02001006 uint32_t ssrc = 12346;
1007 uint16_t sequence_number = 1234;
1008 const size_t kPacketSize = 1200;
1009
perkj71ee44c2016-06-15 00:47:53 -07001010 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001011 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -08001012 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +02001013 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1014 sequence_number + i, clock_.TimeInMilliseconds(),
1015 kPacketSize, false);
1016 }
1017
1018 // First probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001019 EXPECT_CALL(callback_,
1020 TimeToSendPacket(_, _, _, _,
1021 Field(&PacedPacketInfo::probe_cluster_id, 0)))
philipelfd58b612017-01-04 07:05:25 -08001022 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001023 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001024 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001025 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001026 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001027 }
philipel29dca2c2016-05-13 11:13:05 +02001028
1029 // Second probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001030 EXPECT_CALL(callback_,
1031 TimeToSendPacket(_, _, _, _,
1032 Field(&PacedPacketInfo::probe_cluster_id, 1)))
philipel29dca2c2016-05-13 11:13:05 +02001033 .Times(5)
1034 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001035 for (int i = 0; i < 5; ++i) {
1036 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001037 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001038 }
philipel29dca2c2016-05-13 11:13:05 +02001039
philipelc7bf32a2017-02-17 03:59:43 -08001040 // Needed for the Field comparer below.
1041 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
philipel29dca2c2016-05-13 11:13:05 +02001042 // No more probing packets.
philipelc7bf32a2017-02-17 03:59:43 -08001043 EXPECT_CALL(callback_,
1044 TimeToSendPadding(
1045 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1046 .Times(1)
1047 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001048 send_bucket_->Process();
1049}
1050
philipelb61927c2017-02-28 07:05:23 -08001051TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
1052 uint32_t ssrc = 12346;
1053 uint16_t sequence_number = 1234;
1054 const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
1055
1056 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
1057 send_bucket_->SetProbingEnabled(true);
1058 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1059 sequence_number, clock_.TimeInMilliseconds(),
1060 kPacketSize, false);
1061
1062 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
1063 .WillOnce(Return(true));
1064 send_bucket_->Process();
1065 EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
1066 clock_.AdvanceTimeMilliseconds(9);
1067
1068 EXPECT_CALL(callback_, TimeToSendPadding(_, _))
1069 .Times(2)
1070 .WillRepeatedly(Return(0));
1071 send_bucket_->Process();
1072 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
1073 clock_.AdvanceTimeMilliseconds(1);
1074 send_bucket_->Process();
1075 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
1076}
1077
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001078} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001079} // namespace webrtc