blob: b3d91e6bcbb94083538277c825bf14d5553fd761 [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
57 // TODO(eladalon): TimeToSendPacket() returning true when nothing was
58 // sent, because no modules were registered, is sub-optimal.
59 // https://bugs.chromium.org/p/webrtc/issues/detail?id=8052
60 EXPECT_TRUE(packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
61 retransmission, paced_info));
62}
63
64TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
65 PacketRouter packet_router;
66
67 constexpr size_t bytes = 300;
68 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
69
70 EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
71}
72
73TEST(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
74 PacketRouter packet_router;
75
76 const std::vector<uint32_t> ssrcs = {1, 2, 3};
77 constexpr uint32_t bitrate_bps = 10000;
78
79 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
80}
81
82TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
83 PacketRouter packet_router;
84
85 const std::vector<uint32_t> ssrcs = {1, 2, 3};
86 constexpr uint32_t bitrate_bps = 10000;
87
88 EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
89}
90
91TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
92 PacketRouter packet_router;
93
94 rtcp::TransportFeedback feedback;
95
96 EXPECT_FALSE(packet_router.SendTransportFeedback(&feedback));
97}
98
eladalonb1338fe2017-08-01 09:36:19 -070099TEST(PacketRouterTest, TimeToSendPacket) {
100 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700101 NiceMock<MockRtpRtcp> rtp_1;
102 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700103
104 packet_router.AddSendRtpModule(&rtp_1, false);
105 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100106
107 const uint16_t kSsrc1 = 1234;
108 uint16_t sequence_number = 17;
109 uint64_t timestamp = 7890;
110 bool retransmission = false;
111
112 // Send on the first module by letting rtp_1 be sending with correct ssrc.
113 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
114 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
philipelc7bf32a2017-02-17 03:59:43 -0800115 EXPECT_CALL(rtp_1, TimeToSendPacket(
116 kSsrc1, sequence_number, timestamp, retransmission,
117 Field(&PacedPacketInfo::probe_cluster_id, 1)))
Stefan Holmere5904162015-03-26 11:11:06 +0100118 .Times(1)
119 .WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700120 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalonb1338fe2017-08-01 09:36:19 -0700121 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800122 kSsrc1, sequence_number, timestamp, retransmission,
123 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100124
125 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
126 ++sequence_number;
127 timestamp += 30;
128 retransmission = true;
129 const uint16_t kSsrc2 = 4567;
130 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
131 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
132 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700133 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800134 EXPECT_CALL(rtp_2, TimeToSendPacket(
135 kSsrc2, sequence_number, timestamp, retransmission,
136 Field(&PacedPacketInfo::probe_cluster_id, 2)))
Stefan Holmere5904162015-03-26 11:11:06 +0100137 .Times(1)
138 .WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700139 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800140 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);
eladalonb1338fe2017-08-01 09:36:19 -0700148 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800149 kSsrc1, sequence_number, timestamp, retransmission,
150 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100151
152 // Add a packet with incorrect ssrc and test it's dropped in the router.
153 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
154 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
155 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
156 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700157 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
158 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalonb1338fe2017-08-01 09:36:19 -0700159 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800160 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
161 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100162
eladalonb1338fe2017-08-01 09:36:19 -0700163 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100164
165 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
166 // it is dropped as expected by not expecting any calls to rtp_1.
167 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
168 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700169 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalonb1338fe2017-08-01 09:36:19 -0700170 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800171 kSsrc1, sequence_number, timestamp, retransmission,
172 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
173 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100174
eladalonb1338fe2017-08-01 09:36:19 -0700175 packet_router.RemoveSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +0100176}
177
eladalonb1338fe2017-08-01 09:36:19 -0700178TEST(PacketRouterTest, TimeToSendPadding) {
179 PacketRouter packet_router;
180
sprang867fb522015-08-03 04:38:41 -0700181 const uint16_t kSsrc1 = 1234;
182 const uint16_t kSsrc2 = 4567;
183
eladalon6c9556e2017-07-10 03:33:00 -0700184 NiceMock<MockRtpRtcp> rtp_1;
stefan16b02212017-01-27 07:12:16 -0800185 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
sprang867fb522015-08-03 04:38:41 -0700186 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
eladalon6c9556e2017-07-10 03:33:00 -0700187 NiceMock<MockRtpRtcp> rtp_2;
stefan16b02212017-01-27 07:12:16 -0800188 // rtp_2 will be prioritized for padding.
189 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
sprang867fb522015-08-03 04:38:41 -0700190 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
eladalonb1338fe2017-08-01 09:36:19 -0700191 packet_router.AddSendRtpModule(&rtp_1, false);
192 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100193
sprang867fb522015-08-03 04:38:41 -0700194 // Default configuration, sending padding on all modules sending media,
stefan16b02212017-01-27 07:12:16 -0800195 // ordered by priority (based on rtx mode).
Stefan Holmere5904162015-03-26 11:11:06 +0100196 const size_t requested_padding_bytes = 1000;
197 const size_t sent_padding_bytes = 890;
stefan16b02212017-01-27 07:12:16 -0800198 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800199 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800200 EXPECT_CALL(rtp_2,
201 TimeToSendPadding(requested_padding_bytes,
202 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmere5904162015-03-26 11:11:06 +0100203 .Times(1)
204 .WillOnce(Return(sent_padding_bytes));
stefan16b02212017-01-27 07:12:16 -0800205 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800206 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800207 EXPECT_CALL(rtp_1,
208 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
209 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang867fb522015-08-03 04:38:41 -0700210 .Times(1)
211 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
212 EXPECT_EQ(requested_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700213 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800214 requested_padding_bytes,
215 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100216
stefan16b02212017-01-27 07:12:16 -0800217 // Let only the lower priority module be sending and verify the padding
218 // request is routed there.
219 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
220 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
221 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800222 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
stefan16b02212017-01-27 07:12:16 -0800223 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmere5904162015-03-26 11:11:06 +0100224 .Times(1)
225 .WillOnce(Return(sent_padding_bytes));
226 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700227 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800228 requested_padding_bytes,
229 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
230 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100231
232 // No sending module at all.
233 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700234 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Stefan Holmere5904162015-03-26 11:11:06 +0100235 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700236 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200237 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
238 requested_padding_bytes,
239 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
240 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100241
stefan53b6cc32017-02-03 08:13:57 -0800242 // Only one module has BWE extensions.
243 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
244 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
245 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
246 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
247 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
248 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
249 .Times(1)
250 .WillOnce(Return(sent_padding_bytes));
251 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700252 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800253 requested_padding_bytes,
254 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
255 kProbeMinBytes)));
stefan53b6cc32017-02-03 08:13:57 -0800256
eladalonb1338fe2017-08-01 09:36:19 -0700257 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100258
259 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
260 // to send by not expecting any calls. Instead verify rtp_2 is called.
261 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800262 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700263 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
Yves Gerey665174f2018-06-19 15:03:05 +0200264 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
265 requested_padding_bytes,
266 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
267 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100268
eladalonb1338fe2017-08-01 09:36:19 -0700269 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100270}
271
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200272TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
273 PacketRouter packet_router;
274
275 const uint16_t kSsrc1 = 1234;
276 const uint16_t kSsrc2 = 4567;
277 const uint16_t kSsrc3 = 8901;
278
279 // First two rtp modules send media and have rtx.
280 NiceMock<MockRtpRtcp> rtp_1;
281 EXPECT_CALL(rtp_1, RtxSendStatus())
282 .WillRepeatedly(Return(kRtxRedundantPayloads));
283 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
284 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
285 EXPECT_CALL(rtp_1, HasBweExtensions()).WillRepeatedly(Return(true));
286
287 NiceMock<MockRtpRtcp> rtp_2;
288 EXPECT_CALL(rtp_2, RtxSendStatus())
289 .WillRepeatedly(Return(kRtxRedundantPayloads));
290 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
291 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
292 EXPECT_CALL(rtp_2, HasBweExtensions()).WillRepeatedly(Return(true));
293
294 // Third module is sending media, but does not support rtx.
295 NiceMock<MockRtpRtcp> rtp_3;
296 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
297 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
298 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
299 EXPECT_CALL(rtp_3, HasBweExtensions()).WillRepeatedly(Return(true));
300
301 packet_router.AddSendRtpModule(&rtp_1, false);
302 packet_router.AddSendRtpModule(&rtp_2, false);
303 packet_router.AddSendRtpModule(&rtp_3, false);
304
305 const size_t kPaddingBytes = 100;
306
307 // Initially, padding will be sent on last added rtp module that sends media
308 // and supports rtx.
309 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
310 .Times(1)
311 .WillOnce(Return(kPaddingBytes));
312 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
313
314 // Send media on first module. Padding should be sent on that module.
315 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
316 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
317
318 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
319 .Times(1)
320 .WillOnce(Return(kPaddingBytes));
321 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
322
323 // Send media on second module. Padding should be sent there.
324 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
325 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
326
327 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
328 .Times(1)
329 .WillOnce(Return(kPaddingBytes));
330 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
331
332 // Remove second module, padding should now fall back to first module.
333 packet_router.RemoveSendRtpModule(&rtp_2);
334 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
335 .Times(1)
336 .WillOnce(Return(kPaddingBytes));
337 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
338
339 // Remove first module too, leaving only the one without rtx.
340 packet_router.RemoveSendRtpModule(&rtp_1);
341
342 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
343 .Times(1)
344 .WillOnce(Return(kPaddingBytes));
345 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
346
347 packet_router.RemoveSendRtpModule(&rtp_3);
348}
349
eladalonb1338fe2017-08-01 09:36:19 -0700350TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
351 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700352 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700353 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100354 static const uint16_t kSsrc = 1234;
355 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
356 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
357
358 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700359 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalonb1338fe2017-08-01 09:36:19 -0700360 EXPECT_TRUE(packet_router.TimeToSendPacket(
Yves Gerey665174f2018-06-19 15:03:05 +0200361 kSsrc, 1, 1, false,
362 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
363 kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100364 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700365 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200366 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
367 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
368 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100369
eladalonb1338fe2017-08-01 09:36:19 -0700370 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100371}
sprang867fb522015-08-03 04:38:41 -0700372
eladalonb1338fe2017-08-01 09:36:19 -0700373TEST(PacketRouterTest, AllocateSequenceNumbers) {
374 PacketRouter packet_router;
375
sprang867fb522015-08-03 04:38:41 -0700376 const uint16_t kStartSeq = 0xFFF0;
377 const size_t kNumPackets = 32;
378
eladalonb1338fe2017-08-01 09:36:19 -0700379 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700380
381 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700382 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700383 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
384 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
385 }
386}
stefanbba9dec2016-02-01 04:39:55 -0800387
eladalonb1338fe2017-08-01 09:36:19 -0700388TEST(PacketRouterTest, SendTransportFeedback) {
389 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700390 NiceMock<MockRtpRtcp> rtp_1;
391 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700392
393 packet_router.AddSendRtpModule(&rtp_1, false);
394 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800395
396 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700397 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700398 packet_router.SendTransportFeedback(&feedback);
399 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700400 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700401 packet_router.SendTransportFeedback(&feedback);
402 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800403}
nisse05843312017-04-18 23:38:35 -0700404
eladalon822ff2b2017-08-01 06:30:28 -0700405#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700406TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
407 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700408 NiceMock<MockRtpRtcp> module;
409
410 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700411 packet_router.AddSendRtpModule(&module, remb_candidate);
412 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700413
414 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700415 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700416}
417
eladalonb1338fe2017-08-01 09:36:19 -0700418TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
419 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700420 NiceMock<MockRtpRtcp> module;
421
422 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700423 packet_router.AddReceiveRtpModule(&module, remb_candidate);
424 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700425
426 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700427 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700428}
429
eladalonb1338fe2017-08-01 09:36:19 -0700430TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
431 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700432 NiceMock<MockRtpRtcp> module;
433
eladalonb1338fe2017-08-01 09:36:19 -0700434 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700435}
436
eladalonb1338fe2017-08-01 09:36:19 -0700437TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
438 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700439 NiceMock<MockRtpRtcp> module;
440
eladalonb1338fe2017-08-01 09:36:19 -0700441 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700442}
443#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
444
nisse05843312017-04-18 23:38:35 -0700445TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
446 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200447 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700448 PacketRouter packet_router;
449
eladalon822ff2b2017-08-01 06:30:28 -0700450 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700451
452 uint32_t bitrate_estimate = 456;
453 const std::vector<uint32_t> ssrcs = {1234};
454
nisse05843312017-04-18 23:38:35 -0700455 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
456
457 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200458 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200459 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700460 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
461
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200462 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700463 // away.
464 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200465 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700466 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
467
nisse05843312017-04-18 23:38:35 -0700468 packet_router.RemoveSendRtpModule(&rtp);
469}
470
471TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
472 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700473 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700474 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700475 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700476
477 uint32_t bitrate_estimate[] = {456, 789};
478 std::vector<uint32_t> ssrcs = {1234, 5678};
479
nisse05843312017-04-18 23:38:35 -0700480 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
481
482 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200483 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200484 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700485 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
486
487 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
488
489 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200490 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700491 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
492
493 packet_router.RemoveSendRtpModule(&rtp);
494}
495
496TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
497 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700498 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700499 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700500 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700501
502 uint32_t bitrate_estimate = 456;
503 std::vector<uint32_t> ssrcs = {1234, 5678};
504
nisse05843312017-04-18 23:38:35 -0700505 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
506
507 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200508 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200509 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700510 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
511
512 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200513 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700514 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
515
516 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200517 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700518 int lower_estimate = bitrate_estimate * 98 / 100;
519 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
520
521 packet_router.RemoveSendRtpModule(&rtp);
522}
523
524TEST(PacketRouterRembTest, ChangeSendRtpModule) {
525 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700526 NiceMock<MockRtpRtcp> rtp_send;
527 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700528 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700529 packet_router.AddSendRtpModule(&rtp_send, true);
530 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700531
532 uint32_t bitrate_estimate = 456;
533 std::vector<uint32_t> ssrcs = {1234, 5678};
534
nisse05843312017-04-18 23:38:35 -0700535 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
536
537 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200538 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200539 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700540 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
541
542 // Decrease estimate to trigger a REMB.
543 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200544 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700545 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
546
547 // Remove the sending module -> should get remb on the second module.
548 packet_router.RemoveSendRtpModule(&rtp_send);
549
nisse05843312017-04-18 23:38:35 -0700550 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
551
552 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200553 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700554 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
555
556 packet_router.RemoveReceiveRtpModule(&rtp_recv);
557}
558
559TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
560 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700561 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700562 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700563 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700564
565 uint32_t bitrate_estimate = 456;
566 const std::vector<uint32_t> ssrcs = {1234};
567
nisse05843312017-04-18 23:38:35 -0700568 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
569
570 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200571 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200572 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700573 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
574
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200575 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700576 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200577 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700578 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
579
580 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200581 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700582 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
583 packet_router.RemoveSendRtpModule(&rtp);
584}
585
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200586TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700587 rtc::ScopedFakeClock clock;
588 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200589 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200590 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700591 constexpr bool remb_candidate = true;
592 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700593
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100594 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200595 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
596 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700597
598 const std::vector<uint32_t> ssrcs = {1234};
599 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
600 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200601 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700602 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
603
604 // Test tear-down.
605 packet_router.RemoveSendRtpModule(&remb_sender);
606}
607
608TEST(PacketRouterRembTest,
609 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
610 rtc::ScopedFakeClock clock;
611 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200612 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200613 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700614 constexpr bool remb_candidate = true;
615 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700616
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100617 const int64_t measured_bitrate_bps = 150000;
618 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700619 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200620 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700621 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
622
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200623 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700624 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
625
626 // Test tear-down.
627 packet_router.RemoveSendRtpModule(&remb_sender);
628}
629
630TEST(PacketRouterRembTest,
631 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
632 rtc::ScopedFakeClock clock;
633 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200634 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200635 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700636 constexpr bool remb_candidate = true;
637 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700638
639 const uint32_t measured_bitrate_bps = 150000;
640 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
641 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200642 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700643 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
644
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200645 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700646 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
647
648 // Test tear-down.
649 packet_router.RemoveSendRtpModule(&remb_sender);
650}
651
652TEST(PacketRouterRembTest,
653 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
654 rtc::ScopedFakeClock clock;
655 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200656 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200657 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700658 constexpr bool remb_candidate = true;
659 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700660
661 const uint32_t measured_bitrate_bps = 150000;
662 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
663 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200664 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700665 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
666
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200667 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700668 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
669
670 // Test tear-down.
671 packet_router.RemoveSendRtpModule(&remb_sender);
672}
673
674TEST(PacketRouterRembTest,
675 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
676 rtc::ScopedFakeClock clock;
677 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200678 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200679 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700680 constexpr bool remb_candidate = true;
681 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700682
683 const uint32_t measured_bitrate_bps = 150000;
684 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
685 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200686 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700687 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200688 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700689
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200690 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700691 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
692
693 // Test tear-down.
694 packet_router.RemoveSendRtpModule(&remb_sender);
695}
696
697TEST(PacketRouterRembTest,
698 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
699 rtc::ScopedFakeClock clock;
700 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200701 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200702 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700703 constexpr bool remb_candidate = true;
704 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700705
706 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200707 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700708 packet_router.SetMaxDesiredReceiveBitrate(100000);
709 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200710 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700711 packet_router.SetMaxDesiredReceiveBitrate(200000);
712 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200713 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700714 packet_router.SetMaxDesiredReceiveBitrate(150000);
715
716 // Test tear-down.
717 packet_router.RemoveSendRtpModule(&remb_sender);
718}
719
nisse05843312017-04-18 23:38:35 -0700720// Only register receiving modules and make sure we fallback to trigger a REMB
721// packet on this one.
722TEST(PacketRouterRembTest, NoSendingRtpModule) {
723 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700724 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700725 PacketRouter packet_router;
726
eladalon822ff2b2017-08-01 06:30:28 -0700727 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700728
729 uint32_t bitrate_estimate = 456;
730 const std::vector<uint32_t> ssrcs = {1234};
731
nisse05843312017-04-18 23:38:35 -0700732 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
733
734 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200735 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200736 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700737 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
738
739 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200740 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700741 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
742
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200743 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700744 packet_router.RemoveReceiveRtpModule(&rtp);
745}
746
eladalon822ff2b2017-08-01 06:30:28 -0700747TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
748 rtc::ScopedFakeClock clock;
749 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200750 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700751
752 constexpr bool remb_candidate = false;
753
754 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700755
756 constexpr uint32_t bitrate_estimate = 456;
757 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200758 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200759 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700760 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
761
762 // Test tear-down
763 packet_router.RemoveSendRtpModule(&module);
764}
765
766TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
767 rtc::ScopedFakeClock clock;
768 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200769 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700770
771 constexpr bool remb_candidate = true;
772
773 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700774
775 constexpr uint32_t bitrate_estimate = 456;
776 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200777 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200778 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700779 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
780
781 // Test tear-down
782 packet_router.RemoveSendRtpModule(&module);
783}
784
785TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
786 rtc::ScopedFakeClock clock;
787 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200788 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700789
790 constexpr bool remb_candidate = false;
791
792 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700793
794 constexpr uint32_t bitrate_estimate = 456;
795 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200796 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200797 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700798 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
799
800 // Test tear-down
801 packet_router.RemoveReceiveRtpModule(&module);
802}
803
804TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
805 rtc::ScopedFakeClock clock;
806 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200807 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700808
809 constexpr bool remb_candidate = true;
810
811 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700812
813 constexpr uint32_t bitrate_estimate = 456;
814 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200815 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200816 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700817 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
818
819 // Test tear-down
820 packet_router.RemoveReceiveRtpModule(&module);
821}
822
823TEST(PacketRouterRembTest,
824 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
825 rtc::ScopedFakeClock clock;
826 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200827 NiceMock<MockRtpRtcp> send_module;
828 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700829
830 constexpr bool remb_candidate = true;
831
832 // Send module added - activated.
833 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700834
835 // Receive module added - the send module remains the active one.
836 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700837
838 constexpr uint32_t bitrate_estimate = 456;
839 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200840 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
841 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700842
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200843 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700844 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
845
846 // Test tear-down
847 packet_router.RemoveReceiveRtpModule(&receive_module);
848 packet_router.RemoveSendRtpModule(&send_module);
849}
850
851TEST(PacketRouterRembTest,
852 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
853 rtc::ScopedFakeClock clock;
854 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200855 NiceMock<MockRtpRtcp> send_module;
856 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700857
858 constexpr bool remb_candidate = true;
859
860 // Receive module added - activated.
861 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700862
863 // Send module added - replaces receive module as active.
864 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700865
866 constexpr uint32_t bitrate_estimate = 456;
867 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200868 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
869 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700870
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200871 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700872 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
873
874 // Test tear-down
875 packet_router.RemoveReceiveRtpModule(&receive_module);
876 packet_router.RemoveSendRtpModule(&send_module);
877}
878
879TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
880 rtc::ScopedFakeClock clock;
881 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200882 NiceMock<MockRtpRtcp> send_module;
883 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700884
885 constexpr bool remb_candidate = true;
886
887 // Send module active, receive module inactive.
888 packet_router.AddSendRtpModule(&send_module, remb_candidate);
889 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700890
891 // Send module removed - receive module becomes active.
892 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700893 constexpr uint32_t bitrate_estimate = 456;
894 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200895 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
896 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700897
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200898 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700899 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
900
901 // Test tear-down
902 packet_router.RemoveReceiveRtpModule(&receive_module);
903}
904
Stefan Holmere5904162015-03-26 11:11:06 +0100905} // namespace webrtc