blob: 354b9b5a23019968922827bc9d333dc99257dfe9 [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
pbos@webrtc.orgdb6e3f82013-07-11 09:50:05 +000014#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010016#include "webrtc/modules/pacing/paced_sender.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010017#include "webrtc/system_wrappers/include/clock.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_));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000113 // Default to bitrate probing disabled for testing purposes. Probing tests
114 // have to enable probing, either by creating a new PacedSender instance or
115 // by calling SetProbingEnabled(true).
116 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700117 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
118
119 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000120 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000121
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000122 void SendAndExpectPacket(PacedSender::Priority priority,
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000123 uint32_t ssrc,
124 uint16_t sequence_number,
125 int64_t capture_time_ms,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000126 size_t size,
stefan@webrtc.org9b82f5a2013-11-13 15:29:21 +0000127 bool retransmission) {
Peter Boströme23e7372015-10-08 11:44:14 +0200128 send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
129 size, retransmission);
philipel29dca2c2016-05-13 11:13:05 +0200130 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
tereliusf39f7d92016-07-20 03:36:19 -0700131 capture_time_ms, retransmission, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000132 .Times(1)
133 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000134 }
135
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000136 SimulatedClock clock_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000137 MockPacedSenderCallback callback_;
kwiberg22feaa32016-03-17 09:17:43 -0700138 std::unique_ptr<PacedSender> send_bucket_;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000139};
140
141TEST_F(PacedSenderTest, QueuePacket) {
142 uint32_t ssrc = 12345;
143 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700144 // Due to the multiplicative factor we can send 5 packets during a send
145 // interval. (network capacity * multiplier / (8 bits per byte *
146 // (packet size * #send intervals per second)
147 const size_t packets_to_send =
148 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
149 for (size_t i = 0; i < packets_to_send; ++i) {
150 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
151 clock_.TimeInMilliseconds(), 250, false);
152 }
153
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000154 int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
Peter Boströme23e7372015-10-08 11:44:14 +0200155 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
156 sequence_number, queued_packet_timestamp, 250,
157 false);
perkjec81bcd2016-05-11 06:01:13 -0700158 EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000159 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000160 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
philipela1ed0b32016-06-01 06:31:17 -0700161 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000162 clock_.AdvanceTimeMilliseconds(4);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000163 EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000164 clock_.AdvanceTimeMilliseconds(1);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000165 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700166 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200167 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
168 queued_packet_timestamp, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000169 .Times(1)
170 .WillRepeatedly(Return(true));
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000171 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000172 sequence_number++;
perkjec81bcd2016-05-11 06:01:13 -0700173 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
174
175 // We can send packets_to_send -1 packets of size 250 during the current
176 // interval since one packet has already been sent.
177 for (size_t i = 0; i < packets_to_send - 1; ++i) {
178 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
179 clock_.TimeInMilliseconds(), 250, false);
180 }
Peter Boströme23e7372015-10-08 11:44:14 +0200181 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
182 sequence_number++, clock_.TimeInMilliseconds(),
183 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700184 EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000185 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700186 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000187}
188
189TEST_F(PacedSenderTest, PaceQueuedPackets) {
190 uint32_t ssrc = 12345;
191 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000192
perkjec81bcd2016-05-11 06:01:13 -0700193 // Due to the multiplicative factor we can send 5 packets during a send
194 // interval. (network capacity * multiplier / (8 bits per byte *
195 // (packet size * #send intervals per second)
196 const size_t packets_to_send_per_interval =
197 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
198 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
199 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
200 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000201 }
perkjec81bcd2016-05-11 06:01:13 -0700202
203 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
Peter Boströme23e7372015-10-08 11:44:14 +0200204 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
205 sequence_number++, clock_.TimeInMilliseconds(),
206 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000207 }
perkjec81bcd2016-05-11 06:01:13 -0700208 EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
209 send_bucket_->QueueSizePackets());
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000210 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700211 EXPECT_EQ(packets_to_send_per_interval * 10,
212 send_bucket_->QueueSizePackets());
philipela1ed0b32016-06-01 06:31:17 -0700213 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000214 for (int k = 0; k < 10; ++k) {
215 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000216 clock_.AdvanceTimeMilliseconds(5);
philipel29dca2c2016-05-13 11:13:05 +0200217 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700218 .Times(packets_to_send_per_interval)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000219 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000220 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800221 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000222 }
perkjec81bcd2016-05-11 06:01:13 -0700223 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000224 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000225 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000226 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
perkjec81bcd2016-05-11 06:01:13 -0700227 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pbosa26ac922016-02-25 04:50:01 -0800228 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700229
230 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
231 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
232 clock_.TimeInMilliseconds(), 250, false);
233 }
Peter Boströme23e7372015-10-08 11:44:14 +0200234 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
235 sequence_number, clock_.TimeInMilliseconds(), 250,
236 false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000237 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700238 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000239}
240
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000241TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
242 uint32_t ssrc = 12345;
243 uint16_t sequence_number = 1234;
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000244 uint16_t queued_sequence_number;
245
perkjec81bcd2016-05-11 06:01:13 -0700246 // Due to the multiplicative factor we can send 5 packets during a send
247 // interval. (network capacity * multiplier / (8 bits per byte *
248 // (packet size * #send intervals per second)
249 const size_t packets_to_send_per_interval =
250 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
251 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
252 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
253 clock_.TimeInMilliseconds(), 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000254 }
255 queued_sequence_number = sequence_number;
256
perkjec81bcd2016-05-11 06:01:13 -0700257 for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000258 // Send in duplicate packets.
Peter Boströme23e7372015-10-08 11:44:14 +0200259 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
260 sequence_number, clock_.TimeInMilliseconds(),
261 250, false);
262 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
263 sequence_number++, clock_.TimeInMilliseconds(),
264 250, false);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000265 }
philipela1ed0b32016-06-01 06:31:17 -0700266 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000267 send_bucket_->Process();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000268 for (int k = 0; k < 10; ++k) {
269 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000270 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000271
perkjec81bcd2016-05-11 06:01:13 -0700272 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000273 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200274 TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000275 .Times(1)
276 .WillRepeatedly(Return(true));
jbauchd2a22962016-02-08 23:18:25 -0800277 }
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();
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000280 }
281 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000282 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000283 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800284 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700285
286 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
287 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
288 clock_.TimeInMilliseconds(), 250, false);
289 }
Peter Boströme23e7372015-10-08 11:44:14 +0200290 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
291 sequence_number++, clock_.TimeInMilliseconds(),
292 250, false);
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000293 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700294 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.org52aa0192013-04-25 17:35:56 +0000295}
296
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000297TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
298 uint32_t ssrc = 12345;
299 uint16_t sequence_number = 1234;
300
301 SendAndExpectPacket(PacedSender::kNormalPriority,
302 ssrc,
303 sequence_number,
304 clock_.TimeInMilliseconds(),
305 250,
306 false);
307
308 // Expect packet on second ssrc to be queued and sent as well.
309 SendAndExpectPacket(PacedSender::kNormalPriority,
310 ssrc + 1,
311 sequence_number,
312 clock_.TimeInMilliseconds(),
313 250,
314 false);
315
316 clock_.AdvanceTimeMilliseconds(1000);
pbos@webrtc.org03c817e2014-07-07 10:20:35 +0000317 send_bucket_->Process();
318}
319
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000320TEST_F(PacedSenderTest, Padding) {
321 uint32_t ssrc = 12345;
322 uint16_t sequence_number = 1234;
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000323
perkjec81bcd2016-05-11 06:01:13 -0700324 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700325 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700326
327 // Due to the multiplicative factor we can send 5 packets during a send
328 // interval. (network capacity * multiplier / (8 bits per byte *
329 // (packet size * #send intervals per second)
330 const size_t packets_to_send_per_interval =
331 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
332 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
333 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
334 clock_.TimeInMilliseconds(), 250, false);
335 }
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000336 // No padding is expected since we have sent too much already.
philipela1ed0b32016-06-01 06:31:17 -0700337 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
perkjec81bcd2016-05-11 06:01:13 -0700338 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
339 send_bucket_->Process();
340 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
341
342 // 5 milliseconds later should not send padding since we filled the buffers
343 // initially.
philipela1ed0b32016-06-01 06:31:17 -0700344 EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000345 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000346 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000347 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800348 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000349
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000350 // 5 milliseconds later we have enough budget to send some padding.
philipela1ed0b32016-06-01 06:31:17 -0700351 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
352 .Times(1)
353 .WillOnce(Return(250));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000354 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000355 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000356 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800357 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000358}
359
perkj71ee44c2016-06-15 00:47:53 -0700360TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
361 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
362 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
363
364 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
365 send_bucket_->Process();
366 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
367
368 send_bucket_->Process();
369 clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
370
371 uint32_t ssrc = 12345;
372 uint16_t sequence_number = 1234;
373 int64_t capture_time_ms = 56789;
374
375 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
376 capture_time_ms, 250, false);
377 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
378 .Times(1)
379 .WillOnce(Return(250));
380 send_bucket_->Process();
381}
382
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000383TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
384 uint32_t ssrc = 12345;
385 uint16_t sequence_number = 1234;
386 int64_t capture_time_ms = 56789;
387 const int kTimeStep = 5;
388 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700389 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700390 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
perkjec81bcd2016-05-11 06:01:13 -0700391
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000392 int64_t start_time = clock_.TimeInMilliseconds();
393 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000394 SendAndExpectPacket(PacedSender::kNormalPriority,
395 ssrc,
396 sequence_number++,
397 capture_time_ms,
398 250,
399 false);
philipela1ed0b32016-06-01 06:31:17 -0700400 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
401 .Times(1)
402 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000403 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700404 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000405 }
406}
407
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000408TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
409 uint32_t ssrc = 12345;
410 uint16_t sequence_number = 1234;
411 int64_t capture_time_ms = 56789;
412 const int kTimeStep = 5;
413 const int64_t kBitrateWindow = 10000;
414 PacedSenderPadding callback;
perkjec81bcd2016-05-11 06:01:13 -0700415 send_bucket_.reset(new PacedSender(&clock_, &callback));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000416 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700417 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
perkj71ee44c2016-06-15 00:47:53 -0700418
419 send_bucket_->SetSendBitrateLimits(
420 0 /*allocated_bitrate_bps*/,
421 kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
perkjec81bcd2016-05-11 06:01:13 -0700422
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000423 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000424 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000425 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800426 int rand_value = rand(); // NOLINT (rand_r instead of rand)
427 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200428 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
429 sequence_number++, capture_time_ms,
430 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000431 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000432 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000433 send_bucket_->Process();
434 }
perkjec81bcd2016-05-11 06:01:13 -0700435 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000436 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700437 kBitrateWindow),
438 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000439}
440
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000441TEST_F(PacedSenderTest, Priority) {
442 uint32_t ssrc_low_priority = 12345;
443 uint32_t ssrc = 12346;
444 uint16_t sequence_number = 1234;
445 int64_t capture_time_ms = 56789;
446 int64_t capture_time_ms_low_priority = 1234567;
447
perkjec81bcd2016-05-11 06:01:13 -0700448 // Due to the multiplicative factor we can send 5 packets during a send
449 // interval. (network capacity * multiplier / (8 bits per byte *
450 // (packet size * #send intervals per second)
451 const size_t packets_to_send_per_interval =
452 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
453 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
454 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
455 clock_.TimeInMilliseconds(), 250, false);
456 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000457 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700458 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000459
460 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200461 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
462 sequence_number++, capture_time_ms_low_priority,
463 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700464
465 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
466 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
467 sequence_number++, capture_time_ms, 250, false);
468 }
Peter Boströme23e7372015-10-08 11:44:14 +0200469 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
470 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000471
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000472 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700473 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200474 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700475 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000476 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000477
478 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000479 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000480 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800481 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700482 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000483
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000484 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200485 TimeToSendPacket(ssrc_low_priority, _,
486 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000487 .Times(1)
488 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000489
490 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000491 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000492 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800493 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000494}
495
tereliusf39f7d92016-07-20 03:36:19 -0700496TEST_F(PacedSenderTest, RetransmissionPriority) {
497 uint32_t ssrc = 12345;
498 uint16_t sequence_number = 1234;
499 int64_t capture_time_ms = 45678;
500 int64_t capture_time_ms_retransmission = 56789;
501
502 // Due to the multiplicative factor we can send 5 packets during a send
503 // interval. (network capacity * multiplier / (8 bits per byte *
504 // (packet size * #send intervals per second)
505 const size_t packets_to_send_per_interval =
506 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
507 send_bucket_->Process();
508 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
509
510 // Alternate retransmissions and normal packets.
511 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
512 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
513 sequence_number++,
514 capture_time_ms_retransmission, 250, true);
515 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
516 sequence_number++, capture_time_ms, 250, false);
517 }
518 EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
519
520 // Expect all retransmissions to be sent out first despite having a later
521 // capture time.
522 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
523 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
524 EXPECT_CALL(callback_, TimeToSendPacket(
525 ssrc, _, capture_time_ms_retransmission, true, _))
526 .Times(packets_to_send_per_interval)
527 .WillRepeatedly(Return(true));
528
529 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
530 clock_.AdvanceTimeMilliseconds(5);
531 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
532 send_bucket_->Process();
533 EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
534
535 // Expect the remaining (non-retransmission) packets to be sent.
536 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
537 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
538 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
539 .Times(packets_to_send_per_interval)
540 .WillRepeatedly(Return(true));
541
542 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
543 clock_.AdvanceTimeMilliseconds(5);
544 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
545 send_bucket_->Process();
546
547 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
548}
549
Stefan Holmerc482eb32015-12-16 16:55:03 +0100550TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
551 uint32_t ssrc = 12346;
552 uint16_t sequence_number = 1234;
553 int64_t capture_time_ms = 56789;
554
555 // As high prio packets doesn't affect the budget, we should be able to send
556 // a high number of them at once.
557 for (int i = 0; i < 25; ++i) {
558 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
559 capture_time_ms, 250, false);
560 }
561 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700562 // Low prio packets does affect the budget.
563 // Due to the multiplicative factor we can send 5 packets during a send
564 // interval. (network capacity * multiplier / (8 bits per byte *
565 // (packet size * #send intervals per second)
566 const size_t packets_to_send_per_interval =
567 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
568 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100569 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700570 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100571 }
572 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
573 capture_time_ms, 250, false);
574 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
575 clock_.AdvanceTimeMilliseconds(5);
576 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700577 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200578 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
579 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700580 .Times(1)
581 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100582 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
583 clock_.AdvanceTimeMilliseconds(5);
584 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700585 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100586}
587
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000588TEST_F(PacedSenderTest, Pause) {
589 uint32_t ssrc_low_priority = 12345;
590 uint32_t ssrc = 12346;
terelius8b70faf2016-08-01 09:47:31 -0700591 uint32_t ssrc_high_priority = 12347;
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000592 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000593 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000594
595 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000596
perkjec81bcd2016-05-11 06:01:13 -0700597 // Due to the multiplicative factor we can send 5 packets during a send
598 // interval. (network capacity * multiplier / (8 bits per byte *
599 // (packet size * #send intervals per second)
600 const size_t packets_to_send_per_interval =
601 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
602 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
603 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
604 clock_.TimeInMilliseconds(), 250, false);
605 }
606
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000607 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000608
609 send_bucket_->Pause();
610
terelius8b70faf2016-08-01 09:47:31 -0700611 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
612 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
613 sequence_number++, capture_time_ms, 250, false);
614 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
615 sequence_number++, capture_time_ms, 250, false);
616 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
617 sequence_number++, capture_time_ms, 250, false);
618 }
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000619 clock_.AdvanceTimeMilliseconds(10000);
620 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
terelius8b70faf2016-08-01 09:47:31 -0700621 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
622 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
623 sequence_number++, second_capture_time_ms, 250,
624 false);
625 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
626 sequence_number++, second_capture_time_ms, 250,
627 false);
628 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
629 sequence_number++, second_capture_time_ms, 250,
630 false);
631 }
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000632
633 // Expect everything to be queued.
terelius8b70faf2016-08-01 09:47:31 -0700634 EXPECT_EQ(second_capture_time_ms - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000635 send_bucket_->QueueInMs());
636
terelius8b70faf2016-08-01 09:47:31 -0700637 // Expect only high priority packets to come out while paused.
philipela1ed0b32016-06-01 06:31:17 -0700638 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200639 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _)).Times(0);
terelius8b70faf2016-08-01 09:47:31 -0700640 EXPECT_CALL(callback_,
641 TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
642 .Times(packets_to_send_per_interval)
643 .WillRepeatedly(Return(true));
644 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
645 second_capture_time_ms, _, _))
646 .Times(packets_to_send_per_interval)
647 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000648
649 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000650 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000651 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800652 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000653 }
terelius8b70faf2016-08-01 09:47:31 -0700654
655 // Expect normal prio packets to come out first (in capture order)
656 // followed by all low prio packets (in capture order).
657 {
658 ::testing::InSequence sequence;
659 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
660 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
661 .Times(1)
662 .WillRepeatedly(Return(true));
663 }
664 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
665 EXPECT_CALL(callback_,
666 TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
667 .Times(1)
668 .WillRepeatedly(Return(true));
669 }
670 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
671 EXPECT_CALL(callback_,
672 TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
673 .Times(1)
674 .WillRepeatedly(Return(true));
675 }
676 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
677 EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
678 second_capture_time_ms, _, _))
679 .Times(1)
680 .WillRepeatedly(Return(true));
681 }
682 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000683 send_bucket_->Resume();
684
terelius8b70faf2016-08-01 09:47:31 -0700685 for (size_t i = 0; i < 4; i++) {
686 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
687 clock_.AdvanceTimeMilliseconds(5);
688 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
689 send_bucket_->Process();
690 }
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000691
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000692 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000693}
694
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000695TEST_F(PacedSenderTest, ResendPacket) {
696 uint32_t ssrc = 12346;
697 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000698 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000699 EXPECT_EQ(0, send_bucket_->QueueInMs());
700
Peter Boströme23e7372015-10-08 11:44:14 +0200701 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
702 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000703 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200704 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
705 sequence_number + 1, capture_time_ms + 1, 250,
706 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000707 clock_.AdvanceTimeMilliseconds(9999);
708 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000709 send_bucket_->QueueInMs());
710 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200711 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
712 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000713 .Times(1)
714 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000715 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000716 send_bucket_->Process();
717
718 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000719 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000720 send_bucket_->QueueInMs());
721
722 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200723 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
724 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000725 .Times(1)
726 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200727 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
728 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000729 .Times(1)
730 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000731 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000732 send_bucket_->Process();
733
734 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000735 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000736 send_bucket_->QueueInMs());
737
738 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200739 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
740 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000741 .Times(1)
742 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000743 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000744 send_bucket_->Process();
745 EXPECT_EQ(0, send_bucket_->QueueInMs());
746}
747
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000748TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000749 uint32_t ssrc = 12346;
750 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000751 const size_t kNumPackets = 60;
752 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700753 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000754 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000755
perkjec81bcd2016-05-11 06:01:13 -0700756 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000757 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000758 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
759 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000760 }
761
perkjec81bcd2016-05-11 06:01:13 -0700762 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000763 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700764 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000765 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000766
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000767 int64_t time_start = clock_.TimeInMilliseconds();
768 while (send_bucket_->QueueSizePackets() > 0) {
769 int time_until_process = send_bucket_->TimeUntilNextProcess();
770 if (time_until_process <= 0) {
771 send_bucket_->Process();
772 } else {
773 clock_.AdvanceTimeMilliseconds(time_until_process);
774 }
775 }
776 int64_t duration = clock_.TimeInMilliseconds() - time_start;
777
778 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
779
sprang0a43fef2015-11-20 09:00:37 -0800780 // Allow for aliasing, duration should be within one pack of max time limit.
781 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700782 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000783}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000784
785TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
786 uint32_t ssrc = 12346;
787 uint16_t sequence_number = 1234;
788 EXPECT_EQ(0, send_bucket_->QueueInMs());
789
perkjec81bcd2016-05-11 06:01:13 -0700790 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000791 SendAndExpectPacket(PacedSender::kNormalPriority,
792 ssrc,
793 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000794 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000795 1200,
796 false);
797
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000798 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000799 EXPECT_EQ(500, send_bucket_->QueueInMs());
800 send_bucket_->Process();
801 EXPECT_EQ(0, send_bucket_->QueueInMs());
802}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000803
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000804TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000805 const int kNumPackets = 11;
806 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000807 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700808 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000809 uint32_t ssrc = 12346;
810 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700811
stefan0665f052016-02-24 03:04:17 -0800812 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000813 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800814 expected_deltas + kNumDeltas);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000815 PacedSenderProbing callback(expected_deltas_list, &clock_);
perkjec81bcd2016-05-11 06:01:13 -0700816 send_bucket_.reset(new PacedSender(&clock_, &callback));
817 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000818
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000819 for (int i = 0; i < kNumPackets; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200820 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
821 sequence_number++, clock_.TimeInMilliseconds(),
822 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000823 }
perkjec81bcd2016-05-11 06:01:13 -0700824
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000825 while (callback.packets_sent() < kNumPackets) {
826 int time_until_process = send_bucket_->TimeUntilNextProcess();
827 if (time_until_process <= 0) {
828 send_bucket_->Process();
829 } else {
830 clock_.AdvanceTimeMilliseconds(time_until_process);
831 }
832 }
833}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000834
Stefan Holmer01b48882015-05-05 10:21:24 +0200835TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
836 const int kNumPackets = 11;
837 const int kNumDeltas = kNumPackets - 1;
838 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700839 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200840 uint32_t ssrc = 12346;
841 uint16_t sequence_number = 1234;
842 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
843 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800844 expected_deltas + kNumDeltas);
Stefan Holmer01b48882015-05-05 10:21:24 +0200845 PacedSenderProbing callback(expected_deltas_list, &clock_);
perkjec81bcd2016-05-11 06:01:13 -0700846 send_bucket_.reset(new PacedSender(&clock_, &callback));
847 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200848
849 for (int i = 0; i < kNumPackets - 5; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200850 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
851 sequence_number++, clock_.TimeInMilliseconds(),
852 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200853 }
854 while (callback.packets_sent() < kNumPackets) {
855 int time_until_process = send_bucket_->TimeUntilNextProcess();
856 if (time_until_process <= 0) {
857 send_bucket_->Process();
858 } else {
859 clock_.AdvanceTimeMilliseconds(time_until_process);
860 }
861 }
862
863 // Process one more time and make sure we don't send any more probes.
864 int time_until_process = send_bucket_->TimeUntilNextProcess();
865 clock_.AdvanceTimeMilliseconds(time_until_process);
866 send_bucket_->Process();
867 EXPECT_EQ(kNumPackets, callback.packets_sent());
868}
869
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000870TEST_F(PacedSenderTest, PriorityInversion) {
871 uint32_t ssrc = 12346;
872 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000873 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000874
Peter Boströme23e7372015-10-08 11:44:14 +0200875 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000876 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200877 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000878
Peter Boströme23e7372015-10-08 11:44:14 +0200879 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000880 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200881 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000882
Peter Boströme23e7372015-10-08 11:44:14 +0200883 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
884 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000885
Peter Boströme23e7372015-10-08 11:44:14 +0200886 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
887 sequence_number + 1, clock_.TimeInMilliseconds(),
888 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000889
890 // Packets from earlier frames should be sent first.
891 {
892 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200893 EXPECT_CALL(callback_,
894 TimeToSendPacket(ssrc, sequence_number,
895 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000896 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200897 EXPECT_CALL(callback_,
898 TimeToSendPacket(ssrc, sequence_number + 1,
899 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000900 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200901 EXPECT_CALL(callback_,
902 TimeToSendPacket(ssrc, sequence_number + 3,
903 clock_.TimeInMilliseconds() + 33, true, _))
904 .WillOnce(Return(true));
905 EXPECT_CALL(callback_,
906 TimeToSendPacket(ssrc, sequence_number + 2,
907 clock_.TimeInMilliseconds() + 33, true, _))
908 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000909
910 while (send_bucket_->QueueSizePackets() > 0) {
911 int time_until_process = send_bucket_->TimeUntilNextProcess();
912 if (time_until_process <= 0) {
913 send_bucket_->Process();
914 } else {
915 clock_.AdvanceTimeMilliseconds(time_until_process);
916 }
917 }
918 }
919}
920
921TEST_F(PacedSenderTest, PaddingOveruse) {
922 uint32_t ssrc = 12346;
923 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000924 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000925
perkjec81bcd2016-05-11 06:01:13 -0700926 send_bucket_->Process();
927 send_bucket_->SetEstimatedBitrate(60000);
perkj71ee44c2016-06-15 00:47:53 -0700928 send_bucket_->SetSendBitrateLimits(60000, 0);
perkjec81bcd2016-05-11 06:01:13 -0700929
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000930 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
931 clock_.TimeInMilliseconds(), kPacketSize, false);
932 send_bucket_->Process();
933
934 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700935 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000936 clock_.AdvanceTimeMilliseconds(5);
perkj71ee44c2016-06-15 00:47:53 -0700937 send_bucket_->SetSendBitrateLimits(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000938
perkjec81bcd2016-05-11 06:01:13 -0700939 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
940 clock_.TimeInMilliseconds(), kPacketSize, false);
941 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000942 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700943 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000944 send_bucket_->Process();
945}
946
Erik Språngad113e52015-11-26 16:26:12 +0100947TEST_F(PacedSenderTest, AverageQueueTime) {
948 uint32_t ssrc = 12346;
949 uint16_t sequence_number = 1234;
950 const size_t kPacketSize = 1200;
951 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100952
perkjec81bcd2016-05-11 06:01:13 -0700953 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100954
955 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
956
957 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100958 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
959 sequence_number, first_capture_time, kPacketSize,
960 false);
Erik Språngad113e52015-11-26 16:26:12 +0100961 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100962 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100963 sequence_number + 1, clock_.TimeInMilliseconds(),
964 kPacketSize, false);
965 clock_.AdvanceTimeMilliseconds(10);
966
967 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
968
969 // Only first packet (queued for 20ms) should be removed, leave the second
970 // packet (queued for 10ms) alone in the queue.
971 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200972 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100973 .Times(1)
974 .WillRepeatedly(Return(true));
975 send_bucket_->Process();
976
977 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
978
979 clock_.AdvanceTimeMilliseconds(10);
980 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200981 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100982 .Times(1)
983 .WillRepeatedly(Return(true));
984 for (int i = 0; i < 3; ++i) {
985 clock_.AdvanceTimeMilliseconds(30); // Max delta.
986 send_bucket_->Process();
987 }
988
989 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
990}
991
philipel1a93cde2016-06-03 01:41:45 -0700992TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +0200993 uint32_t ssrc = 12346;
994 uint16_t sequence_number = 1234;
995 const size_t kPacketSize = 1200;
996
perkj71ee44c2016-06-15 00:47:53 -0700997 send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +0200998 send_bucket_->SetProbingEnabled(true);
999 for (int i = 0; i < 11; ++i) {
1000 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
1001 sequence_number + i, clock_.TimeInMilliseconds(),
1002 kPacketSize, false);
1003 }
1004
1005 // First probing cluster.
1006 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0))
1007 .Times(6)
1008 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001009 for (int i = 0; i < 6; ++i) {
1010 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001011 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001012 }
philipel29dca2c2016-05-13 11:13:05 +02001013
1014 // Second probing cluster.
1015 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1))
1016 .Times(5)
1017 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -07001018 for (int i = 0; i < 5; ++i) {
1019 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +02001020 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -07001021 }
philipel29dca2c2016-05-13 11:13:05 +02001022
1023 // No more probing packets.
philipel1a93cde2016-06-03 01:41:45 -07001024 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe))
1025 .Times(1)
1026 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +02001027 send_bucket_->Process();
1028}
1029
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +00001030} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +00001031} // namespace webrtc