blob: 92ecdd6a3681fb09e58cc840b0095dfa52528d60 [file] [log] [blame]
Stefan Holmere5904162015-03-26 11:11:06 +01001/*
2 * Copyright (c) 2015 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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <cstddef>
12#include <cstdint>
Stefan Holmere5904162015-03-26 11:11:06 +010013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include "api/units/time_delta.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/pacing/packet_router.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
17#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
18#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "test/gmock.h"
21#include "test/gtest.h"
Stefan Holmere5904162015-03-26 11:11:06 +010022
Stefan Holmere5904162015-03-26 11:11:06 +010023namespace webrtc {
24
eladalon822ff2b2017-08-01 06:30:28 -070025// TODO(eladalon): Restructure and/or replace the existing monolithic tests
26// (only some of the test are monolithic) according to the new
27// guidelines - small tests for one thing at a time.
28// (I'm not removing any tests during CL, so as to demonstrate no regressions.)
29
eladalonb1338fe2017-08-01 09:36:19 -070030namespace {
danilchap47085372017-08-10 06:03:57 -070031
32using ::testing::_;
33using ::testing::AnyNumber;
34using ::testing::AtLeast;
35using ::testing::Field;
36using ::testing::Gt;
37using ::testing::Le;
38using ::testing::NiceMock;
39using ::testing::Return;
40using ::testing::ReturnPointee;
41using ::testing::SaveArg;
42
eladalonb1338fe2017-08-01 09:36:19 -070043constexpr int kProbeMinProbes = 5;
44constexpr int kProbeMinBytes = 1000;
45
eladalonb1338fe2017-08-01 09:36:19 -070046} // namespace
eladalon822ff2b2017-08-01 06:30:28 -070047
eladalon32040ef2017-08-02 06:29:00 -070048TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPacket) {
49 PacketRouter packet_router;
50
51 constexpr uint16_t ssrc = 1234;
52 constexpr uint16_t sequence_number = 17;
53 constexpr uint64_t timestamp = 7890;
54 constexpr bool retransmission = false;
55 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
56
Erik Språngd2879622019-05-10 08:29:01 -070057 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
58 packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
59 retransmission, paced_info));
eladalon32040ef2017-08-02 06:29:00 -070060}
61
62TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
63 PacketRouter packet_router;
64
65 constexpr size_t bytes = 300;
66 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
67
68 EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
69}
70
71TEST(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
72 PacketRouter packet_router;
73
74 const std::vector<uint32_t> ssrcs = {1, 2, 3};
75 constexpr uint32_t bitrate_bps = 10000;
76
77 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
78}
79
80TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
81 PacketRouter packet_router;
82
83 const std::vector<uint32_t> ssrcs = {1, 2, 3};
84 constexpr uint32_t bitrate_bps = 10000;
85
86 EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
87}
88
89TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
90 PacketRouter packet_router;
91
92 rtcp::TransportFeedback feedback;
93
94 EXPECT_FALSE(packet_router.SendTransportFeedback(&feedback));
95}
96
eladalonb1338fe2017-08-01 09:36:19 -070097TEST(PacketRouterTest, TimeToSendPacket) {
98 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -070099 NiceMock<MockRtpRtcp> rtp_1;
100 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700101
102 packet_router.AddSendRtpModule(&rtp_1, false);
103 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100104
105 const uint16_t kSsrc1 = 1234;
106 uint16_t sequence_number = 17;
107 uint64_t timestamp = 7890;
108 bool retransmission = false;
109
110 // Send on the first module by letting rtp_1 be sending with correct ssrc.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200111 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
112 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
philipelc7bf32a2017-02-17 03:59:43 -0800113 EXPECT_CALL(rtp_1, TimeToSendPacket(
114 kSsrc1, sequence_number, timestamp, retransmission,
115 Field(&PacedPacketInfo::probe_cluster_id, 1)))
Stefan Holmere5904162015-03-26 11:11:06 +0100116 .Times(1)
Erik Språngd2879622019-05-10 08:29:01 -0700117 .WillOnce(Return(RtpPacketSendResult::kSuccess));
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200118 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700119 EXPECT_EQ(RtpPacketSendResult::kSuccess,
120 packet_router.TimeToSendPacket(
121 kSsrc1, sequence_number, timestamp, retransmission,
122 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100123
124 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
125 ++sequence_number;
126 timestamp += 30;
127 retransmission = true;
128 const uint16_t kSsrc2 = 4567;
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200129 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(false));
130 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
131 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
132 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800133 EXPECT_CALL(rtp_2, TimeToSendPacket(
134 kSsrc2, sequence_number, timestamp, retransmission,
135 Field(&PacedPacketInfo::probe_cluster_id, 2)))
Stefan Holmere5904162015-03-26 11:11:06 +0100136 .Times(1)
Erik Språngd2879622019-05-10 08:29:01 -0700137 .WillOnce(Return(RtpPacketSendResult::kSuccess));
138 EXPECT_EQ(RtpPacketSendResult::kSuccess,
139 packet_router.TimeToSendPacket(
140 kSsrc2, sequence_number, timestamp, retransmission,
141 PacedPacketInfo(2, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100142
143 // No module is sending, hence no packet should be sent.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200144 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(false));
145 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(false));
146 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
147 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700148 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
149 packet_router.TimeToSendPacket(
150 kSsrc1, sequence_number, timestamp, retransmission,
151 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100152
153 // Add a packet with incorrect ssrc and test it's dropped in the router.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200154 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
155 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
156 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
157 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
158 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
159 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700160 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
161 packet_router.TimeToSendPacket(
162 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
163 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100164
eladalonb1338fe2017-08-01 09:36:19 -0700165 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100166
167 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
168 // it is dropped as expected by not expecting any calls to rtp_1.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200169 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
170 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
171 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700172 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
173 packet_router.TimeToSendPacket(
174 kSsrc1, sequence_number, timestamp, retransmission,
175 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
176 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100177
eladalonb1338fe2017-08-01 09:36:19 -0700178 packet_router.RemoveSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +0100179}
180
eladalonb1338fe2017-08-01 09:36:19 -0700181TEST(PacketRouterTest, TimeToSendPadding) {
182 PacketRouter packet_router;
183
sprang867fb522015-08-03 04:38:41 -0700184 const uint16_t kSsrc1 = 1234;
185 const uint16_t kSsrc2 = 4567;
186
eladalon6c9556e2017-07-10 03:33:00 -0700187 NiceMock<MockRtpRtcp> rtp_1;
stefan16b02212017-01-27 07:12:16 -0800188 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
sprang867fb522015-08-03 04:38:41 -0700189 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
eladalon6c9556e2017-07-10 03:33:00 -0700190 NiceMock<MockRtpRtcp> rtp_2;
stefan16b02212017-01-27 07:12:16 -0800191 // rtp_2 will be prioritized for padding.
192 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
sprang867fb522015-08-03 04:38:41 -0700193 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
eladalonb1338fe2017-08-01 09:36:19 -0700194 packet_router.AddSendRtpModule(&rtp_1, false);
195 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100196
sprang867fb522015-08-03 04:38:41 -0700197 // Default configuration, sending padding on all modules sending media,
stefan16b02212017-01-27 07:12:16 -0800198 // ordered by priority (based on rtx mode).
Stefan Holmere5904162015-03-26 11:11:06 +0100199 const size_t requested_padding_bytes = 1000;
200 const size_t sent_padding_bytes = 890;
stefan16b02212017-01-27 07:12:16 -0800201 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800202 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800203 EXPECT_CALL(rtp_2,
204 TimeToSendPadding(requested_padding_bytes,
205 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmere5904162015-03-26 11:11:06 +0100206 .Times(1)
207 .WillOnce(Return(sent_padding_bytes));
stefan16b02212017-01-27 07:12:16 -0800208 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800209 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800210 EXPECT_CALL(rtp_1,
211 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
212 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang867fb522015-08-03 04:38:41 -0700213 .Times(1)
214 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
215 EXPECT_EQ(requested_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700216 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800217 requested_padding_bytes,
218 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100219
stefan16b02212017-01-27 07:12:16 -0800220 // Let only the lower priority module be sending and verify the padding
221 // request is routed there.
222 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
223 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
224 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800225 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
stefan16b02212017-01-27 07:12:16 -0800226 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmere5904162015-03-26 11:11:06 +0100227 .Times(1)
228 .WillOnce(Return(sent_padding_bytes));
229 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700230 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800231 requested_padding_bytes,
232 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
233 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100234
235 // No sending module at all.
236 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700237 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Stefan Holmere5904162015-03-26 11:11:06 +0100238 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700239 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200240 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
241 requested_padding_bytes,
242 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
243 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100244
stefan53b6cc32017-02-03 08:13:57 -0800245 // Only one module has BWE extensions.
246 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
247 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
248 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
249 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
250 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
251 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
252 .Times(1)
253 .WillOnce(Return(sent_padding_bytes));
254 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700255 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800256 requested_padding_bytes,
257 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
258 kProbeMinBytes)));
stefan53b6cc32017-02-03 08:13:57 -0800259
eladalonb1338fe2017-08-01 09:36:19 -0700260 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100261
262 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
263 // to send by not expecting any calls. Instead verify rtp_2 is called.
264 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800265 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700266 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
Yves Gerey665174f2018-06-19 15:03:05 +0200267 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
268 requested_padding_bytes,
269 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
270 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100271
eladalonb1338fe2017-08-01 09:36:19 -0700272 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100273}
274
Erik Språng478cb462019-06-26 15:49:27 +0200275TEST(PacketRouterTest, GeneratePaddingPicksCorrectModule) {
276 PacketRouter packet_router;
277
278 // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
279 // should not be called.
280 const uint16_t kSsrc1 = 1234;
281 const uint16_t kSsrc2 = 4567;
282
283 NiceMock<MockRtpRtcp> rtp_1;
284 ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
285 ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
286 ON_CALL(rtp_1, SendingMedia()).WillByDefault(Return(false));
287 ON_CALL(rtp_1, HasBweExtensions()).WillByDefault(Return(false));
288
289 NiceMock<MockRtpRtcp> rtp_2;
290 ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
291 ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
292 ON_CALL(rtp_2, SendingMedia()).WillByDefault(Return(true));
293 ON_CALL(rtp_2, HasBweExtensions()).WillByDefault(Return(true));
294
295 packet_router.AddSendRtpModule(&rtp_1, false);
296 packet_router.AddSendRtpModule(&rtp_2, false);
297
298 const size_t kPaddingSize = 123;
299 EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
300 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize)).Times(1);
301 packet_router.GeneratePadding(kPaddingSize);
302
303 packet_router.RemoveSendRtpModule(&rtp_1);
304 packet_router.RemoveSendRtpModule(&rtp_2);
305}
306
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200307TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
308 PacketRouter packet_router;
309
310 const uint16_t kSsrc1 = 1234;
311 const uint16_t kSsrc2 = 4567;
312 const uint16_t kSsrc3 = 8901;
313
314 // First two rtp modules send media and have rtx.
315 NiceMock<MockRtpRtcp> rtp_1;
316 EXPECT_CALL(rtp_1, RtxSendStatus())
317 .WillRepeatedly(Return(kRtxRedundantPayloads));
318 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
319 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
320 EXPECT_CALL(rtp_1, HasBweExtensions()).WillRepeatedly(Return(true));
321
322 NiceMock<MockRtpRtcp> rtp_2;
323 EXPECT_CALL(rtp_2, RtxSendStatus())
324 .WillRepeatedly(Return(kRtxRedundantPayloads));
325 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
326 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
327 EXPECT_CALL(rtp_2, HasBweExtensions()).WillRepeatedly(Return(true));
328
329 // Third module is sending media, but does not support rtx.
330 NiceMock<MockRtpRtcp> rtp_3;
331 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
332 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
333 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
334 EXPECT_CALL(rtp_3, HasBweExtensions()).WillRepeatedly(Return(true));
335
336 packet_router.AddSendRtpModule(&rtp_1, false);
337 packet_router.AddSendRtpModule(&rtp_2, false);
338 packet_router.AddSendRtpModule(&rtp_3, false);
339
340 const size_t kPaddingBytes = 100;
341
342 // Initially, padding will be sent on last added rtp module that sends media
343 // and supports rtx.
344 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
345 .Times(1)
346 .WillOnce(Return(kPaddingBytes));
347 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
348
349 // Send media on first module. Padding should be sent on that module.
350 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
351 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
352
353 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
354 .Times(1)
355 .WillOnce(Return(kPaddingBytes));
356 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
357
358 // Send media on second module. Padding should be sent there.
359 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
360 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
361
362 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
363 .Times(1)
364 .WillOnce(Return(kPaddingBytes));
365 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
366
367 // Remove second module, padding should now fall back to first module.
368 packet_router.RemoveSendRtpModule(&rtp_2);
369 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
370 .Times(1)
371 .WillOnce(Return(kPaddingBytes));
372 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
373
374 // Remove first module too, leaving only the one without rtx.
375 packet_router.RemoveSendRtpModule(&rtp_1);
376
377 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
378 .Times(1)
379 .WillOnce(Return(kPaddingBytes));
380 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
381
382 packet_router.RemoveSendRtpModule(&rtp_3);
383}
384
eladalonb1338fe2017-08-01 09:36:19 -0700385TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
386 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700387 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700388 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100389 static const uint16_t kSsrc = 1234;
390 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
391 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
392
393 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700394 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700395 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
396 packet_router.TimeToSendPacket(
397 kSsrc, 1, 1, false,
398 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
399 kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100400 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700401 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200402 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
403 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
404 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100405
eladalonb1338fe2017-08-01 09:36:19 -0700406 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100407}
sprang867fb522015-08-03 04:38:41 -0700408
eladalonb1338fe2017-08-01 09:36:19 -0700409TEST(PacketRouterTest, AllocateSequenceNumbers) {
410 PacketRouter packet_router;
411
sprang867fb522015-08-03 04:38:41 -0700412 const uint16_t kStartSeq = 0xFFF0;
413 const size_t kNumPackets = 32;
414
eladalonb1338fe2017-08-01 09:36:19 -0700415 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700416
417 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700418 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700419 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
420 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
421 }
422}
stefanbba9dec2016-02-01 04:39:55 -0800423
eladalonb1338fe2017-08-01 09:36:19 -0700424TEST(PacketRouterTest, SendTransportFeedback) {
425 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700426 NiceMock<MockRtpRtcp> rtp_1;
427 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700428
429 packet_router.AddSendRtpModule(&rtp_1, false);
430 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800431
432 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700433 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700434 packet_router.SendTransportFeedback(&feedback);
435 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700436 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700437 packet_router.SendTransportFeedback(&feedback);
438 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800439}
nisse05843312017-04-18 23:38:35 -0700440
eladalon822ff2b2017-08-01 06:30:28 -0700441#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700442TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
443 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700444 NiceMock<MockRtpRtcp> module;
445
446 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700447 packet_router.AddSendRtpModule(&module, remb_candidate);
448 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700449
450 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700451 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700452}
453
eladalonb1338fe2017-08-01 09:36:19 -0700454TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
455 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700456 NiceMock<MockRtpRtcp> module;
457
458 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700459 packet_router.AddReceiveRtpModule(&module, remb_candidate);
460 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700461
462 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700463 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700464}
465
eladalonb1338fe2017-08-01 09:36:19 -0700466TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
467 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700468 NiceMock<MockRtpRtcp> module;
469
eladalonb1338fe2017-08-01 09:36:19 -0700470 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700471}
472
eladalonb1338fe2017-08-01 09:36:19 -0700473TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
474 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700475 NiceMock<MockRtpRtcp> module;
476
eladalonb1338fe2017-08-01 09:36:19 -0700477 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700478}
479#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
480
nisse05843312017-04-18 23:38:35 -0700481TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
482 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200483 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700484 PacketRouter packet_router;
485
eladalon822ff2b2017-08-01 06:30:28 -0700486 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700487
488 uint32_t bitrate_estimate = 456;
489 const std::vector<uint32_t> ssrcs = {1234};
490
nisse05843312017-04-18 23:38:35 -0700491 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
492
493 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200494 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200495 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700496 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
497
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200498 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700499 // away.
500 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200501 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700502 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
503
nisse05843312017-04-18 23:38:35 -0700504 packet_router.RemoveSendRtpModule(&rtp);
505}
506
507TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
508 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700509 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700510 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700511 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700512
513 uint32_t bitrate_estimate[] = {456, 789};
514 std::vector<uint32_t> ssrcs = {1234, 5678};
515
nisse05843312017-04-18 23:38:35 -0700516 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
517
518 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200519 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200520 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700521 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
522
523 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
524
525 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200526 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700527 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
528
529 packet_router.RemoveSendRtpModule(&rtp);
530}
531
532TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
533 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700534 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700535 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700536 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700537
538 uint32_t bitrate_estimate = 456;
539 std::vector<uint32_t> ssrcs = {1234, 5678};
540
nisse05843312017-04-18 23:38:35 -0700541 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
542
543 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200544 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200545 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700546 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
547
548 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200549 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700550 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
551
552 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200553 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700554 int lower_estimate = bitrate_estimate * 98 / 100;
555 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
556
557 packet_router.RemoveSendRtpModule(&rtp);
558}
559
560TEST(PacketRouterRembTest, ChangeSendRtpModule) {
561 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700562 NiceMock<MockRtpRtcp> rtp_send;
563 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700564 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700565 packet_router.AddSendRtpModule(&rtp_send, true);
566 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700567
568 uint32_t bitrate_estimate = 456;
569 std::vector<uint32_t> ssrcs = {1234, 5678};
570
nisse05843312017-04-18 23:38:35 -0700571 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
572
573 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200574 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200575 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700576 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
577
578 // Decrease estimate to trigger a REMB.
579 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200580 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700581 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
582
583 // Remove the sending module -> should get remb on the second module.
584 packet_router.RemoveSendRtpModule(&rtp_send);
585
nisse05843312017-04-18 23:38:35 -0700586 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
587
588 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200589 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700590 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
591
592 packet_router.RemoveReceiveRtpModule(&rtp_recv);
593}
594
595TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
596 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700597 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700598 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700599 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700600
601 uint32_t bitrate_estimate = 456;
602 const std::vector<uint32_t> ssrcs = {1234};
603
nisse05843312017-04-18 23:38:35 -0700604 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
605
606 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200607 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200608 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700609 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
610
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200611 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700612 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200613 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700614 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
615
616 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200617 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700618 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
619 packet_router.RemoveSendRtpModule(&rtp);
620}
621
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200622TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700623 rtc::ScopedFakeClock clock;
624 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200625 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200626 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700627 constexpr bool remb_candidate = true;
628 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700629
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100630 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200631 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
632 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700633
634 const std::vector<uint32_t> ssrcs = {1234};
635 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
636 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200637 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700638 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
639
640 // Test tear-down.
641 packet_router.RemoveSendRtpModule(&remb_sender);
642}
643
644TEST(PacketRouterRembTest,
645 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
646 rtc::ScopedFakeClock clock;
647 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200648 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200649 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700650 constexpr bool remb_candidate = true;
651 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700652
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100653 const int64_t measured_bitrate_bps = 150000;
654 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700655 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200656 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700657 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
658
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200659 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700660 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
661
662 // Test tear-down.
663 packet_router.RemoveSendRtpModule(&remb_sender);
664}
665
666TEST(PacketRouterRembTest,
667 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
668 rtc::ScopedFakeClock clock;
669 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200670 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200671 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700672 constexpr bool remb_candidate = true;
673 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700674
675 const uint32_t measured_bitrate_bps = 150000;
676 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
677 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200678 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700679 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
680
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200681 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700682 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
683
684 // Test tear-down.
685 packet_router.RemoveSendRtpModule(&remb_sender);
686}
687
688TEST(PacketRouterRembTest,
689 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
690 rtc::ScopedFakeClock clock;
691 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200692 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200693 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700694 constexpr bool remb_candidate = true;
695 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700696
697 const uint32_t measured_bitrate_bps = 150000;
698 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
699 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200700 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700701 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
702
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200703 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700704 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
705
706 // Test tear-down.
707 packet_router.RemoveSendRtpModule(&remb_sender);
708}
709
710TEST(PacketRouterRembTest,
711 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
712 rtc::ScopedFakeClock clock;
713 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200714 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200715 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700716 constexpr bool remb_candidate = true;
717 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700718
719 const uint32_t measured_bitrate_bps = 150000;
720 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
721 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200722 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700723 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200724 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700725
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200726 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700727 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
728
729 // Test tear-down.
730 packet_router.RemoveSendRtpModule(&remb_sender);
731}
732
733TEST(PacketRouterRembTest,
734 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
735 rtc::ScopedFakeClock clock;
736 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200737 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200738 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700739 constexpr bool remb_candidate = true;
740 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700741
742 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200743 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700744 packet_router.SetMaxDesiredReceiveBitrate(100000);
745 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200746 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700747 packet_router.SetMaxDesiredReceiveBitrate(200000);
748 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200749 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700750 packet_router.SetMaxDesiredReceiveBitrate(150000);
751
752 // Test tear-down.
753 packet_router.RemoveSendRtpModule(&remb_sender);
754}
755
nisse05843312017-04-18 23:38:35 -0700756// Only register receiving modules and make sure we fallback to trigger a REMB
757// packet on this one.
758TEST(PacketRouterRembTest, NoSendingRtpModule) {
759 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700760 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700761 PacketRouter packet_router;
762
eladalon822ff2b2017-08-01 06:30:28 -0700763 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700764
765 uint32_t bitrate_estimate = 456;
766 const std::vector<uint32_t> ssrcs = {1234};
767
nisse05843312017-04-18 23:38:35 -0700768 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
769
770 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200771 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200772 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700773 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
774
775 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200776 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700777 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
778
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200779 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700780 packet_router.RemoveReceiveRtpModule(&rtp);
781}
782
eladalon822ff2b2017-08-01 06:30:28 -0700783TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
784 rtc::ScopedFakeClock clock;
785 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200786 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700787
788 constexpr bool remb_candidate = false;
789
790 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700791
792 constexpr uint32_t bitrate_estimate = 456;
793 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200794 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200795 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700796 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
797
798 // Test tear-down
799 packet_router.RemoveSendRtpModule(&module);
800}
801
802TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
803 rtc::ScopedFakeClock clock;
804 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200805 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700806
807 constexpr bool remb_candidate = true;
808
809 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700810
811 constexpr uint32_t bitrate_estimate = 456;
812 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200813 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200814 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700815 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
816
817 // Test tear-down
818 packet_router.RemoveSendRtpModule(&module);
819}
820
821TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
822 rtc::ScopedFakeClock clock;
823 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200824 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700825
826 constexpr bool remb_candidate = false;
827
828 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700829
830 constexpr uint32_t bitrate_estimate = 456;
831 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200832 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200833 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700834 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
835
836 // Test tear-down
837 packet_router.RemoveReceiveRtpModule(&module);
838}
839
840TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
841 rtc::ScopedFakeClock clock;
842 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200843 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700844
845 constexpr bool remb_candidate = true;
846
847 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700848
849 constexpr uint32_t bitrate_estimate = 456;
850 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200851 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200852 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700853 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
854
855 // Test tear-down
856 packet_router.RemoveReceiveRtpModule(&module);
857}
858
859TEST(PacketRouterRembTest,
860 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
861 rtc::ScopedFakeClock clock;
862 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200863 NiceMock<MockRtpRtcp> send_module;
864 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700865
866 constexpr bool remb_candidate = true;
867
868 // Send module added - activated.
869 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700870
871 // Receive module added - the send module remains the active one.
872 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700873
874 constexpr uint32_t bitrate_estimate = 456;
875 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200876 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
877 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700878
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200879 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700880 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
881
882 // Test tear-down
883 packet_router.RemoveReceiveRtpModule(&receive_module);
884 packet_router.RemoveSendRtpModule(&send_module);
885}
886
887TEST(PacketRouterRembTest,
888 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
889 rtc::ScopedFakeClock clock;
890 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200891 NiceMock<MockRtpRtcp> send_module;
892 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700893
894 constexpr bool remb_candidate = true;
895
896 // Receive module added - activated.
897 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700898
899 // Send module added - replaces receive module as active.
900 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700901
902 constexpr uint32_t bitrate_estimate = 456;
903 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200904 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
905 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700906
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200907 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700908 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
909
910 // Test tear-down
911 packet_router.RemoveReceiveRtpModule(&receive_module);
912 packet_router.RemoveSendRtpModule(&send_module);
913}
914
915TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
916 rtc::ScopedFakeClock clock;
917 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200918 NiceMock<MockRtpRtcp> send_module;
919 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700920
921 constexpr bool remb_candidate = true;
922
923 // Send module active, receive module inactive.
924 packet_router.AddSendRtpModule(&send_module, remb_candidate);
925 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700926
927 // Send module removed - receive module becomes active.
928 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700929 constexpr uint32_t bitrate_estimate = 456;
930 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200931 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
932 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700933
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200934 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700935 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
936
937 // Test tear-down
938 packet_router.RemoveReceiveRtpModule(&receive_module);
939}
940
Stefan Holmere5904162015-03-26 11:11:06 +0100941} // namespace webrtc