blob: cde5fd1febe2a5d357d911b20f8f65eba87366a4 [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
terelius8b70faf2016-08-01 09:47:31 -0700632 // Expect only high priority packets to come out while paused.
philipela1ed0b32016-06-01 06:31:17 -0700633 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200634 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _)).Times(0);
terelius8b70faf2016-08-01 09:47:31 -0700635 EXPECT_CALL(callback_,
636 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
637 .Times(packets_to_send_per_interval)
638 .WillRepeatedly(Return(true));
639 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
640 second_capture_time_ms, _, _))
641 .Times(packets_to_send_per_interval)
642 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000643
644 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000645 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000646 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800647 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000648 }
terelius8b70faf2016-08-01 09:47:31 -0700649
650 // Expect normal prio packets to come out first (in capture order)
651 // followed by all low prio packets (in capture order).
652 {
653 ::testing::InSequence sequence;
654 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.
1017 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0))
philipelfd58b612017-01-04 07:05:25 -08001018 .Times(5)
philipel29dca2c2016-05-13 11:13:05 +02001019 .WillRepeatedly(Return(true));
philipelfd58b612017-01-04 07:05:25 -08001020 for (int i = 0; i < 5; ++i) {
philipel1a93cde2016-06-03 01:41:45 -07001021 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001022 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001023 }
philipel29dca2c2016-05-13 11:13:05 +02001024
1025 // Second probing cluster.
1026 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1))
1027 .Times(5)
1028 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001029 for (int i = 0; i < 5; ++i) {
1030 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001031 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001032 }
philipel29dca2c2016-05-13 11:13:05 +02001033
1034 // No more probing packets.
philipel1a93cde2016-06-03 01:41:45 -07001035 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe))
1036 .Times(1)
1037 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001038 send_bucket_->Process();
1039}
1040
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001041} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001042} // namespace webrtc