blob: a0bb92f6e4115d224008142ed4c624bf457f08d2 [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
22namespace webrtc {
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +000023namespace test {
24
perkjec81bcd2016-05-11 06:01:13 -070025static const int kTargetBitrateBps = 800000;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000026
perkjec81bcd2016-05-11 06:01:13 -070027class MockPacedSenderCallback : public PacedSender::PacketSender {
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000028 public:
philipel29dca2c2016-05-13 11:13:05 +020029 MOCK_METHOD5(TimeToSendPacket,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000030 bool(uint32_t ssrc,
31 uint16_t sequence_number,
32 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020033 bool retransmission,
34 int probe_cluster_id));
philipela1ed0b32016-06-01 06:31:17 -070035 MOCK_METHOD2(TimeToSendPadding, size_t(size_t bytes, int probe_cluster_id));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000036};
37
perkjec81bcd2016-05-11 06:01:13 -070038class PacedSenderPadding : public PacedSender::PacketSender {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000039 public:
40 PacedSenderPadding() : padding_sent_(0) {}
41
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000042 bool TimeToSendPacket(uint32_t ssrc,
43 uint16_t sequence_number,
44 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020045 bool retransmission,
46 int probe_cluster_id) override {
hclam@chromium.org2e402ce2013-06-20 20:18:31 +000047 return true;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000048 }
49
philipela1ed0b32016-06-01 06:31:17 -070050 size_t TimeToSendPadding(size_t bytes, int probe_cluster_id) override {
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000051 const size_t kPaddingPacketSize = 224;
52 size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000053 padding_sent_ += kPaddingPacketSize * num_packets;
54 return kPaddingPacketSize * num_packets;
55 }
56
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000057 size_t padding_sent() { return padding_sent_; }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +000058
59 private:
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +000060 size_t padding_sent_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +000061};
62
perkjec81bcd2016-05-11 06:01:13 -070063class PacedSenderProbing : public PacedSender::PacketSender {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000064 public:
65 PacedSenderProbing(const std::list<int>& expected_deltas, Clock* clock)
66 : prev_packet_time_ms_(-1),
67 expected_deltas_(expected_deltas),
68 packets_sent_(0),
69 clock_(clock) {}
70
71 bool TimeToSendPacket(uint32_t ssrc,
72 uint16_t sequence_number,
73 int64_t capture_time_ms,
philipel29dca2c2016-05-13 11:13:05 +020074 bool retransmission,
75 int probe_cluster_id) override {
Stefan Holmer01b48882015-05-05 10:21:24 +020076 ExpectAndCountPacket();
77 return true;
78 }
79
philipela1ed0b32016-06-01 06:31:17 -070080 size_t TimeToSendPadding(size_t bytes, int probe_cluster_id) override {
Stefan Holmer01b48882015-05-05 10:21:24 +020081 ExpectAndCountPacket();
82 return bytes;
83 }
84
85 void ExpectAndCountPacket() {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000086 ++packets_sent_;
87 EXPECT_FALSE(expected_deltas_.empty());
88 if (expected_deltas_.empty())
Stefan Holmer01b48882015-05-05 10:21:24 +020089 return;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000090 int64_t now_ms = clock_->TimeInMilliseconds();
91 if (prev_packet_time_ms_ >= 0) {
92 EXPECT_EQ(expected_deltas_.front(), now_ms - prev_packet_time_ms_);
93 expected_deltas_.pop_front();
94 }
95 prev_packet_time_ms_ = now_ms;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +000096 }
97
98 int packets_sent() const { return packets_sent_; }
99
100 private:
101 int64_t prev_packet_time_ms_;
102 std::list<int> expected_deltas_;
103 int packets_sent_;
104 Clock* clock_;
105};
106
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000107class PacedSenderTest : public ::testing::Test {
108 protected:
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000109 PacedSenderTest() : clock_(123456) {
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000110 srand(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000111 // Need to initialize PacedSender after we initialize clock.
perkjec81bcd2016-05-11 06:01:13 -0700112 send_bucket_.reset(new PacedSender(&clock_, &callback_));
philipeleb680ea2016-08-17 11:11:59 +0200113 send_bucket_->CreateProbeCluster(900000, 6);
114 send_bucket_->CreateProbeCluster(1800000, 5);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000115 // Default to bitrate probing disabled for testing purposes. Probing tests
116 // have to enable probing, either by creating a new PacedSender instance or
117 // by calling SetProbingEnabled(true).
118 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700119 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
120
121 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000122 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000123
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000124 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000125 uint32_t ssrc,
126 uint16_t sequence_number,
127 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000128 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000129 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200130 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
131 size, retransmission);
philipel29dca2c2016-05-13 11:13:05 +0200132 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
tereliusf39f7d92016-07-20 03:36:19 -0700133 capture_time_ms, retransmission, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000134 .Times(1)
135 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000136 }
137
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000138 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000139 MockPacedSenderCallback callback_;
kwiberg22feaa32016-03-17 09:17:43 -0700140 std::unique_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000141};
142
143TEST_F(PacedSenderTest, QueuePacket) {
144 uint32_t ssrc = 12345;
145 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700146 // Due to the multiplicative factor we can send 5 packets during a send
147 // interval. (network capacity * multiplier / (8 bits per byte *
148 // (packet size * #send intervals per second)
149 const size_t packets_to_send =
150 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
151 for (size_t i = 0; i < packets_to_send; ++i) {
152 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
153 clock_.TimeInMilliseconds(), 250, false);
154 }
155
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000156 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200157 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
158 sequence_number, queued_packet_timestamp, 250,
159 false);
perkjec81bcd2016-05-11 06:01:13 -0700160 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000161 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000162 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
philipela1ed0b32016-06-01 06:31:17 -0700163 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000164 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000165 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000166 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000167 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700168 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200169 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
170 queued_packet_timestamp, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000171 .Times(1)
172 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000173 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000174 sequence_number++;
perkjec81bcd2016-05-11 06:01:13 -0700175 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
176
177 // We can send packets_to_send -1 packets of size 250 during the current
178 // interval since one packet has already been sent.
179 for (size_t i = 0; i < packets_to_send - 1; ++i) {
180 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
181 clock_.TimeInMilliseconds(), 250, false);
182 }
Peter Boströme23e7372015-10-08 11:44:14 +0200183 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
184 sequence_number++, clock_.TimeInMilliseconds(),
185 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700186 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000187 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700188 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000189}
190
191TEST_F(PacedSenderTest, PaceQueuedPackets) {
192 uint32_t ssrc = 12345;
193 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000194
perkjec81bcd2016-05-11 06:01:13 -0700195 // Due to the multiplicative factor we can send 5 packets during a send
196 // interval. (network capacity * multiplier / (8 bits per byte *
197 // (packet size * #send intervals per second)
198 const size_t packets_to_send_per_interval =
199 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
200 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
201 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
202 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000203 }
perkjec81bcd2016-05-11 06:01:13 -0700204
205 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200206 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
207 sequence_number++, clock_.TimeInMilliseconds(),
208 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000209 }
perkjec81bcd2016-05-11 06:01:13 -0700210 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
211 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000212 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700213 EXPECT_EQ(packets_to_send_per_interval * 10,
214 send_bucket_->QueueSizePackets());
philipela1ed0b32016-06-01 06:31:17 -0700215 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000216 for (int k = 0; k < 10; ++k) {
217 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000218 clock_.AdvanceTimeMilliseconds(5);
philipel29dca2c2016-05-13 11:13:05 +0200219 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700220 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000221 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000222 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800223 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000224 }
perkjec81bcd2016-05-11 06:01:13 -0700225 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000226 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000227 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000228 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700229 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800230 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700231
232 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
233 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
234 clock_.TimeInMilliseconds(), 250, false);
235 }
Peter Boströme23e7372015-10-08 11:44:14 +0200236 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
237 sequence_number, clock_.TimeInMilliseconds(), 250,
238 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000239 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700240 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000241}
242
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000243TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
244 uint32_t ssrc = 12345;
245 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000246 uint16_t queued_sequence_number;
247
perkjec81bcd2016-05-11 06:01:13 -0700248 // Due to the multiplicative factor we can send 5 packets during a send
249 // interval. (network capacity * multiplier / (8 bits per byte *
250 // (packet size * #send intervals per second)
251 const size_t packets_to_send_per_interval =
252 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
253 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
254 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
255 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000256 }
257 queued_sequence_number = sequence_number;
258
perkjec81bcd2016-05-11 06:01:13 -0700259 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000260 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200261 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
262 sequence_number, clock_.TimeInMilliseconds(),
263 250, false);
264 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
265 sequence_number++, clock_.TimeInMilliseconds(),
266 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000267 }
philipela1ed0b32016-06-01 06:31:17 -0700268 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000269 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000270 for (int k = 0; k < 10; ++k) {
271 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000272 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000273
perkjec81bcd2016-05-11 06:01:13 -0700274 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000275 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200276 TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000277 .Times(1)
278 .WillRepeatedly(Return(true));
jbauchd2a22962016-02-08 23:18:25 -0800279 }
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000280 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800281 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000282 }
283 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000284 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000285 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800286 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700287
288 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
289 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
290 clock_.TimeInMilliseconds(), 250, false);
291 }
Peter Boströme23e7372015-10-08 11:44:14 +0200292 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
293 sequence_number++, clock_.TimeInMilliseconds(),
294 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000295 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700296 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000297}
298
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000299TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
300 uint32_t ssrc = 12345;
301 uint16_t sequence_number = 1234;
302
303 SendAndExpectPacket(PacedSender::kNormalPriority,
304 ssrc,
305 sequence_number,
306 clock_.TimeInMilliseconds(),
307 250,
308 false);
309
310 // Expect packet on second ssrc to be queued and sent as well.
311 SendAndExpectPacket(PacedSender::kNormalPriority,
312 ssrc + 1,
313 sequence_number,
314 clock_.TimeInMilliseconds(),
315 250,
316 false);
317
318 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000319 send_bucket_->Process();
320}
321
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000322TEST_F(PacedSenderTest, Padding) {
323 uint32_t ssrc = 12345;
324 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000325
perkjec81bcd2016-05-11 06:01:13 -0700326 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700327 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700328
329 // Due to the multiplicative factor we can send 5 packets during a send
330 // interval. (network capacity * multiplier / (8 bits per byte *
331 // (packet size * #send intervals per second)
332 const size_t packets_to_send_per_interval =
333 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
334 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
335 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
336 clock_.TimeInMilliseconds(), 250, false);
337 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000338 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700339 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700340 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
341 send_bucket_->Process();
342 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
343
344 // 5 milliseconds later should not send padding since we filled the buffers
345 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700346 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000347 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000348 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000349 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800350 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000351
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000352 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700353 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
354 .Times(1)
355 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000356 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000357 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000358 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800359 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000360}
361
perkj71ee44c2016-06-15 00:47:53 -0700362TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
363 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
364 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
365
366 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
367 send_bucket_->Process();
368 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
369
370 send_bucket_->Process();
371 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
372
373 uint32_t ssrc = 12345;
374 uint16_t sequence_number = 1234;
375 int64_t capture_time_ms = 56789;
376
377 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
378 capture_time_ms, 250, false);
379 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
380 .Times(1)
381 .WillOnce(Return(250));
382 send_bucket_->Process();
383}
384
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000385TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
386 uint32_t ssrc = 12345;
387 uint16_t sequence_number = 1234;
388 int64_t capture_time_ms = 56789;
389 const int kTimeStep = 5;
390 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700391 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700392 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700393
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000394 int64_t start_time = clock_.TimeInMilliseconds();
395 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000396 SendAndExpectPacket(PacedSender::kNormalPriority,
397 ssrc,
398 sequence_number++,
399 capture_time_ms,
400 250,
401 false);
philipela1ed0b32016-06-01 06:31:17 -0700402 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
403 .Times(1)
404 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000405 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700406 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000407 }
408}
409
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000410TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
411 uint32_t ssrc = 12345;
412 uint16_t sequence_number = 1234;
413 int64_t capture_time_ms = 56789;
414 const int kTimeStep = 5;
415 const int64_t kBitrateWindow = 10000;
416 PacedSenderPadding callback;
perkjec81bcd2016-05-11 06:01:13 -0700417 send_bucket_.reset(new PacedSender(&clock_, &callback));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000418 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700419 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700420
421 send_bucket_->SetSendBitrateLimits(
422 0 /*allocated_bitrate_bps*/,
423 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700424
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000425 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000426 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000427 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800428 int rand_value = rand(); // NOLINT (rand_r instead of rand)
429 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200430 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
431 sequence_number++, capture_time_ms,
432 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000433 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000434 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000435 send_bucket_->Process();
436 }
perkjec81bcd2016-05-11 06:01:13 -0700437 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000438 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700439 kBitrateWindow),
440 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000441}
442
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000443TEST_F(PacedSenderTest, Priority) {
444 uint32_t ssrc_low_priority = 12345;
445 uint32_t ssrc = 12346;
446 uint16_t sequence_number = 1234;
447 int64_t capture_time_ms = 56789;
448 int64_t capture_time_ms_low_priority = 1234567;
449
perkjec81bcd2016-05-11 06:01:13 -0700450 // Due to the multiplicative factor we can send 5 packets during a send
451 // interval. (network capacity * multiplier / (8 bits per byte *
452 // (packet size * #send intervals per second)
453 const size_t packets_to_send_per_interval =
454 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
455 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
456 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
457 clock_.TimeInMilliseconds(), 250, false);
458 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000459 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700460 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000461
462 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200463 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
464 sequence_number++, capture_time_ms_low_priority,
465 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700466
467 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
468 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
469 sequence_number++, capture_time_ms, 250, false);
470 }
Peter Boströme23e7372015-10-08 11:44:14 +0200471 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
472 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000473
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000474 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700475 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200476 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700477 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000478 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000479
480 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000481 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000482 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800483 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700484 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000485
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000486 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200487 TimeToSendPacket(ssrc_low_priority, _,
488 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000489 .Times(1)
490 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000491
492 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000493 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000494 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800495 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000496}
497
tereliusf39f7d92016-07-20 03:36:19 -0700498TEST_F(PacedSenderTest, RetransmissionPriority) {
499 uint32_t ssrc = 12345;
500 uint16_t sequence_number = 1234;
501 int64_t capture_time_ms = 45678;
502 int64_t capture_time_ms_retransmission = 56789;
503
504 // Due to the multiplicative factor we can send 5 packets during a send
505 // interval. (network capacity * multiplier / (8 bits per byte *
506 // (packet size * #send intervals per second)
507 const size_t packets_to_send_per_interval =
508 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
509 send_bucket_->Process();
510 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
511
512 // Alternate retransmissions and normal packets.
513 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
514 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
515 sequence_number++,
516 capture_time_ms_retransmission, 250, true);
517 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
518 sequence_number++, capture_time_ms, 250, false);
519 }
520 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
521
522 // Expect all retransmissions to be sent out first despite having a later
523 // capture time.
524 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
525 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
526 EXPECT_CALL(callback_, TimeToSendPacket(
527 ssrc, _, capture_time_ms_retransmission, true, _))
528 .Times(packets_to_send_per_interval)
529 .WillRepeatedly(Return(true));
530
531 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
532 clock_.AdvanceTimeMilliseconds(5);
533 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
534 send_bucket_->Process();
535 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
536
537 // Expect the remaining (non-retransmission) packets to be sent.
538 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
539 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
540 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
541 .Times(packets_to_send_per_interval)
542 .WillRepeatedly(Return(true));
543
544 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
545 clock_.AdvanceTimeMilliseconds(5);
546 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
547 send_bucket_->Process();
548
549 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
550}
551
Stefan Holmerc482eb32015-12-16 16:55:03 +0100552TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
553 uint32_t ssrc = 12346;
554 uint16_t sequence_number = 1234;
555 int64_t capture_time_ms = 56789;
556
557 // As high prio packets doesn't affect the budget, we should be able to send
558 // a high number of them at once.
559 for (int i = 0; i < 25; ++i) {
560 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
561 capture_time_ms, 250, false);
562 }
563 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700564 // Low prio packets does affect the budget.
565 // Due to the multiplicative factor we can send 5 packets during a send
566 // interval. (network capacity * multiplier / (8 bits per byte *
567 // (packet size * #send intervals per second)
568 const size_t packets_to_send_per_interval =
569 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
570 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100571 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700572 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100573 }
574 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
575 capture_time_ms, 250, false);
576 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
577 clock_.AdvanceTimeMilliseconds(5);
578 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700579 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200580 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
581 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700582 .Times(1)
583 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100584 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
585 clock_.AdvanceTimeMilliseconds(5);
586 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700587 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100588}
589
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000590TEST_F(PacedSenderTest, Pause) {
591 uint32_t ssrc_low_priority = 12345;
592 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700593 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000594 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000595 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000596
597 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000598
perkjec81bcd2016-05-11 06:01:13 -0700599 // Due to the multiplicative factor we can send 5 packets during a send
600 // interval. (network capacity * multiplier / (8 bits per byte *
601 // (packet size * #send intervals per second)
602 const size_t packets_to_send_per_interval =
603 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
604 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
605 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
606 clock_.TimeInMilliseconds(), 250, false);
607 }
608
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000609 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000610
611 send_bucket_->Pause();
612
terelius8b70faf2016-08-01 09:47:31 -0700613 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
614 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
615 sequence_number++, capture_time_ms, 250, false);
616 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
617 sequence_number++, capture_time_ms, 250, false);
618 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
619 sequence_number++, capture_time_ms, 250, false);
620 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000621 clock_.AdvanceTimeMilliseconds(10000);
622 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700623 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
624 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
625 sequence_number++, second_capture_time_ms, 250,
626 false);
627 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
628 sequence_number++, second_capture_time_ms, 250,
629 false);
630 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
631 sequence_number++, second_capture_time_ms, 250,
632 false);
633 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000634
635 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700636 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000637 send_bucket_->QueueInMs());
638
terelius8b70faf2016-08-01 09:47:31 -0700639 // Expect only high priority packets to come out while paused.
philipela1ed0b32016-06-01 06:31:17 -0700640 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200641 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _)).Times(0);
terelius8b70faf2016-08-01 09:47:31 -0700642 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));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000650
651 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000652 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000653 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800654 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000655 }
terelius8b70faf2016-08-01 09:47:31 -0700656
657 // Expect normal prio packets to come out first (in capture order)
658 // followed by all low prio packets (in capture order).
659 {
660 ::testing::InSequence sequence;
661 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
662 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
663 .Times(1)
664 .WillRepeatedly(Return(true));
665 }
666 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
667 EXPECT_CALL(callback_,
668 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
669 .Times(1)
670 .WillRepeatedly(Return(true));
671 }
672 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
673 EXPECT_CALL(callback_,
674 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
675 .Times(1)
676 .WillRepeatedly(Return(true));
677 }
678 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
679 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
680 second_capture_time_ms, _, _))
681 .Times(1)
682 .WillRepeatedly(Return(true));
683 }
684 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000685 send_bucket_->Resume();
686
terelius8b70faf2016-08-01 09:47:31 -0700687 for (size_t i = 0; i < 4; i++) {
688 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
689 clock_.AdvanceTimeMilliseconds(5);
690 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
691 send_bucket_->Process();
692 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000693
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000694 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000695}
696
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000697TEST_F(PacedSenderTest, ResendPacket) {
698 uint32_t ssrc = 12346;
699 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000700 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000701 EXPECT_EQ(0, send_bucket_->QueueInMs());
702
Peter Boströme23e7372015-10-08 11:44:14 +0200703 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
704 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000705 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200706 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
707 sequence_number + 1, capture_time_ms + 1, 250,
708 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000709 clock_.AdvanceTimeMilliseconds(9999);
710 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000711 send_bucket_->QueueInMs());
712 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200713 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
714 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000715 .Times(1)
716 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000717 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000718 send_bucket_->Process();
719
720 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000721 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000722 send_bucket_->QueueInMs());
723
724 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200725 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
726 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000727 .Times(1)
728 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200729 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
730 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000731 .Times(1)
732 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000733 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000734 send_bucket_->Process();
735
736 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000737 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000738 send_bucket_->QueueInMs());
739
740 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200741 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
742 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000743 .Times(1)
744 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000745 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000746 send_bucket_->Process();
747 EXPECT_EQ(0, send_bucket_->QueueInMs());
748}
749
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000750TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000751 uint32_t ssrc = 12346;
752 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000753 const size_t kNumPackets = 60;
754 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700755 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000756 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000757
perkjec81bcd2016-05-11 06:01:13 -0700758 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000759 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000760 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
761 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000762 }
763
perkjec81bcd2016-05-11 06:01:13 -0700764 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000765 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700766 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000767 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000768
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000769 int64_t time_start = clock_.TimeInMilliseconds();
770 while (send_bucket_->QueueSizePackets() > 0) {
771 int time_until_process = send_bucket_->TimeUntilNextProcess();
772 if (time_until_process <= 0) {
773 send_bucket_->Process();
774 } else {
775 clock_.AdvanceTimeMilliseconds(time_until_process);
776 }
777 }
778 int64_t duration = clock_.TimeInMilliseconds() - time_start;
779
780 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
781
sprang0a43fef2015-11-20 09:00:37 -0800782 // Allow for aliasing, duration should be within one pack of max time limit.
783 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700784 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000785}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000786
787TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
788 uint32_t ssrc = 12346;
789 uint16_t sequence_number = 1234;
790 EXPECT_EQ(0, send_bucket_->QueueInMs());
791
perkjec81bcd2016-05-11 06:01:13 -0700792 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000793 SendAndExpectPacket(PacedSender::kNormalPriority,
794 ssrc,
795 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000796 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000797 1200,
798 false);
799
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000800 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000801 EXPECT_EQ(500, send_bucket_->QueueInMs());
802 send_bucket_->Process();
803 EXPECT_EQ(0, send_bucket_->QueueInMs());
804}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000805
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000806TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000807 const int kNumPackets = 11;
808 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000809 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700810 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000811 uint32_t ssrc = 12346;
812 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700813
stefan0665f052016-02-24 03:04:17 -0800814 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000815 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800816 expected_deltas + kNumDeltas);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000817 PacedSenderProbing callback(expected_deltas_list, &clock_);
perkjec81bcd2016-05-11 06:01:13 -0700818 send_bucket_.reset(new PacedSender(&clock_, &callback));
philipeleb680ea2016-08-17 11:11:59 +0200819 send_bucket_->CreateProbeCluster(900000, 6);
820 send_bucket_->CreateProbeCluster(1800000, 5);
perkjec81bcd2016-05-11 06:01:13 -0700821 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000822
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000823 for (int i = 0; i < kNumPackets; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200824 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
825 sequence_number++, clock_.TimeInMilliseconds(),
826 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000827 }
perkjec81bcd2016-05-11 06:01:13 -0700828
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000829 while (callback.packets_sent() < kNumPackets) {
830 int time_until_process = send_bucket_->TimeUntilNextProcess();
831 if (time_until_process <= 0) {
832 send_bucket_->Process();
833 } else {
834 clock_.AdvanceTimeMilliseconds(time_until_process);
835 }
836 }
837}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000838
Stefan Holmer01b48882015-05-05 10:21:24 +0200839TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
840 const int kNumPackets = 11;
841 const int kNumDeltas = kNumPackets - 1;
842 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700843 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200844 uint32_t ssrc = 12346;
845 uint16_t sequence_number = 1234;
846 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
847 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800848 expected_deltas + kNumDeltas);
Stefan Holmer01b48882015-05-05 10:21:24 +0200849 PacedSenderProbing callback(expected_deltas_list, &clock_);
perkjec81bcd2016-05-11 06:01:13 -0700850 send_bucket_.reset(new PacedSender(&clock_, &callback));
philipeleb680ea2016-08-17 11:11:59 +0200851 send_bucket_->CreateProbeCluster(900000, 6);
852 send_bucket_->CreateProbeCluster(1800000, 5);
perkjec81bcd2016-05-11 06:01:13 -0700853 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200854
855 for (int i = 0; i < kNumPackets - 5; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200856 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
857 sequence_number++, clock_.TimeInMilliseconds(),
858 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200859 }
860 while (callback.packets_sent() < kNumPackets) {
861 int time_until_process = send_bucket_->TimeUntilNextProcess();
862 if (time_until_process <= 0) {
863 send_bucket_->Process();
864 } else {
865 clock_.AdvanceTimeMilliseconds(time_until_process);
866 }
867 }
868
869 // Process one more time and make sure we don't send any more probes.
870 int time_until_process = send_bucket_->TimeUntilNextProcess();
871 clock_.AdvanceTimeMilliseconds(time_until_process);
872 send_bucket_->Process();
873 EXPECT_EQ(kNumPackets, callback.packets_sent());
874}
875
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000876TEST_F(PacedSenderTest, PriorityInversion) {
877 uint32_t ssrc = 12346;
878 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000879 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000880
Peter Boströme23e7372015-10-08 11:44:14 +0200881 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000882 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200883 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000884
Peter Boströme23e7372015-10-08 11:44:14 +0200885 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000886 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200887 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000888
Peter Boströme23e7372015-10-08 11:44:14 +0200889 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
890 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000891
Peter Boströme23e7372015-10-08 11:44:14 +0200892 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
893 sequence_number + 1, clock_.TimeInMilliseconds(),
894 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000895
896 // Packets from earlier frames should be sent first.
897 {
898 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200899 EXPECT_CALL(callback_,
900 TimeToSendPacket(ssrc, sequence_number,
901 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000902 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200903 EXPECT_CALL(callback_,
904 TimeToSendPacket(ssrc, sequence_number + 1,
905 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000906 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200907 EXPECT_CALL(callback_,
908 TimeToSendPacket(ssrc, sequence_number + 3,
909 clock_.TimeInMilliseconds() + 33, true, _))
910 .WillOnce(Return(true));
911 EXPECT_CALL(callback_,
912 TimeToSendPacket(ssrc, sequence_number + 2,
913 clock_.TimeInMilliseconds() + 33, true, _))
914 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000915
916 while (send_bucket_->QueueSizePackets() > 0) {
917 int time_until_process = send_bucket_->TimeUntilNextProcess();
918 if (time_until_process <= 0) {
919 send_bucket_->Process();
920 } else {
921 clock_.AdvanceTimeMilliseconds(time_until_process);
922 }
923 }
924 }
925}
926
927TEST_F(PacedSenderTest, PaddingOveruse) {
928 uint32_t ssrc = 12346;
929 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000930 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000931
perkjec81bcd2016-05-11 06:01:13 -0700932 send_bucket_->Process();
933 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700934 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700935
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000936 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
937 clock_.TimeInMilliseconds(), kPacketSize, false);
938 send_bucket_->Process();
939
940 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700941 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000942 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700943 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000944
perkjec81bcd2016-05-11 06:01:13 -0700945 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
946 clock_.TimeInMilliseconds(), kPacketSize, false);
947 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000948 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700949 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000950 send_bucket_->Process();
951}
952
Erik Språngad113e52015-11-26 16:26:12 +0100953TEST_F(PacedSenderTest, AverageQueueTime) {
954 uint32_t ssrc = 12346;
955 uint16_t sequence_number = 1234;
956 const size_t kPacketSize = 1200;
957 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100958
perkjec81bcd2016-05-11 06:01:13 -0700959 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100960
961 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
962
963 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100964 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
965 sequence_number, first_capture_time, kPacketSize,
966 false);
Erik Språngad113e52015-11-26 16:26:12 +0100967 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100968 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100969 sequence_number + 1, clock_.TimeInMilliseconds(),
970 kPacketSize, false);
971 clock_.AdvanceTimeMilliseconds(10);
972
973 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
974
975 // Only first packet (queued for 20ms) should be removed, leave the second
976 // packet (queued for 10ms) alone in the queue.
977 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200978 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100979 .Times(1)
980 .WillRepeatedly(Return(true));
981 send_bucket_->Process();
982
983 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
984
985 clock_.AdvanceTimeMilliseconds(10);
986 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200987 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100988 .Times(1)
989 .WillRepeatedly(Return(true));
990 for (int i = 0; i < 3; ++i) {
991 clock_.AdvanceTimeMilliseconds(30); // Max delta.
992 send_bucket_->Process();
993 }
994
995 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
996}
997
philipel1a93cde2016-06-03 01:41:45 -0700998TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +0200999 uint32_t ssrc = 12346;
1000 uint16_t sequence_number = 1234;
1001 const size_t kPacketSize = 1200;
1002
perkj71ee44c2016-06-15 00:47:53 -07001003 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +02001004 send_bucket_->SetProbingEnabled(true);
1005 for (int i = 0; i < 11; ++i) {
1006 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1007 sequence_number + i, clock_.TimeInMilliseconds(),
1008 kPacketSize, false);
1009 }
1010
1011 // First probing cluster.
1012 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0))
1013 .Times(6)
1014 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001015 for (int i = 0; i < 6; ++i) {
1016 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001017 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001018 }
philipel29dca2c2016-05-13 11:13:05 +02001019
1020 // Second probing cluster.
1021 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1))
1022 .Times(5)
1023 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001024 for (int i = 0; i < 5; ++i) {
1025 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001026 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001027 }
philipel29dca2c2016-05-13 11:13:05 +02001028
1029 // No more probing packets.
philipel1a93cde2016-06-03 01:41:45 -07001030 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe))
1031 .Times(1)
1032 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001033 send_bucket_->Process();
1034}
1035
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001036} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001037} // namespace webrtc