blob: df7619afad324c0b847e69d231fe9dff45a124fa [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.
111 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
112 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(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));
philipela1ed0b32016-06-01 06:31:17 -0700118 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;
129 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
130 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
131 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700132 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.
144 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700145 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
Stefan Holmere5904162015-03-26 11:11:06 +0100146 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700147 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.
154 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
155 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
156 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
157 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700158 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.
169 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
170 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700171 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ång8b7ca4a2018-05-17 13:43:35 +0200275TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
276 PacketRouter packet_router;
277
278 const uint16_t kSsrc1 = 1234;
279 const uint16_t kSsrc2 = 4567;
280 const uint16_t kSsrc3 = 8901;
281
282 // First two rtp modules send media and have rtx.
283 NiceMock<MockRtpRtcp> rtp_1;
284 EXPECT_CALL(rtp_1, RtxSendStatus())
285 .WillRepeatedly(Return(kRtxRedundantPayloads));
286 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
287 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
288 EXPECT_CALL(rtp_1, HasBweExtensions()).WillRepeatedly(Return(true));
289
290 NiceMock<MockRtpRtcp> rtp_2;
291 EXPECT_CALL(rtp_2, RtxSendStatus())
292 .WillRepeatedly(Return(kRtxRedundantPayloads));
293 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
294 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
295 EXPECT_CALL(rtp_2, HasBweExtensions()).WillRepeatedly(Return(true));
296
297 // Third module is sending media, but does not support rtx.
298 NiceMock<MockRtpRtcp> rtp_3;
299 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
300 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
301 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
302 EXPECT_CALL(rtp_3, HasBweExtensions()).WillRepeatedly(Return(true));
303
304 packet_router.AddSendRtpModule(&rtp_1, false);
305 packet_router.AddSendRtpModule(&rtp_2, false);
306 packet_router.AddSendRtpModule(&rtp_3, false);
307
308 const size_t kPaddingBytes = 100;
309
310 // Initially, padding will be sent on last added rtp module that sends media
311 // and supports rtx.
312 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
313 .Times(1)
314 .WillOnce(Return(kPaddingBytes));
315 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
316
317 // Send media on first module. Padding should be sent on that module.
318 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
319 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
320
321 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
322 .Times(1)
323 .WillOnce(Return(kPaddingBytes));
324 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
325
326 // Send media on second module. Padding should be sent there.
327 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
328 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
329
330 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
331 .Times(1)
332 .WillOnce(Return(kPaddingBytes));
333 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
334
335 // Remove second module, padding should now fall back to first module.
336 packet_router.RemoveSendRtpModule(&rtp_2);
337 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
338 .Times(1)
339 .WillOnce(Return(kPaddingBytes));
340 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
341
342 // Remove first module too, leaving only the one without rtx.
343 packet_router.RemoveSendRtpModule(&rtp_1);
344
345 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
346 .Times(1)
347 .WillOnce(Return(kPaddingBytes));
348 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
349
350 packet_router.RemoveSendRtpModule(&rtp_3);
351}
352
eladalonb1338fe2017-08-01 09:36:19 -0700353TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
354 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700355 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700356 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100357 static const uint16_t kSsrc = 1234;
358 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
359 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
360
361 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700362 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700363 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
364 packet_router.TimeToSendPacket(
365 kSsrc, 1, 1, false,
366 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
367 kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100368 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700369 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200370 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
371 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
372 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100373
eladalonb1338fe2017-08-01 09:36:19 -0700374 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100375}
sprang867fb522015-08-03 04:38:41 -0700376
eladalonb1338fe2017-08-01 09:36:19 -0700377TEST(PacketRouterTest, AllocateSequenceNumbers) {
378 PacketRouter packet_router;
379
sprang867fb522015-08-03 04:38:41 -0700380 const uint16_t kStartSeq = 0xFFF0;
381 const size_t kNumPackets = 32;
382
eladalonb1338fe2017-08-01 09:36:19 -0700383 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700384
385 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700386 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700387 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
388 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
389 }
390}
stefanbba9dec2016-02-01 04:39:55 -0800391
eladalonb1338fe2017-08-01 09:36:19 -0700392TEST(PacketRouterTest, SendTransportFeedback) {
393 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700394 NiceMock<MockRtpRtcp> rtp_1;
395 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700396
397 packet_router.AddSendRtpModule(&rtp_1, false);
398 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800399
400 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700401 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700402 packet_router.SendTransportFeedback(&feedback);
403 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700404 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700405 packet_router.SendTransportFeedback(&feedback);
406 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800407}
nisse05843312017-04-18 23:38:35 -0700408
eladalon822ff2b2017-08-01 06:30:28 -0700409#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700410TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
411 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700412 NiceMock<MockRtpRtcp> module;
413
414 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700415 packet_router.AddSendRtpModule(&module, remb_candidate);
416 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700417
418 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700419 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700420}
421
eladalonb1338fe2017-08-01 09:36:19 -0700422TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
423 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700424 NiceMock<MockRtpRtcp> module;
425
426 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700427 packet_router.AddReceiveRtpModule(&module, remb_candidate);
428 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700429
430 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700431 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700432}
433
eladalonb1338fe2017-08-01 09:36:19 -0700434TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
435 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700436 NiceMock<MockRtpRtcp> module;
437
eladalonb1338fe2017-08-01 09:36:19 -0700438 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700439}
440
eladalonb1338fe2017-08-01 09:36:19 -0700441TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
442 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700443 NiceMock<MockRtpRtcp> module;
444
eladalonb1338fe2017-08-01 09:36:19 -0700445 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700446}
447#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
448
nisse05843312017-04-18 23:38:35 -0700449TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
450 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200451 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700452 PacketRouter packet_router;
453
eladalon822ff2b2017-08-01 06:30:28 -0700454 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700455
456 uint32_t bitrate_estimate = 456;
457 const std::vector<uint32_t> ssrcs = {1234};
458
nisse05843312017-04-18 23:38:35 -0700459 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
460
461 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200462 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200463 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700464 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
465
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200466 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700467 // away.
468 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200469 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700470 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
471
nisse05843312017-04-18 23:38:35 -0700472 packet_router.RemoveSendRtpModule(&rtp);
473}
474
475TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
476 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700477 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700478 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700479 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700480
481 uint32_t bitrate_estimate[] = {456, 789};
482 std::vector<uint32_t> ssrcs = {1234, 5678};
483
nisse05843312017-04-18 23:38:35 -0700484 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
485
486 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200487 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200488 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700489 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
490
491 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
492
493 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200494 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700495 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
496
497 packet_router.RemoveSendRtpModule(&rtp);
498}
499
500TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
501 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700502 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700503 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700504 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700505
506 uint32_t bitrate_estimate = 456;
507 std::vector<uint32_t> ssrcs = {1234, 5678};
508
nisse05843312017-04-18 23:38:35 -0700509 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
510
511 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200512 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200513 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700514 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
515
516 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200517 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700518 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
519
520 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200521 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700522 int lower_estimate = bitrate_estimate * 98 / 100;
523 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
524
525 packet_router.RemoveSendRtpModule(&rtp);
526}
527
528TEST(PacketRouterRembTest, ChangeSendRtpModule) {
529 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700530 NiceMock<MockRtpRtcp> rtp_send;
531 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700532 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700533 packet_router.AddSendRtpModule(&rtp_send, true);
534 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700535
536 uint32_t bitrate_estimate = 456;
537 std::vector<uint32_t> ssrcs = {1234, 5678};
538
nisse05843312017-04-18 23:38:35 -0700539 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
540
541 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200542 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200543 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700544 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
545
546 // Decrease estimate to trigger a REMB.
547 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200548 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700549 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
550
551 // Remove the sending module -> should get remb on the second module.
552 packet_router.RemoveSendRtpModule(&rtp_send);
553
nisse05843312017-04-18 23:38:35 -0700554 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
555
556 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200557 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700558 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
559
560 packet_router.RemoveReceiveRtpModule(&rtp_recv);
561}
562
563TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
564 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700565 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700566 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700567 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700568
569 uint32_t bitrate_estimate = 456;
570 const std::vector<uint32_t> ssrcs = {1234};
571
nisse05843312017-04-18 23:38:35 -0700572 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
573
574 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200575 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200576 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700577 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
578
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200579 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700580 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200581 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700582 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
583
584 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200585 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700586 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
587 packet_router.RemoveSendRtpModule(&rtp);
588}
589
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200590TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700591 rtc::ScopedFakeClock clock;
592 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200593 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200594 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700595 constexpr bool remb_candidate = true;
596 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700597
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100598 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200599 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
600 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700601
602 const std::vector<uint32_t> ssrcs = {1234};
603 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
604 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200605 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700606 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
607
608 // Test tear-down.
609 packet_router.RemoveSendRtpModule(&remb_sender);
610}
611
612TEST(PacketRouterRembTest,
613 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
614 rtc::ScopedFakeClock clock;
615 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200616 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200617 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700618 constexpr bool remb_candidate = true;
619 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700620
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100621 const int64_t measured_bitrate_bps = 150000;
622 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700623 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200624 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700625 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
626
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200627 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700628 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
629
630 // Test tear-down.
631 packet_router.RemoveSendRtpModule(&remb_sender);
632}
633
634TEST(PacketRouterRembTest,
635 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
636 rtc::ScopedFakeClock clock;
637 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200638 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200639 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700640 constexpr bool remb_candidate = true;
641 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700642
643 const uint32_t measured_bitrate_bps = 150000;
644 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
645 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200646 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700647 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
648
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200649 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700650 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
651
652 // Test tear-down.
653 packet_router.RemoveSendRtpModule(&remb_sender);
654}
655
656TEST(PacketRouterRembTest,
657 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
658 rtc::ScopedFakeClock clock;
659 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200660 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200661 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700662 constexpr bool remb_candidate = true;
663 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700664
665 const uint32_t measured_bitrate_bps = 150000;
666 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
667 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200668 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700669 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
670
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200671 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700672 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
673
674 // Test tear-down.
675 packet_router.RemoveSendRtpModule(&remb_sender);
676}
677
678TEST(PacketRouterRembTest,
679 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
680 rtc::ScopedFakeClock clock;
681 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200682 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200683 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700684 constexpr bool remb_candidate = true;
685 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700686
687 const uint32_t measured_bitrate_bps = 150000;
688 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
689 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200690 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700691 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200692 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700693
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200694 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700695 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
696
697 // Test tear-down.
698 packet_router.RemoveSendRtpModule(&remb_sender);
699}
700
701TEST(PacketRouterRembTest,
702 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
703 rtc::ScopedFakeClock clock;
704 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200705 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200706 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700707 constexpr bool remb_candidate = true;
708 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700709
710 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200711 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700712 packet_router.SetMaxDesiredReceiveBitrate(100000);
713 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200714 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700715 packet_router.SetMaxDesiredReceiveBitrate(200000);
716 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200717 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700718 packet_router.SetMaxDesiredReceiveBitrate(150000);
719
720 // Test tear-down.
721 packet_router.RemoveSendRtpModule(&remb_sender);
722}
723
nisse05843312017-04-18 23:38:35 -0700724// Only register receiving modules and make sure we fallback to trigger a REMB
725// packet on this one.
726TEST(PacketRouterRembTest, NoSendingRtpModule) {
727 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700728 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700729 PacketRouter packet_router;
730
eladalon822ff2b2017-08-01 06:30:28 -0700731 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700732
733 uint32_t bitrate_estimate = 456;
734 const std::vector<uint32_t> ssrcs = {1234};
735
nisse05843312017-04-18 23:38:35 -0700736 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
737
738 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200739 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200740 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700741 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
742
743 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200744 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700745 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
746
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200747 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700748 packet_router.RemoveReceiveRtpModule(&rtp);
749}
750
eladalon822ff2b2017-08-01 06:30:28 -0700751TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
752 rtc::ScopedFakeClock clock;
753 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200754 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700755
756 constexpr bool remb_candidate = false;
757
758 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700759
760 constexpr uint32_t bitrate_estimate = 456;
761 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200762 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200763 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700764 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
765
766 // Test tear-down
767 packet_router.RemoveSendRtpModule(&module);
768}
769
770TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
771 rtc::ScopedFakeClock clock;
772 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200773 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700774
775 constexpr bool remb_candidate = true;
776
777 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700778
779 constexpr uint32_t bitrate_estimate = 456;
780 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200781 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200782 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700783 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
784
785 // Test tear-down
786 packet_router.RemoveSendRtpModule(&module);
787}
788
789TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
790 rtc::ScopedFakeClock clock;
791 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200792 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700793
794 constexpr bool remb_candidate = false;
795
796 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700797
798 constexpr uint32_t bitrate_estimate = 456;
799 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200800 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200801 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700802 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
803
804 // Test tear-down
805 packet_router.RemoveReceiveRtpModule(&module);
806}
807
808TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
809 rtc::ScopedFakeClock clock;
810 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200811 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700812
813 constexpr bool remb_candidate = true;
814
815 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700816
817 constexpr uint32_t bitrate_estimate = 456;
818 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200819 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200820 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700821 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
822
823 // Test tear-down
824 packet_router.RemoveReceiveRtpModule(&module);
825}
826
827TEST(PacketRouterRembTest,
828 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
829 rtc::ScopedFakeClock clock;
830 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200831 NiceMock<MockRtpRtcp> send_module;
832 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700833
834 constexpr bool remb_candidate = true;
835
836 // Send module added - activated.
837 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700838
839 // Receive module added - the send module remains the active one.
840 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700841
842 constexpr uint32_t bitrate_estimate = 456;
843 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200844 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
845 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700846
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200847 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700848 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
849
850 // Test tear-down
851 packet_router.RemoveReceiveRtpModule(&receive_module);
852 packet_router.RemoveSendRtpModule(&send_module);
853}
854
855TEST(PacketRouterRembTest,
856 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
857 rtc::ScopedFakeClock clock;
858 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200859 NiceMock<MockRtpRtcp> send_module;
860 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700861
862 constexpr bool remb_candidate = true;
863
864 // Receive module added - activated.
865 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700866
867 // Send module added - replaces receive module as active.
868 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700869
870 constexpr uint32_t bitrate_estimate = 456;
871 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200872 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
873 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700874
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200875 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700876 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
877
878 // Test tear-down
879 packet_router.RemoveReceiveRtpModule(&receive_module);
880 packet_router.RemoveSendRtpModule(&send_module);
881}
882
883TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
884 rtc::ScopedFakeClock clock;
885 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200886 NiceMock<MockRtpRtcp> send_module;
887 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700888
889 constexpr bool remb_candidate = true;
890
891 // Send module active, receive module inactive.
892 packet_router.AddSendRtpModule(&send_module, remb_candidate);
893 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700894
895 // Send module removed - receive module becomes active.
896 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700897 constexpr uint32_t bitrate_estimate = 456;
898 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200899 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
900 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700901
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200902 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700903 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
904
905 // Test tear-down
906 packet_router.RemoveReceiveRtpModule(&receive_module);
907}
908
Stefan Holmere5904162015-03-26 11:11:06 +0100909} // namespace webrtc