blob: 063ec1e1947f566578850b24646b9e79c285a329 [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,
131 capture_time_ms, false, _))
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);
325 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
326
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
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000360TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
361 uint32_t ssrc = 12345;
362 uint16_t sequence_number = 1234;
363 int64_t capture_time_ms = 56789;
364 const int kTimeStep = 5;
365 const int64_t kBitrateWindow = 100;
perkjec81bcd2016-05-11 06:01:13 -0700366 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
367 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
368
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000369 int64_t start_time = clock_.TimeInMilliseconds();
370 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000371 SendAndExpectPacket(PacedSender::kNormalPriority,
372 ssrc,
373 sequence_number++,
374 capture_time_ms,
375 250,
376 false);
philipela1ed0b32016-06-01 06:31:17 -0700377 EXPECT_CALL(callback_, TimeToSendPadding(250, _))
378 .Times(1)
379 .WillOnce(Return(250));
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000380 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700381 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000382 }
383}
384
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000385TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
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 = 10000;
391 PacedSenderPadding callback;
perkjec81bcd2016-05-11 06:01:13 -0700392 send_bucket_.reset(new PacedSender(&clock_, &callback));
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000393 send_bucket_->SetProbingEnabled(false);
perkjec81bcd2016-05-11 06:01:13 -0700394 send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
395 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
396
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000397 int64_t start_time = clock_.TimeInMilliseconds();
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000398 size_t media_bytes = 0;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000399 while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
jbauchd2a22962016-02-08 23:18:25 -0800400 int rand_value = rand(); // NOLINT (rand_r instead of rand)
401 size_t media_payload = rand_value % 100 + 200; // [200, 300] bytes.
Peter Boströme23e7372015-10-08 11:44:14 +0200402 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
403 sequence_number++, capture_time_ms,
404 media_payload, false);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000405 media_bytes += media_payload;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000406 clock_.AdvanceTimeMilliseconds(kTimeStep);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000407 send_bucket_->Process();
408 }
perkjec81bcd2016-05-11 06:01:13 -0700409 EXPECT_NEAR(kTargetBitrateBps / 1000,
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000410 static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
perkjec81bcd2016-05-11 06:01:13 -0700411 kBitrateWindow),
412 1);
stefan@webrtc.orgc3cc3752013-06-04 09:36:56 +0000413}
414
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000415TEST_F(PacedSenderTest, Priority) {
416 uint32_t ssrc_low_priority = 12345;
417 uint32_t ssrc = 12346;
418 uint16_t sequence_number = 1234;
419 int64_t capture_time_ms = 56789;
420 int64_t capture_time_ms_low_priority = 1234567;
421
perkjec81bcd2016-05-11 06:01:13 -0700422 // Due to the multiplicative factor we can send 5 packets during a send
423 // interval. (network capacity * multiplier / (8 bits per byte *
424 // (packet size * #send intervals per second)
425 const size_t packets_to_send_per_interval =
426 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
427 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
428 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
429 clock_.TimeInMilliseconds(), 250, false);
430 }
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000431 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700432 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000433
434 // Expect normal and low priority to be queued and high to pass through.
Peter Boströme23e7372015-10-08 11:44:14 +0200435 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
436 sequence_number++, capture_time_ms_low_priority,
437 250, false);
perkjec81bcd2016-05-11 06:01:13 -0700438
439 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
440 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
441 sequence_number++, capture_time_ms, 250, false);
442 }
Peter Boströme23e7372015-10-08 11:44:14 +0200443 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
444 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000445
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000446 // Expect all high and normal priority to be sent out first.
philipela1ed0b32016-06-01 06:31:17 -0700447 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200448 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700449 .Times(packets_to_send_per_interval + 1)
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000450 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000451
452 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000453 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000454 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800455 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700456 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000457
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000458 EXPECT_CALL(callback_,
philipel29dca2c2016-05-13 11:13:05 +0200459 TimeToSendPacket(ssrc_low_priority, _,
460 capture_time_ms_low_priority, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000461 .Times(1)
462 .WillRepeatedly(Return(true));
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000463
464 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000465 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000466 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800467 send_bucket_->Process();
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000468}
469
Stefan Holmerc482eb32015-12-16 16:55:03 +0100470TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
471 uint32_t ssrc = 12346;
472 uint16_t sequence_number = 1234;
473 int64_t capture_time_ms = 56789;
474
475 // As high prio packets doesn't affect the budget, we should be able to send
476 // a high number of them at once.
477 for (int i = 0; i < 25; ++i) {
478 SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
479 capture_time_ms, 250, false);
480 }
481 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700482 // Low prio packets does affect the budget.
483 // Due to the multiplicative factor we can send 5 packets during a send
484 // interval. (network capacity * multiplier / (8 bits per byte *
485 // (packet size * #send intervals per second)
486 const size_t packets_to_send_per_interval =
487 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
488 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
Stefan Holmerc482eb32015-12-16 16:55:03 +0100489 SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
perkjec81bcd2016-05-11 06:01:13 -0700490 clock_.TimeInMilliseconds(), 250, false);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100491 }
492 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
493 capture_time_ms, 250, false);
494 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
495 clock_.AdvanceTimeMilliseconds(5);
496 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700497 EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
philipel29dca2c2016-05-13 11:13:05 +0200498 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
499 capture_time_ms, false, _))
perkjec81bcd2016-05-11 06:01:13 -0700500 .Times(1)
501 .WillRepeatedly(Return(true));
Stefan Holmerc482eb32015-12-16 16:55:03 +0100502 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
503 clock_.AdvanceTimeMilliseconds(5);
504 send_bucket_->Process();
perkjec81bcd2016-05-11 06:01:13 -0700505 EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
Stefan Holmerc482eb32015-12-16 16:55:03 +0100506}
507
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000508TEST_F(PacedSenderTest, Pause) {
509 uint32_t ssrc_low_priority = 12345;
510 uint32_t ssrc = 12346;
511 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000512 int64_t capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000513
514 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000515
perkjec81bcd2016-05-11 06:01:13 -0700516 // Due to the multiplicative factor we can send 5 packets during a send
517 // interval. (network capacity * multiplier / (8 bits per byte *
518 // (packet size * #send intervals per second)
519 const size_t packets_to_send_per_interval =
520 kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
521 for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
522 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
523 clock_.TimeInMilliseconds(), 250, false);
524 }
525
stefan@webrtc.org8ccb9f92013-06-19 14:13:42 +0000526 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000527
528 send_bucket_->Pause();
529
Peter Boströme23e7372015-10-08 11:44:14 +0200530 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
531 sequence_number++, capture_time_ms, 250, false);
532 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
533 sequence_number++, capture_time_ms, 250, false);
534 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
535 sequence_number++, capture_time_ms, 250, false);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000536
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000537 clock_.AdvanceTimeMilliseconds(10000);
538 int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000539
540 // Expect everything to be queued.
Peter Boströme23e7372015-10-08 11:44:14 +0200541 send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
542 sequence_number++, second_capture_time_ms, 250,
543 false);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000544
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000545 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000546 send_bucket_->QueueInMs());
547
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000548 // Expect no packet to come out while paused.
philipela1ed0b32016-06-01 06:31:17 -0700549 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
philipel29dca2c2016-05-13 11:13:05 +0200550 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _)).Times(0);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000551
552 for (int i = 0; i < 10; ++i) {
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000553 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000554 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800555 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000556 }
557 // Expect high prio packets to come out first followed by all packets in the
558 // way they were added.
philipel29dca2c2016-05-13 11:13:05 +0200559 EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000560 .Times(3)
561 .WillRepeatedly(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200562 EXPECT_CALL(callback_,
563 TimeToSendPacket(_, _, second_capture_time_ms, false, _))
sprang0a43fef2015-11-20 09:00:37 -0800564 .Times(1)
565 .WillRepeatedly(Return(true));
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000566 send_bucket_->Resume();
567
568 EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000569 clock_.AdvanceTimeMilliseconds(5);
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000570 EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
pbosa26ac922016-02-25 04:50:01 -0800571 send_bucket_->Process();
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000572
stefan@webrtc.orgbfacda62013-03-27 16:36:01 +0000573 EXPECT_EQ(0, send_bucket_->QueueInMs());
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000574}
575
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000576TEST_F(PacedSenderTest, ResendPacket) {
577 uint32_t ssrc = 12346;
578 uint16_t sequence_number = 1234;
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000579 int64_t capture_time_ms = clock_.TimeInMilliseconds();
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000580 EXPECT_EQ(0, send_bucket_->QueueInMs());
581
Peter Boströme23e7372015-10-08 11:44:14 +0200582 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
583 sequence_number, capture_time_ms, 250, false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000584 clock_.AdvanceTimeMilliseconds(1);
Peter Boströme23e7372015-10-08 11:44:14 +0200585 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
586 sequence_number + 1, capture_time_ms + 1, 250,
587 false);
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000588 clock_.AdvanceTimeMilliseconds(9999);
589 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000590 send_bucket_->QueueInMs());
591 // Fails to send first packet so only one call.
philipel29dca2c2016-05-13 11:13:05 +0200592 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
593 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000594 .Times(1)
595 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000596 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000597 send_bucket_->Process();
598
599 // Queue remains unchanged.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000600 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000601 send_bucket_->QueueInMs());
602
603 // Fails to send second packet.
philipel29dca2c2016-05-13 11:13:05 +0200604 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
605 capture_time_ms, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000606 .Times(1)
607 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200608 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
609 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000610 .Times(1)
611 .WillOnce(Return(false));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000612 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000613 send_bucket_->Process();
614
615 // Queue is reduced by 1 packet.
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000616 EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000617 send_bucket_->QueueInMs());
618
619 // Send second packet and queue becomes empty.
philipel29dca2c2016-05-13 11:13:05 +0200620 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
621 capture_time_ms + 1, false, _))
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000622 .Times(1)
623 .WillOnce(Return(true));
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000624 clock_.AdvanceTimeMilliseconds(10000);
hclam@chromium.org2e402ce2013-06-20 20:18:31 +0000625 send_bucket_->Process();
626 EXPECT_EQ(0, send_bucket_->QueueInMs());
627}
628
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000629TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000630 uint32_t ssrc = 12346;
631 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000632 const size_t kNumPackets = 60;
633 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700634 const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000635 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000636
perkjec81bcd2016-05-11 06:01:13 -0700637 send_bucket_->SetEstimatedBitrate(30000);
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000638 for (size_t i = 0; i < kNumPackets; ++i) {
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000639 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
640 clock_.TimeInMilliseconds(), kPacketSize, false);
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000641 }
642
perkjec81bcd2016-05-11 06:01:13 -0700643 // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000644 int64_t queue_in_ms =
perkjec81bcd2016-05-11 06:01:13 -0700645 static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000646 EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
stefan@webrtc.org168f23f2014-07-11 13:44:02 +0000647
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000648 int64_t time_start = clock_.TimeInMilliseconds();
649 while (send_bucket_->QueueSizePackets() > 0) {
650 int time_until_process = send_bucket_->TimeUntilNextProcess();
651 if (time_until_process <= 0) {
652 send_bucket_->Process();
653 } else {
654 clock_.AdvanceTimeMilliseconds(time_until_process);
655 }
656 }
657 int64_t duration = clock_.TimeInMilliseconds() - time_start;
658
659 EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
660
sprang0a43fef2015-11-20 09:00:37 -0800661 // Allow for aliasing, duration should be within one pack of max time limit.
662 EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
perkjec81bcd2016-05-11 06:01:13 -0700663 static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
stefan@webrtc.org19a40ff2013-11-27 14:16:20 +0000664}
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000665
666TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
667 uint32_t ssrc = 12346;
668 uint16_t sequence_number = 1234;
669 EXPECT_EQ(0, send_bucket_->QueueInMs());
670
perkjec81bcd2016-05-11 06:01:13 -0700671 send_bucket_->SetEstimatedBitrate(30000);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000672 SendAndExpectPacket(PacedSender::kNormalPriority,
673 ssrc,
674 sequence_number,
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000675 clock_.TimeInMilliseconds(),
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000676 1200,
677 false);
678
stefan@webrtc.org88e0dda2014-07-04 09:20:42 +0000679 clock_.AdvanceTimeMilliseconds(500);
stefan@webrtc.orgdd393e72013-12-13 22:03:27 +0000680 EXPECT_EQ(500, send_bucket_->QueueInMs());
681 send_bucket_->Process();
682 EXPECT_EQ(0, send_bucket_->QueueInMs());
683}
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000684
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000685TEST_F(PacedSenderTest, ProbingWithInitialFrame) {
stefan@webrtc.orgd839e0a2014-11-04 19:33:55 +0000686 const int kNumPackets = 11;
687 const int kNumDeltas = kNumPackets - 1;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000688 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700689 const int kInitialBitrateBps = 300000;
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000690 uint32_t ssrc = 12346;
691 uint16_t sequence_number = 1234;
perkjec81bcd2016-05-11 06:01:13 -0700692
stefan0665f052016-02-24 03:04:17 -0800693 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000694 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800695 expected_deltas + kNumDeltas);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000696 PacedSenderProbing callback(expected_deltas_list, &clock_);
perkjec81bcd2016-05-11 06:01:13 -0700697 send_bucket_.reset(new PacedSender(&clock_, &callback));
698 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
stefan@webrtc.orge9f0f592015-02-16 15:47:51 +0000699
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000700 for (int i = 0; i < kNumPackets; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200701 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
702 sequence_number++, clock_.TimeInMilliseconds(),
703 kPacketSize, false);
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000704 }
perkjec81bcd2016-05-11 06:01:13 -0700705
stefan@webrtc.org82462aa2014-10-23 11:57:05 +0000706 while (callback.packets_sent() < kNumPackets) {
707 int time_until_process = send_bucket_->TimeUntilNextProcess();
708 if (time_until_process <= 0) {
709 send_bucket_->Process();
710 } else {
711 clock_.AdvanceTimeMilliseconds(time_until_process);
712 }
713 }
714}
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000715
Stefan Holmer01b48882015-05-05 10:21:24 +0200716TEST_F(PacedSenderTest, ProbingWithTooSmallInitialFrame) {
717 const int kNumPackets = 11;
718 const int kNumDeltas = kNumPackets - 1;
719 const size_t kPacketSize = 1200;
perkjec81bcd2016-05-11 06:01:13 -0700720 const int kInitialBitrateBps = 300000;
Stefan Holmer01b48882015-05-05 10:21:24 +0200721 uint32_t ssrc = 12346;
722 uint16_t sequence_number = 1234;
723 const int expected_deltas[kNumDeltas] = {10, 10, 10, 10, 10, 5, 5, 5, 5, 5};
724 std::list<int> expected_deltas_list(expected_deltas,
stefan0665f052016-02-24 03:04:17 -0800725 expected_deltas + kNumDeltas);
Stefan Holmer01b48882015-05-05 10:21:24 +0200726 PacedSenderProbing callback(expected_deltas_list, &clock_);
perkjec81bcd2016-05-11 06:01:13 -0700727 send_bucket_.reset(new PacedSender(&clock_, &callback));
728 send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
Stefan Holmer01b48882015-05-05 10:21:24 +0200729
730 for (int i = 0; i < kNumPackets - 5; ++i) {
Peter Boströme23e7372015-10-08 11:44:14 +0200731 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
732 sequence_number++, clock_.TimeInMilliseconds(),
733 kPacketSize, false);
Stefan Holmer01b48882015-05-05 10:21:24 +0200734 }
735 while (callback.packets_sent() < kNumPackets) {
736 int time_until_process = send_bucket_->TimeUntilNextProcess();
737 if (time_until_process <= 0) {
738 send_bucket_->Process();
739 } else {
740 clock_.AdvanceTimeMilliseconds(time_until_process);
741 }
742 }
743
744 // Process one more time and make sure we don't send any more probes.
745 int time_until_process = send_bucket_->TimeUntilNextProcess();
746 clock_.AdvanceTimeMilliseconds(time_until_process);
747 send_bucket_->Process();
748 EXPECT_EQ(kNumPackets, callback.packets_sent());
749}
750
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000751TEST_F(PacedSenderTest, PriorityInversion) {
752 uint32_t ssrc = 12346;
753 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000754 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000755
Peter Boströme23e7372015-10-08 11:44:14 +0200756 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000757 PacedSender::kHighPriority, ssrc, sequence_number + 3,
Peter Boströme23e7372015-10-08 11:44:14 +0200758 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000759
Peter Boströme23e7372015-10-08 11:44:14 +0200760 send_bucket_->InsertPacket(
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000761 PacedSender::kHighPriority, ssrc, sequence_number + 2,
Peter Boströme23e7372015-10-08 11:44:14 +0200762 clock_.TimeInMilliseconds() + 33, kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000763
Peter Boströme23e7372015-10-08 11:44:14 +0200764 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
765 clock_.TimeInMilliseconds(), kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000766
Peter Boströme23e7372015-10-08 11:44:14 +0200767 send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
768 sequence_number + 1, clock_.TimeInMilliseconds(),
769 kPacketSize, true);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000770
771 // Packets from earlier frames should be sent first.
772 {
773 ::testing::InSequence sequence;
philipel29dca2c2016-05-13 11:13:05 +0200774 EXPECT_CALL(callback_,
775 TimeToSendPacket(ssrc, sequence_number,
776 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000777 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200778 EXPECT_CALL(callback_,
779 TimeToSendPacket(ssrc, sequence_number + 1,
780 clock_.TimeInMilliseconds(), true, _))
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000781 .WillOnce(Return(true));
philipel29dca2c2016-05-13 11:13:05 +0200782 EXPECT_CALL(callback_,
783 TimeToSendPacket(ssrc, sequence_number + 3,
784 clock_.TimeInMilliseconds() + 33, true, _))
785 .WillOnce(Return(true));
786 EXPECT_CALL(callback_,
787 TimeToSendPacket(ssrc, sequence_number + 2,
788 clock_.TimeInMilliseconds() + 33, true, _))
789 .WillOnce(Return(true));
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000790
791 while (send_bucket_->QueueSizePackets() > 0) {
792 int time_until_process = send_bucket_->TimeUntilNextProcess();
793 if (time_until_process <= 0) {
794 send_bucket_->Process();
795 } else {
796 clock_.AdvanceTimeMilliseconds(time_until_process);
797 }
798 }
799 }
800}
801
802TEST_F(PacedSenderTest, PaddingOveruse) {
803 uint32_t ssrc = 12346;
804 uint16_t sequence_number = 1234;
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +0000805 const size_t kPacketSize = 1200;
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000806
perkjec81bcd2016-05-11 06:01:13 -0700807 send_bucket_->Process();
808 send_bucket_->SetEstimatedBitrate(60000);
809 send_bucket_->SetAllocatedSendBitrate(60000, 0);
810
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000811 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
812 clock_.TimeInMilliseconds(), kPacketSize, false);
813 send_bucket_->Process();
814
815 // Add 30kbit padding. When increasing budget, media budget will increase from
perkjec81bcd2016-05-11 06:01:13 -0700816 // negative (overuse) while padding budget will increase from 0.
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000817 clock_.AdvanceTimeMilliseconds(5);
perkjec81bcd2016-05-11 06:01:13 -0700818 send_bucket_->SetAllocatedSendBitrate(60000, 30000);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000819
perkjec81bcd2016-05-11 06:01:13 -0700820 SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
821 clock_.TimeInMilliseconds(), kPacketSize, false);
822 EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000823 // Don't send padding if queue is non-empty, even if padding budget > 0.
philipela1ed0b32016-06-01 06:31:17 -0700824 EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
sprang@webrtc.orgdcebf2d2014-11-04 16:27:16 +0000825 send_bucket_->Process();
826}
827
Erik Språngad113e52015-11-26 16:26:12 +0100828TEST_F(PacedSenderTest, AverageQueueTime) {
829 uint32_t ssrc = 12346;
830 uint16_t sequence_number = 1234;
831 const size_t kPacketSize = 1200;
832 const int kBitrateBps = 10 * kPacketSize * 8; // 10 packets per second.
Erik Språngad113e52015-11-26 16:26:12 +0100833
perkjec81bcd2016-05-11 06:01:13 -0700834 send_bucket_->SetEstimatedBitrate(kBitrateBps);
Erik Språngad113e52015-11-26 16:26:12 +0100835
836 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
837
838 int64_t first_capture_time = clock_.TimeInMilliseconds();
Stefan Holmerc482eb32015-12-16 16:55:03 +0100839 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
840 sequence_number, first_capture_time, kPacketSize,
841 false);
Erik Språngad113e52015-11-26 16:26:12 +0100842 clock_.AdvanceTimeMilliseconds(10);
Stefan Holmerc482eb32015-12-16 16:55:03 +0100843 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
Erik Språngad113e52015-11-26 16:26:12 +0100844 sequence_number + 1, clock_.TimeInMilliseconds(),
845 kPacketSize, false);
846 clock_.AdvanceTimeMilliseconds(10);
847
848 EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
849
850 // Only first packet (queued for 20ms) should be removed, leave the second
851 // packet (queued for 10ms) alone in the queue.
852 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
philipel29dca2c2016-05-13 11:13:05 +0200853 first_capture_time, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100854 .Times(1)
855 .WillRepeatedly(Return(true));
856 send_bucket_->Process();
857
858 EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
859
860 clock_.AdvanceTimeMilliseconds(10);
861 EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
philipel29dca2c2016-05-13 11:13:05 +0200862 first_capture_time + 10, false, _))
Erik Språngad113e52015-11-26 16:26:12 +0100863 .Times(1)
864 .WillRepeatedly(Return(true));
865 for (int i = 0; i < 3; ++i) {
866 clock_.AdvanceTimeMilliseconds(30); // Max delta.
867 send_bucket_->Process();
868 }
869
870 EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
871}
872
philipel1a93cde2016-06-03 01:41:45 -0700873TEST_F(PacedSenderTest, ProbeClusterId) {
philipel29dca2c2016-05-13 11:13:05 +0200874 uint32_t ssrc = 12346;
875 uint16_t sequence_number = 1234;
876 const size_t kPacketSize = 1200;
877
philipel1a93cde2016-06-03 01:41:45 -0700878 send_bucket_->SetAllocatedSendBitrate(kTargetBitrateBps, kTargetBitrateBps);
philipel29dca2c2016-05-13 11:13:05 +0200879 send_bucket_->SetProbingEnabled(true);
880 for (int i = 0; i < 11; ++i) {
881 send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
882 sequence_number + i, clock_.TimeInMilliseconds(),
883 kPacketSize, false);
884 }
885
886 // First probing cluster.
887 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0))
888 .Times(6)
889 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -0700890 for (int i = 0; i < 6; ++i) {
891 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +0200892 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -0700893 }
philipel29dca2c2016-05-13 11:13:05 +0200894
895 // Second probing cluster.
896 EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1))
897 .Times(5)
898 .WillRepeatedly(Return(true));
philipel1a93cde2016-06-03 01:41:45 -0700899 for (int i = 0; i < 5; ++i) {
900 clock_.AdvanceTimeMilliseconds(20);
philipel29dca2c2016-05-13 11:13:05 +0200901 send_bucket_->Process();
philipel1a93cde2016-06-03 01:41:45 -0700902 }
philipel29dca2c2016-05-13 11:13:05 +0200903
904 // No more probing packets.
philipel1a93cde2016-06-03 01:41:45 -0700905 EXPECT_CALL(callback_, TimeToSendPadding(_, PacketInfo::kNotAProbe))
906 .Times(1)
907 .WillRepeatedly(Return(500));
philipel29dca2c2016-05-13 11:13:05 +0200908 send_bucket_->Process();
909}
910
pwestin@webrtc.orgdb418562013-03-22 23:39:29 +0000911} // namespace test
pwestin@webrtc.orgb5180172012-11-09 20:56:23 +0000912} // namespace webrtc