blob: c1421a57c15160d55c5dacc2b17f598ce1b4e894 [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::_;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000020using testing::Return;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000021
isheriffcc5903e2016-10-04 08:29:38 -070022namespace {
23constexpr unsigned kFirstClusterBps = 900000;
isheriffcc5903e2016-10-04 08:29:38 -070024constexpr unsigned kSecondClusterBps = 1800000;
isheriffcc5903e2016-10-04 08:29:38 -070025
26// The error stems from truncating the time interval of probe packets to integer
27// values. This results in probing slightly higher than the target bitrate.
28// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
29constexpr int kBitrateProbingError = 150000;
30} // namespace
31
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000032namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000033namespace test {
34
perkjec81bcd2016-05-11 06:01:13 -070035static const int kTargetBitrateBps = 800000;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000036
perkjec81bcd2016-05-11 06:01:13 -070037class MockPacedSenderCallback : public PacedSender::PacketSender {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000038 public:
philipel29dca2c2016-05-13 11:13:05 +020039 MOCK_METHOD5(TimeToSendPacket,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000040 bool(uint32_t ssrc,
41 uint16_t sequence_number,
42 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020043 bool retransmission,
44 int probe_cluster_id));
philipela1ed0b32016-06-01 06:31:17 -070045 MOCK_METHOD2(TimeToSendPadding, size_t(size_t bytes, int probe_cluster_id));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000046};
47
perkjec81bcd2016-05-11 06:01:13 -070048class PacedSenderPadding : public PacedSender::PacketSender {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000049 public:
50 PacedSenderPadding() : padding_sent_(0) {}
51
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000052 bool TimeToSendPacket(uint32_t ssrc,
53 uint16_t sequence_number,
54 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020055 bool retransmission,
56 int probe_cluster_id) override {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000057 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000058 }
59
philipela1ed0b32016-06-01 06:31:17 -070060 size_t TimeToSendPadding(size_t bytes, int probe_cluster_id) override {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000061 const size_t kPaddingPacketSize = 224;
62 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000063 padding_sent_ += kPaddingPacketSize * num_packets;
64 return kPaddingPacketSize * num_packets;
65 }
66
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000067 size_t padding_sent() { return padding_sent_; }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000068
69 private:
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000070 size_t padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000071};
72
perkjec81bcd2016-05-11 06:01:13 -070073class PacedSenderProbing : public PacedSender::PacketSender {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000074 public:
isheriffcc5903e2016-10-04 08:29:38 -070075 PacedSenderProbing() : packets_sent_(0), padding_sent_(0) {}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000076
77 bool TimeToSendPacket(uint32_t ssrc,
78 uint16_t sequence_number,
79 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020080 bool retransmission,
81 int probe_cluster_id) override {
isheriffcc5903e2016-10-04 08:29:38 -070082 packets_sent_++;
Stefan Holmer01b48882015-05-05 10:21:24 +020083 return true;
84 }
85
philipela1ed0b32016-06-01 06:31:17 -070086 size_t TimeToSendPadding(size_t bytes, int probe_cluster_id) override {
isheriffcc5903e2016-10-04 08:29:38 -070087 padding_sent_ += bytes;
88 return padding_sent_;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000089 }
90
91 int packets_sent() const { return packets_sent_; }
92
isheriffcc5903e2016-10-04 08:29:38 -070093 int padding_sent() const { return padding_sent_; }
94
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000095 private:
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000096 int packets_sent_;
isheriffcc5903e2016-10-04 08:29:38 -070097 int padding_sent_;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000098};
99
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000100class PacedSenderTest : public ::testing::Test {
101 protected:
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000102 PacedSenderTest() : clock_(123456) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000103 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000104 // Need to initialize PacedSender after we initialize clock.
perkjec81bcd2016-05-11 06:01:13 -0700105 send_bucket_.reset(new PacedSender(&clock_, &callback_));
philipelfd58b612017-01-04 07:05:25 -0800106 send_bucket_->CreateProbeCluster(kFirstClusterBps);
107 send_bucket_->CreateProbeCluster(kSecondClusterBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000108 // Default to bitrate probing disabled for testing purposes. Probing tests
109 // have to enable probing, either by creating a new PacedSender instance or
110 // by calling SetProbingEnabled(true).
111 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700112 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
113
114 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000115 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000116
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000117 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000118 uint32_t ssrc,
119 uint16_t sequence_number,
120 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000121 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000122 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200123 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
124 size, retransmission);
philipel29dca2c2016-05-13 11:13:05 +0200125 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
tereliusf39f7d92016-07-20 03:36:19 -0700126 capture_time_ms, retransmission, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000127 .Times(1)
128 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000129 }
130
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000131 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000132 MockPacedSenderCallback callback_;
kwiberg22feaa32016-03-17 09:17:43 -0700133 std::unique_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000134};
135
136TEST_F(PacedSenderTest, QueuePacket) {
137 uint32_t ssrc = 12345;
138 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700139 // Due to the multiplicative factor we can send 5 packets during a send
140 // interval. (network capacity * multiplier / (8 bits per byte *
141 // (packet size * #send intervals per second)
142 const size_t packets_to_send =
143 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
144 for (size_t i = 0; i < packets_to_send; ++i) {
145 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
146 clock_.TimeInMilliseconds(), 250, false);
147 }
148
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000149 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200150 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
151 sequence_number, queued_packet_timestamp, 250,
152 false);
perkjec81bcd2016-05-11 06:01:13 -0700153 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000154 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000155 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
philipela1ed0b32016-06-01 06:31:17 -0700156 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000157 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000158 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000159 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000160 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700161 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200162 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
163 queued_packet_timestamp, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000164 .Times(1)
165 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000166 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000167 sequence_number++;
perkjec81bcd2016-05-11 06:01:13 -0700168 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
169
170 // We can send packets_to_send -1 packets of size 250 during the current
171 // interval since one packet has already been sent.
172 for (size_t i = 0; i < packets_to_send - 1; ++i) {
173 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
174 clock_.TimeInMilliseconds(), 250, false);
175 }
Peter Boströme23e7372015-10-08 11:44:14 +0200176 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
177 sequence_number++, clock_.TimeInMilliseconds(),
178 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700179 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000180 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700181 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000182}
183
184TEST_F(PacedSenderTest, PaceQueuedPackets) {
185 uint32_t ssrc = 12345;
186 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000187
perkjec81bcd2016-05-11 06:01:13 -0700188 // Due to the multiplicative factor we can send 5 packets during a send
189 // interval. (network capacity * multiplier / (8 bits per byte *
190 // (packet size * #send intervals per second)
191 const size_t packets_to_send_per_interval =
192 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
193 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
194 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
195 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000196 }
perkjec81bcd2016-05-11 06:01:13 -0700197
198 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200199 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
200 sequence_number++, clock_.TimeInMilliseconds(),
201 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000202 }
perkjec81bcd2016-05-11 06:01:13 -0700203 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
204 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000205 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700206 EXPECT_EQ(packets_to_send_per_interval * 10,
207 send_bucket_->QueueSizePackets());
philipela1ed0b32016-06-01 06:31:17 -0700208 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000209 for (int k = 0; k < 10; ++k) {
210 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000211 clock_.AdvanceTimeMilliseconds(5);
philipel29dca2c2016-05-13 11:13:05 +0200212 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700213 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000214 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000215 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800216 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000217 }
perkjec81bcd2016-05-11 06:01:13 -0700218 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000219 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000220 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000221 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700222 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800223 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700224
225 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
226 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
227 clock_.TimeInMilliseconds(), 250, false);
228 }
Peter Boströme23e7372015-10-08 11:44:14 +0200229 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
230 sequence_number, clock_.TimeInMilliseconds(), 250,
231 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000232 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700233 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000234}
235
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000236TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
237 uint32_t ssrc = 12345;
238 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000239 uint16_t queued_sequence_number;
240
perkjec81bcd2016-05-11 06:01:13 -0700241 // Due to the multiplicative factor we can send 5 packets during a send
242 // interval. (network capacity * multiplier / (8 bits per byte *
243 // (packet size * #send intervals per second)
244 const size_t packets_to_send_per_interval =
245 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
246 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
247 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
248 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000249 }
250 queued_sequence_number = sequence_number;
251
perkjec81bcd2016-05-11 06:01:13 -0700252 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000253 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200254 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
255 sequence_number, clock_.TimeInMilliseconds(),
256 250, false);
257 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
258 sequence_number++, clock_.TimeInMilliseconds(),
259 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000260 }
philipela1ed0b32016-06-01 06:31:17 -0700261 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000262 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000263 for (int k = 0; k < 10; ++k) {
264 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000265 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000266
perkjec81bcd2016-05-11 06:01:13 -0700267 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000268 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200269 TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000270 .Times(1)
271 .WillRepeatedly(Return(true));
jbauchd2a22962016-02-08 23:18:25 -0800272 }
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000273 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800274 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000275 }
276 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000277 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000278 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800279 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700280
281 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
282 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
283 clock_.TimeInMilliseconds(), 250, false);
284 }
Peter Boströme23e7372015-10-08 11:44:14 +0200285 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
286 sequence_number++, clock_.TimeInMilliseconds(),
287 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000288 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700289 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000290}
291
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000292TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
293 uint32_t ssrc = 12345;
294 uint16_t sequence_number = 1234;
295
296 SendAndExpectPacket(PacedSender::kNormalPriority,
297 ssrc,
298 sequence_number,
299 clock_.TimeInMilliseconds(),
300 250,
301 false);
302
303 // Expect packet on second ssrc to be queued and sent as well.
304 SendAndExpectPacket(PacedSender::kNormalPriority,
305 ssrc + 1,
306 sequence_number,
307 clock_.TimeInMilliseconds(),
308 250,
309 false);
310
311 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000312 send_bucket_->Process();
313}
314
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000315TEST_F(PacedSenderTest, Padding) {
316 uint32_t ssrc = 12345;
317 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000318
perkjec81bcd2016-05-11 06:01:13 -0700319 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700320 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700321
322 // Due to the multiplicative factor we can send 5 packets during a send
323 // interval. (network capacity * multiplier / (8 bits per byte *
324 // (packet size * #send intervals per second)
325 const size_t packets_to_send_per_interval =
326 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
327 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
328 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
329 clock_.TimeInMilliseconds(), 250, false);
330 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000331 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700332 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700333 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
334 send_bucket_->Process();
335 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
336
337 // 5 milliseconds later should not send padding since we filled the buffers
338 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700339 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000340 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000341 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000342 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800343 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000344
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000345 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700346 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
347 .Times(1)
348 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000349 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000350 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000351 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800352 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000353}
354
perkj71ee44c2016-06-15 00:47:53 -0700355TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
356 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
357 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
358
359 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
360 send_bucket_->Process();
361 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
362
363 send_bucket_->Process();
364 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
365
366 uint32_t ssrc = 12345;
367 uint16_t sequence_number = 1234;
368 int64_t capture_time_ms = 56789;
369
370 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
371 capture_time_ms, 250, false);
372 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
373 .Times(1)
374 .WillOnce(Return(250));
375 send_bucket_->Process();
376}
377
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000378TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
379 uint32_t ssrc = 12345;
380 uint16_t sequence_number = 1234;
381 int64_t capture_time_ms = 56789;
382 const int kTimeStep = 5;
383 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700384 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700385 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700386
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000387 int64_t start_time = clock_.TimeInMilliseconds();
388 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000389 SendAndExpectPacket(PacedSender::kNormalPriority,
390 ssrc,
391 sequence_number++,
392 capture_time_ms,
393 250,
394 false);
philipela1ed0b32016-06-01 06:31:17 -0700395 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
396 .Times(1)
397 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000398 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700399 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000400 }
401}
402
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000403TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
404 uint32_t ssrc = 12345;
405 uint16_t sequence_number = 1234;
406 int64_t capture_time_ms = 56789;
407 const int kTimeStep = 5;
408 const int64_t kBitrateWindow = 10000;
409 PacedSenderPadding callback;
perkjec81bcd2016-05-11 06:01:13 -0700410 send_bucket_.reset(new PacedSender(&clock_, &callback));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000411 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700412 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700413
414 send_bucket_->SetSendBitrateLimits(
415 0 /*allocated_bitrate_bps*/,
416 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700417
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000418 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000419 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000420 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800421 int rand_value = rand(); // NOLINT (rand_r instead of rand)
422 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200423 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
424 sequence_number++, capture_time_ms,
425 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000426 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000427 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000428 send_bucket_->Process();
429 }
perkjec81bcd2016-05-11 06:01:13 -0700430 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000431 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700432 kBitrateWindow),
433 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000434}
435
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000436TEST_F(PacedSenderTest, Priority) {
437 uint32_t ssrc_low_priority = 12345;
438 uint32_t ssrc = 12346;
439 uint16_t sequence_number = 1234;
440 int64_t capture_time_ms = 56789;
441 int64_t capture_time_ms_low_priority = 1234567;
442
perkjec81bcd2016-05-11 06:01:13 -0700443 // Due to the multiplicative factor we can send 5 packets during a send
444 // interval. (network capacity * multiplier / (8 bits per byte *
445 // (packet size * #send intervals per second)
446 const size_t packets_to_send_per_interval =
447 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
448 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
449 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
450 clock_.TimeInMilliseconds(), 250, false);
451 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000452 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700453 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000454
455 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200456 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
457 sequence_number++, capture_time_ms_low_priority,
458 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700459
460 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
461 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
462 sequence_number++, capture_time_ms, 250, false);
463 }
Peter Boströme23e7372015-10-08 11:44:14 +0200464 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
465 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000466
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000467 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700468 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200469 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700470 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000471 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000472
473 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000474 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000475 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800476 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700477 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000478
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000479 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200480 TimeToSendPacket(ssrc_low_priority, _,
481 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000482 .Times(1)
483 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000484
485 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000486 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000487 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800488 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000489}
490
tereliusf39f7d92016-07-20 03:36:19 -0700491TEST_F(PacedSenderTest, RetransmissionPriority) {
492 uint32_t ssrc = 12345;
493 uint16_t sequence_number = 1234;
494 int64_t capture_time_ms = 45678;
495 int64_t capture_time_ms_retransmission = 56789;
496
497 // Due to the multiplicative factor we can send 5 packets during a send
498 // interval. (network capacity * multiplier / (8 bits per byte *
499 // (packet size * #send intervals per second)
500 const size_t packets_to_send_per_interval =
501 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
502 send_bucket_->Process();
503 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
504
505 // Alternate retransmissions and normal packets.
506 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
507 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
508 sequence_number++,
509 capture_time_ms_retransmission, 250, true);
510 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
511 sequence_number++, capture_time_ms, 250, false);
512 }
513 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
514
515 // Expect all retransmissions to be sent out first despite having a later
516 // capture time.
517 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
518 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
519 EXPECT_CALL(callback_, TimeToSendPacket(
520 ssrc, _, capture_time_ms_retransmission, true, _))
521 .Times(packets_to_send_per_interval)
522 .WillRepeatedly(Return(true));
523
524 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
525 clock_.AdvanceTimeMilliseconds(5);
526 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
527 send_bucket_->Process();
528 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
529
530 // Expect the remaining (non-retransmission) packets to be sent.
531 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
532 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
533 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
534 .Times(packets_to_send_per_interval)
535 .WillRepeatedly(Return(true));
536
537 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
538 clock_.AdvanceTimeMilliseconds(5);
539 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
540 send_bucket_->Process();
541
542 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
543}
544
Stefan Holmerc482eb32015-12-16 16:55:03 +0100545TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
546 uint32_t ssrc = 12346;
547 uint16_t sequence_number = 1234;
548 int64_t capture_time_ms = 56789;
549
550 // As high prio packets doesn't affect the budget, we should be able to send
551 // a high number of them at once.
552 for (int i = 0; i < 25; ++i) {
553 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
554 capture_time_ms, 250, false);
555 }
556 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700557 // Low prio packets does affect the budget.
558 // Due to the multiplicative factor we can send 5 packets during a send
559 // interval. (network capacity * multiplier / (8 bits per byte *
560 // (packet size * #send intervals per second)
561 const size_t packets_to_send_per_interval =
562 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
563 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100564 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700565 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100566 }
567 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
568 capture_time_ms, 250, false);
569 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
570 clock_.AdvanceTimeMilliseconds(5);
571 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700572 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200573 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
574 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700575 .Times(1)
576 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100577 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
578 clock_.AdvanceTimeMilliseconds(5);
579 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700580 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100581}
582
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000583TEST_F(PacedSenderTest, Pause) {
584 uint32_t ssrc_low_priority = 12345;
585 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700586 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000587 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000588 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000589
590 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000591
perkjec81bcd2016-05-11 06:01:13 -0700592 // Due to the multiplicative factor we can send 5 packets during a send
593 // interval. (network capacity * multiplier / (8 bits per byte *
594 // (packet size * #send intervals per second)
595 const size_t packets_to_send_per_interval =
596 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
597 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
598 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
599 clock_.TimeInMilliseconds(), 250, false);
600 }
601
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000602 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000603
604 send_bucket_->Pause();
605
terelius8b70faf2016-08-01 09:47:31 -0700606 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
607 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
608 sequence_number++, capture_time_ms, 250, false);
609 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
610 sequence_number++, capture_time_ms, 250, false);
611 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
612 sequence_number++, capture_time_ms, 250, false);
613 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000614 clock_.AdvanceTimeMilliseconds(10000);
615 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700616 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
617 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
618 sequence_number++, second_capture_time_ms, 250,
619 false);
620 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
621 sequence_number++, second_capture_time_ms, 250,
622 false);
623 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
624 sequence_number++, second_capture_time_ms, 250,
625 false);
626 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000627
628 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700629 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000630 send_bucket_->QueueInMs());
631
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000632 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000633 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000634 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800635 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000636 }
terelius8b70faf2016-08-01 09:47:31 -0700637
stefan099110c2017-02-01 03:57:42 -0800638 // Expect high prio packets to come out first followed by normal
639 // prio packets and low prio packets (all in capture order).
terelius8b70faf2016-08-01 09:47:31 -0700640 {
641 ::testing::InSequence sequence;
stefan099110c2017-02-01 03:57:42 -0800642 EXPECT_CALL(callback_,
643 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
644 .Times(packets_to_send_per_interval)
645 .WillRepeatedly(Return(true));
646 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
647 second_capture_time_ms, _, _))
648 .Times(packets_to_send_per_interval)
649 .WillRepeatedly(Return(true));
650
terelius8b70faf2016-08-01 09:47:31 -0700651 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
652 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
653 .Times(1)
654 .WillRepeatedly(Return(true));
655 }
656 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
657 EXPECT_CALL(callback_,
658 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
659 .Times(1)
660 .WillRepeatedly(Return(true));
661 }
662 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
663 EXPECT_CALL(callback_,
664 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
665 .Times(1)
666 .WillRepeatedly(Return(true));
667 }
668 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
669 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
670 second_capture_time_ms, _, _))
671 .Times(1)
672 .WillRepeatedly(Return(true));
673 }
674 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000675 send_bucket_->Resume();
676
terelius8b70faf2016-08-01 09:47:31 -0700677 for (size_t i = 0; i < 4; i++) {
678 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
679 clock_.AdvanceTimeMilliseconds(5);
680 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
681 send_bucket_->Process();
682 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000683
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000684 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000685}
686
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000687TEST_F(PacedSenderTest, ResendPacket) {
688 uint32_t ssrc = 12346;
689 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000690 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000691 EXPECT_EQ(0, send_bucket_->QueueInMs());
692
Peter Boströme23e7372015-10-08 11:44:14 +0200693 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
694 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000695 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200696 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
697 sequence_number + 1, capture_time_ms + 1, 250,
698 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000699 clock_.AdvanceTimeMilliseconds(9999);
700 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000701 send_bucket_->QueueInMs());
702 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200703 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
704 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000705 .Times(1)
706 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000707 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000708 send_bucket_->Process();
709
710 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000711 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000712 send_bucket_->QueueInMs());
713
714 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200715 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
716 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000717 .Times(1)
718 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200719 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
720 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000721 .Times(1)
722 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000723 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000724 send_bucket_->Process();
725
726 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000727 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000728 send_bucket_->QueueInMs());
729
730 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200731 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
732 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000733 .Times(1)
734 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000735 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000736 send_bucket_->Process();
737 EXPECT_EQ(0, send_bucket_->QueueInMs());
738}
739
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000740TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000741 uint32_t ssrc = 12346;
742 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000743 const size_t kNumPackets = 60;
744 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700745 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000746 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000747
perkjec81bcd2016-05-11 06:01:13 -0700748 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000749 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000750 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
751 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000752 }
753
perkjec81bcd2016-05-11 06:01:13 -0700754 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000755 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700756 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000757 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000758
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000759 int64_t time_start = clock_.TimeInMilliseconds();
760 while (send_bucket_->QueueSizePackets() > 0) {
761 int time_until_process = send_bucket_->TimeUntilNextProcess();
762 if (time_until_process <= 0) {
763 send_bucket_->Process();
764 } else {
765 clock_.AdvanceTimeMilliseconds(time_until_process);
766 }
767 }
768 int64_t duration = clock_.TimeInMilliseconds() - time_start;
769
770 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
771
sprang0a43fef2015-11-20 09:00:37 -0800772 // Allow for aliasing, duration should be within one pack of max time limit.
773 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700774 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000775}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000776
777TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
778 uint32_t ssrc = 12346;
779 uint16_t sequence_number = 1234;
780 EXPECT_EQ(0, send_bucket_->QueueInMs());
781
perkjec81bcd2016-05-11 06:01:13 -0700782 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000783 SendAndExpectPacket(PacedSender::kNormalPriority,
784 ssrc,
785 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000786 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000787 1200,
788 false);
789
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000790 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000791 EXPECT_EQ(500, send_bucket_->QueueInMs());
792 send_bucket_->Process();
793 EXPECT_EQ(0, send_bucket_->QueueInMs());
794}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000795
isheriffcc5903e2016-10-04 08:29:38 -0700796TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000797 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700798 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000799 uint32_t ssrc = 12346;
800 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700801
isheriffcc5903e2016-10-04 08:29:38 -0700802 PacedSenderProbing packet_sender;
803 send_bucket_.reset(new PacedSender(&clock_, &packet_sender));
philipelfd58b612017-01-04 07:05:25 -0800804 send_bucket_->CreateProbeCluster(kFirstClusterBps);
805 send_bucket_->CreateProbeCluster(kSecondClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700806 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000807
philipelfd58b612017-01-04 07:05:25 -0800808 for (int i = 0; i < 10; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200809 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
810 sequence_number++, clock_.TimeInMilliseconds(),
811 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000812 }
perkjec81bcd2016-05-11 06:01:13 -0700813
isheriffcc5903e2016-10-04 08:29:38 -0700814 int64_t start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800815 while (packet_sender.packets_sent() < 5) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000816 int time_until_process = send_bucket_->TimeUntilNextProcess();
isheriffcc5903e2016-10-04 08:29:38 -0700817 clock_.AdvanceTimeMilliseconds(time_until_process);
818 send_bucket_->Process();
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000819 }
isheriffcc5903e2016-10-04 08:29:38 -0700820 int packets_sent = packet_sender.packets_sent();
821 // Validate first cluster bitrate. Note that we have to account for number
822 // of intervals and hence (packets_sent - 1) on the first cluster.
823 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
824 (clock_.TimeInMilliseconds() - start),
825 kFirstClusterBps, kBitrateProbingError);
826 EXPECT_EQ(0, packet_sender.padding_sent());
827
sergeyu6dbbd892017-01-17 15:07:59 -0800828 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
isheriffcc5903e2016-10-04 08:29:38 -0700829 start = clock_.TimeInMilliseconds();
philipelfd58b612017-01-04 07:05:25 -0800830 while (packet_sender.packets_sent() < 10) {
isheriffcc5903e2016-10-04 08:29:38 -0700831 int time_until_process = send_bucket_->TimeUntilNextProcess();
832 clock_.AdvanceTimeMilliseconds(time_until_process);
833 send_bucket_->Process();
834 }
835 packets_sent = packet_sender.packets_sent() - packets_sent;
836 // Validate second cluster bitrate.
sergeyu6dbbd892017-01-17 15:07:59 -0800837 EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
838 (clock_.TimeInMilliseconds() - start),
839 kSecondClusterBps, kBitrateProbingError);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000840}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000841
isheriffcc5903e2016-10-04 08:29:38 -0700842TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
Stefan Holmer01b48882015-05-05 10:21:24 +0200843 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700844 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200845 uint32_t ssrc = 12346;
846 uint16_t sequence_number = 1234;
isheriffcc5903e2016-10-04 08:29:38 -0700847
848 PacedSenderProbing packet_sender;
849 send_bucket_.reset(new PacedSender(&clock_, &packet_sender));
philipelfd58b612017-01-04 07:05:25 -0800850 send_bucket_->CreateProbeCluster(kFirstClusterBps);
perkjec81bcd2016-05-11 06:01:13 -0700851 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200852
philipelfd58b612017-01-04 07:05:25 -0800853 for (int i = 0; i < 3; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200854 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
855 sequence_number++, clock_.TimeInMilliseconds(),
856 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200857 }
Stefan Holmer01b48882015-05-05 10:21:24 +0200858
isheriffcc5903e2016-10-04 08:29:38 -0700859 int64_t start = clock_.TimeInMilliseconds();
860 int process_count = 0;
philipelfd58b612017-01-04 07:05:25 -0800861 while (process_count < 5) {
isheriffcc5903e2016-10-04 08:29:38 -0700862 int time_until_process = send_bucket_->TimeUntilNextProcess();
863 clock_.AdvanceTimeMilliseconds(time_until_process);
864 send_bucket_->Process();
865 ++process_count;
866 }
867 int packets_sent = packet_sender.packets_sent();
868 int padding_sent = packet_sender.padding_sent();
869 EXPECT_GT(packets_sent, 0);
870 EXPECT_GT(padding_sent, 0);
871 // Note that the number of intervals here for kPacketSize is
872 // packets_sent due to padding in the same cluster.
873 EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
874 (clock_.TimeInMilliseconds() - start),
875 kFirstClusterBps, kBitrateProbingError);
Stefan Holmer01b48882015-05-05 10:21:24 +0200876}
877
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000878TEST_F(PacedSenderTest, PriorityInversion) {
879 uint32_t ssrc = 12346;
880 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000881 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000882
Peter Boströme23e7372015-10-08 11:44:14 +0200883 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000884 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200885 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000886
Peter Boströme23e7372015-10-08 11:44:14 +0200887 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000888 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200889 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000890
Peter Boströme23e7372015-10-08 11:44:14 +0200891 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
892 clock_.TimeInMilliseconds(), 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,
895 sequence_number + 1, clock_.TimeInMilliseconds(),
896 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000897
898 // Packets from earlier frames should be sent first.
899 {
900 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200901 EXPECT_CALL(callback_,
902 TimeToSendPacket(ssrc, sequence_number,
903 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000904 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200905 EXPECT_CALL(callback_,
906 TimeToSendPacket(ssrc, sequence_number + 1,
907 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000908 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200909 EXPECT_CALL(callback_,
910 TimeToSendPacket(ssrc, sequence_number + 3,
911 clock_.TimeInMilliseconds() + 33, true, _))
912 .WillOnce(Return(true));
913 EXPECT_CALL(callback_,
914 TimeToSendPacket(ssrc, sequence_number + 2,
915 clock_.TimeInMilliseconds() + 33, true, _))
916 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000917
918 while (send_bucket_->QueueSizePackets() > 0) {
919 int time_until_process = send_bucket_->TimeUntilNextProcess();
920 if (time_until_process <= 0) {
921 send_bucket_->Process();
922 } else {
923 clock_.AdvanceTimeMilliseconds(time_until_process);
924 }
925 }
926 }
927}
928
929TEST_F(PacedSenderTest, PaddingOveruse) {
930 uint32_t ssrc = 12346;
931 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000932 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000933
perkjec81bcd2016-05-11 06:01:13 -0700934 send_bucket_->Process();
935 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700936 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700937
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000938 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
939 clock_.TimeInMilliseconds(), kPacketSize, false);
940 send_bucket_->Process();
941
942 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700943 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000944 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700945 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000946
perkjec81bcd2016-05-11 06:01:13 -0700947 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
948 clock_.TimeInMilliseconds(), kPacketSize, false);
949 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000950 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700951 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000952 send_bucket_->Process();
953}
954
Erik Språngad113e52015-11-26 16:26:12 +0100955TEST_F(PacedSenderTest, AverageQueueTime) {
956 uint32_t ssrc = 12346;
957 uint16_t sequence_number = 1234;
958 const size_t kPacketSize = 1200;
959 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100960
perkjec81bcd2016-05-11 06:01:13 -0700961 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100962
963 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
964
965 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100966 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
967 sequence_number, first_capture_time, kPacketSize,
968 false);
Erik Språngad113e52015-11-26 16:26:12 +0100969 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100970 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100971 sequence_number + 1, clock_.TimeInMilliseconds(),
972 kPacketSize, false);
973 clock_.AdvanceTimeMilliseconds(10);
974
975 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
976
977 // Only first packet (queued for 20ms) should be removed, leave the second
978 // packet (queued for 10ms) alone in the queue.
979 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200980 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100981 .Times(1)
982 .WillRepeatedly(Return(true));
983 send_bucket_->Process();
984
985 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
986
987 clock_.AdvanceTimeMilliseconds(10);
988 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200989 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100990 .Times(1)
991 .WillRepeatedly(Return(true));
992 for (int i = 0; i < 3; ++i) {
993 clock_.AdvanceTimeMilliseconds(30); // Max delta.
994 send_bucket_->Process();
995 }
996
997 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
998}
999
philipel1a93cde2016-06-03 01:41:45 -07001000TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +02001001 uint32_t ssrc = 12346;
1002 uint16_t sequence_number = 1234;
1003 const size_t kPacketSize = 1200;
1004
perkj71ee44c2016-06-15 00:47:53 -07001005 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001006 send_bucket_->SetProbingEnabled(true);
philipelfd58b612017-01-04 07:05:25 -08001007 for (int i = 0; i < 10; ++i) {
philipel29dca2c2016-05-13 11:13:05 +02001008 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1009 sequence_number + i, clock_.TimeInMilliseconds(),
1010 kPacketSize, false);
1011 }
1012
1013 // First probing cluster.
1014 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0))
philipelfd58b612017-01-04 07:05:25 -08001015 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001016 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001017 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001018 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001019 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001020 }
philipel29dca2c2016-05-13 11:13:05 +02001021
1022 // Second probing cluster.
1023 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1))
1024 .Times(5)
1025 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001026 for (int i = 0; i < 5; ++i) {
1027 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001028 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001029 }
philipel29dca2c2016-05-13 11:13:05 +02001030
1031 // No more probing packets.
philipel1a93cde2016-06-03 01:41:45 -07001032 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe))
1033 .Times(1)
1034 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001035 send_bucket_->Process();
1036}
1037
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001038} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001039} // namespace webrtc