blob: cc4769e66761170e879200ba6ad360cb6afe78a7 [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.
perkjec81bcd2016-05-11 06:01:13 -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;
perkjec81bcd2016-05-11 06:01:13 -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);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000637 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800638 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000639 }
terelius8b70faf2016-08-01 09:47:31 -0700640
stefan099110c2017-02-01 03:57:42 -0800641 // Expect high prio packets to come out first followed by normal
642 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700643 {
644 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800645 EXPECT_CALL(callback_,
646 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
647 .Times(packets_to_send_per_interval)
648 .WillRepeatedly(Return(true));
649 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
650 second_capture_time_ms, _, _))
651 .Times(packets_to_send_per_interval)
652 .WillRepeatedly(Return(true));
653
terelius8b70faf2016-08-01 09:47:31 -0700654 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
655 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
656 .Times(1)
657 .WillRepeatedly(Return(true));
658 }
659 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
660 EXPECT_CALL(callback_,
661 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
662 .Times(1)
663 .WillRepeatedly(Return(true));
664 }
665 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
666 EXPECT_CALL(callback_,
667 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
668 .Times(1)
669 .WillRepeatedly(Return(true));
670 }
671 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
672 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
673 second_capture_time_ms, _, _))
674 .Times(1)
675 .WillRepeatedly(Return(true));
676 }
677 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000678 send_bucket_->Resume();
679
terelius8b70faf2016-08-01 09:47:31 -0700680 for (size_t i = 0; i < 4; i++) {
681 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
682 clock_.AdvanceTimeMilliseconds(5);
683 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
684 send_bucket_->Process();
685 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000686
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000687 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000688}
689
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000690TEST_F(PacedSenderTest, ResendPacket) {
691 uint32_t ssrc = 12346;
692 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000693 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000694 EXPECT_EQ(0, send_bucket_->QueueInMs());
695
Peter Boströme23e7372015-10-08 11:44:14 +0200696 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
697 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000698 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200699 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
700 sequence_number + 1, capture_time_ms + 1, 250,
701 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000702 clock_.AdvanceTimeMilliseconds(9999);
703 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000704 send_bucket_->QueueInMs());
705 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200706 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
707 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000708 .Times(1)
709 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000710 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000711 send_bucket_->Process();
712
713 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000714 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000715 send_bucket_->QueueInMs());
716
717 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200718 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
719 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000720 .Times(1)
721 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200722 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
723 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000724 .Times(1)
725 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000726 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000727 send_bucket_->Process();
728
729 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000730 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000731 send_bucket_->QueueInMs());
732
733 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200734 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
735 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000736 .Times(1)
737 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000738 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000739 send_bucket_->Process();
740 EXPECT_EQ(0, send_bucket_->QueueInMs());
741}
742
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000743TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000744 uint32_t ssrc = 12346;
745 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000746 const size_t kNumPackets = 60;
747 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700748 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000749 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000750
perkjec81bcd2016-05-11 06:01:13 -0700751 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000752 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000753 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
754 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000755 }
756
perkjec81bcd2016-05-11 06:01:13 -0700757 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000758 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700759 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000760 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000761
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000762 int64_t time_start = clock_.TimeInMilliseconds();
763 while (send_bucket_->QueueSizePackets() > 0) {
764 int time_until_process = send_bucket_->TimeUntilNextProcess();
765 if (time_until_process <= 0) {
766 send_bucket_->Process();
767 } else {
768 clock_.AdvanceTimeMilliseconds(time_until_process);
769 }
770 }
771 int64_t duration = clock_.TimeInMilliseconds() - time_start;
772
773 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
774
sprang0a43fef2015-11-20 09:00:37 -0800775 // Allow for aliasing, duration should be within one pack of max time limit.
776 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700777 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000778}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000779
780TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
781 uint32_t ssrc = 12346;
782 uint16_t sequence_number = 1234;
783 EXPECT_EQ(0, send_bucket_->QueueInMs());
784
perkjec81bcd2016-05-11 06:01:13 -0700785 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000786 SendAndExpectPacket(PacedSender::kNormalPriority,
787 ssrc,
788 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000789 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000790 1200,
791 false);
792
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000793 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000794 EXPECT_EQ(500, send_bucket_->QueueInMs());
795 send_bucket_->Process();
796 EXPECT_EQ(0, send_bucket_->QueueInMs());
797}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000798
isheriffcc5903e2016-10-04 08:29:38 -0700799TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000800 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700801 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000802 uint32_t ssrc = 12346;
803 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700804
isheriffcc5903e2016-10-04 08:29:38 -0700805 PacedSenderProbing packet_sender;
806 send_bucket_.reset(new PacedSender(&clock_, &packet_sender));
philipelfd58b612017-01-04 07:05:25 -0800807 send_bucket_->CreateProbeCluster(kFirstClusterBps);
808 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700809 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000810
philipelfd58b612017-01-04 07:05:25 -0800811 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200812 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
813 sequence_number++, clock_.TimeInMilliseconds(),
814 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000815 }
perkjec81bcd2016-05-11 06:01:13 -0700816
isheriffcc5903e2016-10-04 08:29:38 -0700817 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800818 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000819 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700820 clock_.AdvanceTimeMilliseconds(time_until_process);
821 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000822 }
isheriffcc5903e2016-10-04 08:29:38 -0700823 int packets_sent = packet_sender.packets_sent();
824 // Validate first cluster bitrate. Note that we have to account for number
825 // of intervals and hence (packets_sent - 1) on the first cluster.
826 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
827 (clock_.TimeInMilliseconds() - start),
828 kFirstClusterBps, kBitrateProbingError);
829 EXPECT_EQ(0, packet_sender.padding_sent());
830
sergeyu6dbbd892017-01-17 15:07:59 -0800831 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700832 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800833 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700834 int time_until_process = send_bucket_->TimeUntilNextProcess();
835 clock_.AdvanceTimeMilliseconds(time_until_process);
836 send_bucket_->Process();
837 }
838 packets_sent = packet_sender.packets_sent() - packets_sent;
839 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800840 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
841 (clock_.TimeInMilliseconds() - start),
842 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000843}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000844
isheriffcc5903e2016-10-04 08:29:38 -0700845TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200846 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700847 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200848 uint32_t ssrc = 12346;
849 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700850
851 PacedSenderProbing packet_sender;
852 send_bucket_.reset(new PacedSender(&clock_, &packet_sender));
philipelfd58b612017-01-04 07:05:25 -0800853 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700854 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200855
philipelfd58b612017-01-04 07:05:25 -0800856 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200857 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
858 sequence_number++, clock_.TimeInMilliseconds(),
859 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200860 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200861
isheriffcc5903e2016-10-04 08:29:38 -0700862 int64_t start = clock_.TimeInMilliseconds();
863 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800864 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700865 int time_until_process = send_bucket_->TimeUntilNextProcess();
866 clock_.AdvanceTimeMilliseconds(time_until_process);
867 send_bucket_->Process();
868 ++process_count;
869 }
870 int packets_sent = packet_sender.packets_sent();
871 int padding_sent = packet_sender.padding_sent();
872 EXPECT_GT(packets_sent, 0);
873 EXPECT_GT(padding_sent, 0);
874 // Note that the number of intervals here for kPacketSize is
875 // packets_sent due to padding in the same cluster.
876 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
877 (clock_.TimeInMilliseconds() - start),
878 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200879}
880
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000881TEST_F(PacedSenderTest, PriorityInversion) {
882 uint32_t ssrc = 12346;
883 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000884 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000885
Peter Boströme23e7372015-10-08 11:44:14 +0200886 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000887 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200888 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000889
Peter Boströme23e7372015-10-08 11:44:14 +0200890 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000891 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200892 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000893
Peter Boströme23e7372015-10-08 11:44:14 +0200894 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
895 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000896
Peter Boströme23e7372015-10-08 11:44:14 +0200897 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
898 sequence_number + 1, clock_.TimeInMilliseconds(),
899 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000900
901 // Packets from earlier frames should be sent first.
902 {
903 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200904 EXPECT_CALL(callback_,
905 TimeToSendPacket(ssrc, sequence_number,
906 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000907 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200908 EXPECT_CALL(callback_,
909 TimeToSendPacket(ssrc, sequence_number + 1,
910 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000911 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200912 EXPECT_CALL(callback_,
913 TimeToSendPacket(ssrc, sequence_number + 3,
914 clock_.TimeInMilliseconds() + 33, true, _))
915 .WillOnce(Return(true));
916 EXPECT_CALL(callback_,
917 TimeToSendPacket(ssrc, sequence_number + 2,
918 clock_.TimeInMilliseconds() + 33, true, _))
919 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000920
921 while (send_bucket_->QueueSizePackets() > 0) {
922 int time_until_process = send_bucket_->TimeUntilNextProcess();
923 if (time_until_process <= 0) {
924 send_bucket_->Process();
925 } else {
926 clock_.AdvanceTimeMilliseconds(time_until_process);
927 }
928 }
929 }
930}
931
932TEST_F(PacedSenderTest, PaddingOveruse) {
933 uint32_t ssrc = 12346;
934 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000935 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000936
perkjec81bcd2016-05-11 06:01:13 -0700937 send_bucket_->Process();
938 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700939 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700940
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000941 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
942 clock_.TimeInMilliseconds(), kPacketSize, false);
943 send_bucket_->Process();
944
945 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700946 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000947 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700948 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000949
perkjec81bcd2016-05-11 06:01:13 -0700950 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
951 clock_.TimeInMilliseconds(), kPacketSize, false);
952 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000953 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700954 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000955 send_bucket_->Process();
956}
957
Erik Språngad113e52015-11-26 16:26:12 +0100958TEST_F(PacedSenderTest, AverageQueueTime) {
959 uint32_t ssrc = 12346;
960 uint16_t sequence_number = 1234;
961 const size_t kPacketSize = 1200;
962 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100963
perkjec81bcd2016-05-11 06:01:13 -0700964 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100965
966 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
967
968 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100969 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
970 sequence_number, first_capture_time, kPacketSize,
971 false);
Erik Språngad113e52015-11-26 16:26:12 +0100972 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100973 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100974 sequence_number + 1, clock_.TimeInMilliseconds(),
975 kPacketSize, false);
976 clock_.AdvanceTimeMilliseconds(10);
977
978 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
979
980 // Only first packet (queued for 20ms) should be removed, leave the second
981 // packet (queued for 10ms) alone in the queue.
982 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200983 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100984 .Times(1)
985 .WillRepeatedly(Return(true));
986 send_bucket_->Process();
987
988 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
989
990 clock_.AdvanceTimeMilliseconds(10);
991 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200992 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100993 .Times(1)
994 .WillRepeatedly(Return(true));
995 for (int i = 0; i < 3; ++i) {
996 clock_.AdvanceTimeMilliseconds(30); // Max delta.
997 send_bucket_->Process();
998 }
999
1000 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
1001}
1002
philipel1a93cde2016-06-03 01:41:45 -07001003TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +02001004 uint32_t ssrc = 12346;
1005 uint16_t sequence_number = 1234;
1006 const size_t kPacketSize = 1200;
1007
perkj71ee44c2016-06-15 00:47:53 -07001008 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001009 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -08001010 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +02001011 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1012 sequence_number + i, clock_.TimeInMilliseconds(),
1013 kPacketSize, false);
1014 }
1015
1016 // First probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001017 EXPECT_CALL(callback_,
1018 TimeToSendPacket(_, _, _, _,
1019 Field(&PacedPacketInfo::probe_cluster_id, 0)))
philipelfd58b612017-01-04 07:05:25 -08001020 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001021 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001022 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001023 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001024 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001025 }
philipel29dca2c2016-05-13 11:13:05 +02001026
1027 // Second probing cluster.
philipelc7bf32a2017-02-17 03:59:43 -08001028 EXPECT_CALL(callback_,
1029 TimeToSendPacket(_, _, _, _,
1030 Field(&PacedPacketInfo::probe_cluster_id, 1)))
philipel29dca2c2016-05-13 11:13:05 +02001031 .Times(5)
1032 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001033 for (int i = 0; i < 5; ++i) {
1034 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001035 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001036 }
philipel29dca2c2016-05-13 11:13:05 +02001037
philipelc7bf32a2017-02-17 03:59:43 -08001038 // Needed for the Field comparer below.
1039 const int kNotAProbe = PacedPacketInfo::kNotAProbe;
philipel29dca2c2016-05-13 11:13:05 +02001040 // No more probing packets.
philipelc7bf32a2017-02-17 03:59:43 -08001041 EXPECT_CALL(callback_,
1042 TimeToSendPadding(
1043 _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
1044 .Times(1)
1045 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001046 send_bucket_->Process();
1047}
1048
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001049} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001050} // namespace webrtc