blob: de2f342324dc3dd5de8580b6686dd5fefe41c208 [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>
Erik Språngf6468d22019-07-05 16:53:43 +020013#include <utility>
Stefan Holmere5904162015-03-26 11:11:06 +010014
Erik Språngf6468d22019-07-05 16:53:43 +020015#include "absl/memory/memory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010016#include "api/units/time_delta.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/pacing/packet_router.h"
Erik Språngf6468d22019-07-05 16:53:43 +020018#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
20#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
21#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "test/gmock.h"
24#include "test/gtest.h"
Stefan Holmere5904162015-03-26 11:11:06 +010025
Stefan Holmere5904162015-03-26 11:11:06 +010026namespace webrtc {
27
eladalon822ff2b2017-08-01 06:30:28 -070028// TODO(eladalon): Restructure and/or replace the existing monolithic tests
29// (only some of the test are monolithic) according to the new
30// guidelines - small tests for one thing at a time.
31// (I'm not removing any tests during CL, so as to demonstrate no regressions.)
32
eladalonb1338fe2017-08-01 09:36:19 -070033namespace {
danilchap47085372017-08-10 06:03:57 -070034
35using ::testing::_;
36using ::testing::AnyNumber;
37using ::testing::AtLeast;
38using ::testing::Field;
39using ::testing::Gt;
40using ::testing::Le;
41using ::testing::NiceMock;
Erik Språngf6468d22019-07-05 16:53:43 +020042using ::testing::Property;
danilchap47085372017-08-10 06:03:57 -070043using ::testing::Return;
44using ::testing::ReturnPointee;
45using ::testing::SaveArg;
46
eladalonb1338fe2017-08-01 09:36:19 -070047constexpr int kProbeMinProbes = 5;
48constexpr int kProbeMinBytes = 1000;
49
eladalonb1338fe2017-08-01 09:36:19 -070050} // namespace
eladalon822ff2b2017-08-01 06:30:28 -070051
eladalon32040ef2017-08-02 06:29:00 -070052TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPacket) {
53 PacketRouter packet_router;
54
55 constexpr uint16_t ssrc = 1234;
56 constexpr uint16_t sequence_number = 17;
57 constexpr uint64_t timestamp = 7890;
58 constexpr bool retransmission = false;
59 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
60
Erik Språngd2879622019-05-10 08:29:01 -070061 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
62 packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
63 retransmission, paced_info));
eladalon32040ef2017-08-02 06:29:00 -070064}
65
66TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
67 PacketRouter packet_router;
68
69 constexpr size_t bytes = 300;
70 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
71
72 EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
73}
74
75TEST(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
76 PacketRouter packet_router;
77
78 const std::vector<uint32_t> ssrcs = {1, 2, 3};
79 constexpr uint32_t bitrate_bps = 10000;
80
81 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
82}
83
84TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
85 PacketRouter packet_router;
86
87 const std::vector<uint32_t> ssrcs = {1, 2, 3};
88 constexpr uint32_t bitrate_bps = 10000;
89
90 EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
91}
92
93TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
94 PacketRouter packet_router;
95
96 rtcp::TransportFeedback feedback;
97
98 EXPECT_FALSE(packet_router.SendTransportFeedback(&feedback));
99}
100
eladalonb1338fe2017-08-01 09:36:19 -0700101TEST(PacketRouterTest, TimeToSendPacket) {
102 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700103 NiceMock<MockRtpRtcp> rtp_1;
104 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700105
106 packet_router.AddSendRtpModule(&rtp_1, false);
107 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100108
109 const uint16_t kSsrc1 = 1234;
110 uint16_t sequence_number = 17;
111 uint64_t timestamp = 7890;
112 bool retransmission = false;
113
114 // Send on the first module by letting rtp_1 be sending with correct ssrc.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200115 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
116 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
philipelc7bf32a2017-02-17 03:59:43 -0800117 EXPECT_CALL(rtp_1, TimeToSendPacket(
118 kSsrc1, sequence_number, timestamp, retransmission,
119 Field(&PacedPacketInfo::probe_cluster_id, 1)))
Stefan Holmere5904162015-03-26 11:11:06 +0100120 .Times(1)
Erik Språngd2879622019-05-10 08:29:01 -0700121 .WillOnce(Return(RtpPacketSendResult::kSuccess));
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200122 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700123 EXPECT_EQ(RtpPacketSendResult::kSuccess,
124 packet_router.TimeToSendPacket(
125 kSsrc1, sequence_number, timestamp, retransmission,
126 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100127
128 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
129 ++sequence_number;
130 timestamp += 30;
131 retransmission = true;
132 const uint16_t kSsrc2 = 4567;
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200133 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(false));
134 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
135 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
136 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800137 EXPECT_CALL(rtp_2, TimeToSendPacket(
138 kSsrc2, sequence_number, timestamp, retransmission,
139 Field(&PacedPacketInfo::probe_cluster_id, 2)))
Stefan Holmere5904162015-03-26 11:11:06 +0100140 .Times(1)
Erik Språngd2879622019-05-10 08:29:01 -0700141 .WillOnce(Return(RtpPacketSendResult::kSuccess));
142 EXPECT_EQ(RtpPacketSendResult::kSuccess,
143 packet_router.TimeToSendPacket(
144 kSsrc2, sequence_number, timestamp, retransmission,
145 PacedPacketInfo(2, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100146
147 // No module is sending, hence no packet should be sent.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200148 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(false));
149 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(false));
150 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
151 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700152 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
153 packet_router.TimeToSendPacket(
154 kSsrc1, sequence_number, timestamp, retransmission,
155 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100156
157 // Add a packet with incorrect ssrc and test it's dropped in the router.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200158 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
159 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
160 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
161 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
162 EXPECT_CALL(rtp_1, TimeToSendPacket).Times(0);
163 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700164 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
165 packet_router.TimeToSendPacket(
166 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
167 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100168
eladalonb1338fe2017-08-01 09:36:19 -0700169 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100170
171 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
172 // it is dropped as expected by not expecting any calls to rtp_1.
Danil Chapovalovdb59de32019-06-26 11:06:41 +0200173 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
174 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
175 EXPECT_CALL(rtp_2, TimeToSendPacket).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700176 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
177 packet_router.TimeToSendPacket(
178 kSsrc1, sequence_number, timestamp, retransmission,
179 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
180 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100181
eladalonb1338fe2017-08-01 09:36:19 -0700182 packet_router.RemoveSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +0100183}
184
eladalonb1338fe2017-08-01 09:36:19 -0700185TEST(PacketRouterTest, TimeToSendPadding) {
186 PacketRouter packet_router;
187
sprang867fb522015-08-03 04:38:41 -0700188 const uint16_t kSsrc1 = 1234;
189 const uint16_t kSsrc2 = 4567;
190
eladalon6c9556e2017-07-10 03:33:00 -0700191 NiceMock<MockRtpRtcp> rtp_1;
stefan16b02212017-01-27 07:12:16 -0800192 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
sprang867fb522015-08-03 04:38:41 -0700193 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
eladalon6c9556e2017-07-10 03:33:00 -0700194 NiceMock<MockRtpRtcp> rtp_2;
stefan16b02212017-01-27 07:12:16 -0800195 // rtp_2 will be prioritized for padding.
196 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
sprang867fb522015-08-03 04:38:41 -0700197 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
eladalonb1338fe2017-08-01 09:36:19 -0700198 packet_router.AddSendRtpModule(&rtp_1, false);
199 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100200
sprang867fb522015-08-03 04:38:41 -0700201 // Default configuration, sending padding on all modules sending media,
stefan16b02212017-01-27 07:12:16 -0800202 // ordered by priority (based on rtx mode).
Stefan Holmere5904162015-03-26 11:11:06 +0100203 const size_t requested_padding_bytes = 1000;
204 const size_t sent_padding_bytes = 890;
stefan16b02212017-01-27 07:12:16 -0800205 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800206 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800207 EXPECT_CALL(rtp_2,
208 TimeToSendPadding(requested_padding_bytes,
209 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmere5904162015-03-26 11:11:06 +0100210 .Times(1)
211 .WillOnce(Return(sent_padding_bytes));
stefan16b02212017-01-27 07:12:16 -0800212 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800213 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800214 EXPECT_CALL(rtp_1,
215 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
216 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang867fb522015-08-03 04:38:41 -0700217 .Times(1)
218 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
219 EXPECT_EQ(requested_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700220 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800221 requested_padding_bytes,
222 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100223
stefan16b02212017-01-27 07:12:16 -0800224 // Let only the lower priority module be sending and verify the padding
225 // request is routed there.
226 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
227 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
228 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800229 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
stefan16b02212017-01-27 07:12:16 -0800230 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmere5904162015-03-26 11:11:06 +0100231 .Times(1)
232 .WillOnce(Return(sent_padding_bytes));
233 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700234 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800235 requested_padding_bytes,
236 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
237 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100238
239 // No sending module at all.
240 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700241 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Stefan Holmere5904162015-03-26 11:11:06 +0100242 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700243 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200244 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
245 requested_padding_bytes,
246 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
247 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100248
stefan53b6cc32017-02-03 08:13:57 -0800249 // Only one module has BWE extensions.
250 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
251 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
252 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
253 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
254 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
255 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
256 .Times(1)
257 .WillOnce(Return(sent_padding_bytes));
258 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700259 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800260 requested_padding_bytes,
261 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
262 kProbeMinBytes)));
stefan53b6cc32017-02-03 08:13:57 -0800263
eladalonb1338fe2017-08-01 09:36:19 -0700264 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100265
266 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
267 // to send by not expecting any calls. Instead verify rtp_2 is called.
268 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800269 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700270 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
Yves Gerey665174f2018-06-19 15:03:05 +0200271 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
272 requested_padding_bytes,
273 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
274 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100275
eladalonb1338fe2017-08-01 09:36:19 -0700276 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100277}
278
Erik Språng478cb462019-06-26 15:49:27 +0200279TEST(PacketRouterTest, GeneratePaddingPicksCorrectModule) {
280 PacketRouter packet_router;
281
282 // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
283 // should not be called.
284 const uint16_t kSsrc1 = 1234;
285 const uint16_t kSsrc2 = 4567;
286
287 NiceMock<MockRtpRtcp> rtp_1;
288 ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
289 ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
290 ON_CALL(rtp_1, SendingMedia()).WillByDefault(Return(false));
291 ON_CALL(rtp_1, HasBweExtensions()).WillByDefault(Return(false));
292
293 NiceMock<MockRtpRtcp> rtp_2;
294 ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
295 ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
296 ON_CALL(rtp_2, SendingMedia()).WillByDefault(Return(true));
297 ON_CALL(rtp_2, HasBweExtensions()).WillByDefault(Return(true));
298
299 packet_router.AddSendRtpModule(&rtp_1, false);
300 packet_router.AddSendRtpModule(&rtp_2, false);
301
302 const size_t kPaddingSize = 123;
Erik Språngf6468d22019-07-05 16:53:43 +0200303 const size_t kExpectedPaddingPackets = 1;
Erik Språng478cb462019-06-26 15:49:27 +0200304 EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
Erik Språngf6468d22019-07-05 16:53:43 +0200305 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize))
306 .WillOnce([&](size_t padding_size) {
307 return std::vector<std::unique_ptr<RtpPacketToSend>>(
308 kExpectedPaddingPackets);
309 });
310 auto generated_padding = packet_router.GeneratePadding(kPaddingSize);
311 EXPECT_EQ(generated_padding.size(), kExpectedPaddingPackets);
Erik Språng478cb462019-06-26 15:49:27 +0200312
313 packet_router.RemoveSendRtpModule(&rtp_1);
314 packet_router.RemoveSendRtpModule(&rtp_2);
315}
316
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200317TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
318 PacketRouter packet_router;
319
320 const uint16_t kSsrc1 = 1234;
321 const uint16_t kSsrc2 = 4567;
322 const uint16_t kSsrc3 = 8901;
323
324 // First two rtp modules send media and have rtx.
325 NiceMock<MockRtpRtcp> rtp_1;
326 EXPECT_CALL(rtp_1, RtxSendStatus())
327 .WillRepeatedly(Return(kRtxRedundantPayloads));
328 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
329 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
330 EXPECT_CALL(rtp_1, HasBweExtensions()).WillRepeatedly(Return(true));
331
332 NiceMock<MockRtpRtcp> rtp_2;
333 EXPECT_CALL(rtp_2, RtxSendStatus())
334 .WillRepeatedly(Return(kRtxRedundantPayloads));
335 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
336 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
337 EXPECT_CALL(rtp_2, HasBweExtensions()).WillRepeatedly(Return(true));
338
339 // Third module is sending media, but does not support rtx.
340 NiceMock<MockRtpRtcp> rtp_3;
341 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
342 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
343 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
344 EXPECT_CALL(rtp_3, HasBweExtensions()).WillRepeatedly(Return(true));
345
346 packet_router.AddSendRtpModule(&rtp_1, false);
347 packet_router.AddSendRtpModule(&rtp_2, false);
348 packet_router.AddSendRtpModule(&rtp_3, false);
349
350 const size_t kPaddingBytes = 100;
351
352 // Initially, padding will be sent on last added rtp module that sends media
353 // and supports rtx.
354 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
355 .Times(1)
356 .WillOnce(Return(kPaddingBytes));
357 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
358
359 // Send media on first module. Padding should be sent on that module.
360 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
361 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
362
363 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
364 .Times(1)
365 .WillOnce(Return(kPaddingBytes));
366 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
367
368 // Send media on second module. Padding should be sent there.
369 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
370 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
371
372 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
373 .Times(1)
374 .WillOnce(Return(kPaddingBytes));
375 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
376
377 // Remove second module, padding should now fall back to first module.
378 packet_router.RemoveSendRtpModule(&rtp_2);
379 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
380 .Times(1)
381 .WillOnce(Return(kPaddingBytes));
382 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
383
384 // Remove first module too, leaving only the one without rtx.
385 packet_router.RemoveSendRtpModule(&rtp_1);
386
387 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
388 .Times(1)
389 .WillOnce(Return(kPaddingBytes));
390 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
391
392 packet_router.RemoveSendRtpModule(&rtp_3);
393}
394
eladalonb1338fe2017-08-01 09:36:19 -0700395TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
396 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700397 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700398 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100399 static const uint16_t kSsrc = 1234;
400 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
401 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
402
403 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700404 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
Erik Språngd2879622019-05-10 08:29:01 -0700405 EXPECT_EQ(RtpPacketSendResult::kPacketNotFound,
406 packet_router.TimeToSendPacket(
407 kSsrc, 1, 1, false,
408 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
409 kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100410 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700411 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
Yves Gerey665174f2018-06-19 15:03:05 +0200412 EXPECT_EQ(0u, packet_router.TimeToSendPadding(
413 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
414 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100415
eladalonb1338fe2017-08-01 09:36:19 -0700416 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100417}
sprang867fb522015-08-03 04:38:41 -0700418
eladalonb1338fe2017-08-01 09:36:19 -0700419TEST(PacketRouterTest, AllocateSequenceNumbers) {
420 PacketRouter packet_router;
421
sprang867fb522015-08-03 04:38:41 -0700422 const uint16_t kStartSeq = 0xFFF0;
423 const size_t kNumPackets = 32;
424
eladalonb1338fe2017-08-01 09:36:19 -0700425 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700426
427 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700428 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700429 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
430 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
431 }
432}
stefanbba9dec2016-02-01 04:39:55 -0800433
eladalonb1338fe2017-08-01 09:36:19 -0700434TEST(PacketRouterTest, SendTransportFeedback) {
435 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700436 NiceMock<MockRtpRtcp> rtp_1;
437 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700438
439 packet_router.AddSendRtpModule(&rtp_1, false);
440 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800441
442 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700443 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700444 packet_router.SendTransportFeedback(&feedback);
445 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700446 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700447 packet_router.SendTransportFeedback(&feedback);
448 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800449}
nisse05843312017-04-18 23:38:35 -0700450
eladalon822ff2b2017-08-01 06:30:28 -0700451#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700452TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
453 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700454 NiceMock<MockRtpRtcp> module;
455
456 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700457 packet_router.AddSendRtpModule(&module, remb_candidate);
458 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700459
460 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700461 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700462}
463
eladalonb1338fe2017-08-01 09:36:19 -0700464TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
465 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700466 NiceMock<MockRtpRtcp> module;
467
468 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700469 packet_router.AddReceiveRtpModule(&module, remb_candidate);
470 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700471
472 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700473 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700474}
475
eladalonb1338fe2017-08-01 09:36:19 -0700476TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
477 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700478 NiceMock<MockRtpRtcp> module;
479
eladalonb1338fe2017-08-01 09:36:19 -0700480 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700481}
482
eladalonb1338fe2017-08-01 09:36:19 -0700483TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
484 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700485 NiceMock<MockRtpRtcp> module;
486
eladalonb1338fe2017-08-01 09:36:19 -0700487 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700488}
489#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
490
nisse05843312017-04-18 23:38:35 -0700491TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
492 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200493 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700494 PacketRouter packet_router;
495
eladalon822ff2b2017-08-01 06:30:28 -0700496 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700497
498 uint32_t bitrate_estimate = 456;
499 const std::vector<uint32_t> ssrcs = {1234};
500
nisse05843312017-04-18 23:38:35 -0700501 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
502
503 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200504 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200505 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700506 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
507
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200508 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700509 // away.
510 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200511 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700512 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
513
nisse05843312017-04-18 23:38:35 -0700514 packet_router.RemoveSendRtpModule(&rtp);
515}
516
517TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
518 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700519 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700520 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700521 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700522
523 uint32_t bitrate_estimate[] = {456, 789};
524 std::vector<uint32_t> ssrcs = {1234, 5678};
525
nisse05843312017-04-18 23:38:35 -0700526 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
527
528 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200529 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200530 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700531 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
532
533 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
534
535 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200536 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700537 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
538
539 packet_router.RemoveSendRtpModule(&rtp);
540}
541
542TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
543 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700544 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700545 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700546 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700547
548 uint32_t bitrate_estimate = 456;
549 std::vector<uint32_t> ssrcs = {1234, 5678};
550
nisse05843312017-04-18 23:38:35 -0700551 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
552
553 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200554 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200555 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700556 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
557
558 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200559 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700560 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
561
562 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200563 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700564 int lower_estimate = bitrate_estimate * 98 / 100;
565 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
566
567 packet_router.RemoveSendRtpModule(&rtp);
568}
569
570TEST(PacketRouterRembTest, ChangeSendRtpModule) {
571 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700572 NiceMock<MockRtpRtcp> rtp_send;
573 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700574 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700575 packet_router.AddSendRtpModule(&rtp_send, true);
576 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700577
578 uint32_t bitrate_estimate = 456;
579 std::vector<uint32_t> ssrcs = {1234, 5678};
580
nisse05843312017-04-18 23:38:35 -0700581 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
582
583 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200584 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200585 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700586 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
587
588 // Decrease estimate to trigger a REMB.
589 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200590 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700591 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
592
593 // Remove the sending module -> should get remb on the second module.
594 packet_router.RemoveSendRtpModule(&rtp_send);
595
nisse05843312017-04-18 23:38:35 -0700596 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
597
598 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200599 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700600 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
601
602 packet_router.RemoveReceiveRtpModule(&rtp_recv);
603}
604
605TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
606 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700607 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700608 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700609 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700610
611 uint32_t bitrate_estimate = 456;
612 const std::vector<uint32_t> ssrcs = {1234};
613
nisse05843312017-04-18 23:38:35 -0700614 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
615
616 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200617 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200618 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700619 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
620
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200621 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700622 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200623 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700624 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
625
626 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200627 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700628 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
629 packet_router.RemoveSendRtpModule(&rtp);
630}
631
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200632TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700633 rtc::ScopedFakeClock clock;
634 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200635 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200636 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700637 constexpr bool remb_candidate = true;
638 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700639
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100640 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200641 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
642 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700643
644 const std::vector<uint32_t> ssrcs = {1234};
645 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
646 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200647 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700648 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
649
650 // Test tear-down.
651 packet_router.RemoveSendRtpModule(&remb_sender);
652}
653
654TEST(PacketRouterRembTest,
655 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
656 rtc::ScopedFakeClock clock;
657 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200658 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200659 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700660 constexpr bool remb_candidate = true;
661 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700662
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100663 const int64_t measured_bitrate_bps = 150000;
664 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700665 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200666 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700667 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
668
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200669 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700670 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
671
672 // Test tear-down.
673 packet_router.RemoveSendRtpModule(&remb_sender);
674}
675
676TEST(PacketRouterRembTest,
677 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
678 rtc::ScopedFakeClock clock;
679 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200680 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200681 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700682 constexpr bool remb_candidate = true;
683 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700684
685 const uint32_t measured_bitrate_bps = 150000;
686 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
687 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200688 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700689 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
690
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200691 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700692 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
693
694 // Test tear-down.
695 packet_router.RemoveSendRtpModule(&remb_sender);
696}
697
698TEST(PacketRouterRembTest,
699 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
700 rtc::ScopedFakeClock clock;
701 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200702 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200703 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700704 constexpr bool remb_candidate = true;
705 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700706
707 const uint32_t measured_bitrate_bps = 150000;
708 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
709 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200710 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700711 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
712
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200713 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700714 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
715
716 // Test tear-down.
717 packet_router.RemoveSendRtpModule(&remb_sender);
718}
719
720TEST(PacketRouterRembTest,
721 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
722 rtc::ScopedFakeClock clock;
723 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200724 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200725 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700726 constexpr bool remb_candidate = true;
727 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700728
729 const uint32_t measured_bitrate_bps = 150000;
730 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
731 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200732 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700733 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200734 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700735
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200736 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700737 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
738
739 // Test tear-down.
740 packet_router.RemoveSendRtpModule(&remb_sender);
741}
742
743TEST(PacketRouterRembTest,
744 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
745 rtc::ScopedFakeClock clock;
746 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200747 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200748 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700749 constexpr bool remb_candidate = true;
750 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700751
752 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200753 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700754 packet_router.SetMaxDesiredReceiveBitrate(100000);
755 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200756 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700757 packet_router.SetMaxDesiredReceiveBitrate(200000);
758 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200759 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700760 packet_router.SetMaxDesiredReceiveBitrate(150000);
761
762 // Test tear-down.
763 packet_router.RemoveSendRtpModule(&remb_sender);
764}
765
nisse05843312017-04-18 23:38:35 -0700766// Only register receiving modules and make sure we fallback to trigger a REMB
767// packet on this one.
768TEST(PacketRouterRembTest, NoSendingRtpModule) {
769 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700770 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700771 PacketRouter packet_router;
772
eladalon822ff2b2017-08-01 06:30:28 -0700773 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700774
775 uint32_t bitrate_estimate = 456;
776 const std::vector<uint32_t> ssrcs = {1234};
777
nisse05843312017-04-18 23:38:35 -0700778 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
779
780 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200781 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200782 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700783 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
784
785 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200786 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700787 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
788
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200789 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700790 packet_router.RemoveReceiveRtpModule(&rtp);
791}
792
eladalon822ff2b2017-08-01 06:30:28 -0700793TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
794 rtc::ScopedFakeClock clock;
795 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200796 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700797
798 constexpr bool remb_candidate = false;
799
800 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700801
802 constexpr uint32_t bitrate_estimate = 456;
803 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200804 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200805 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700806 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
807
808 // Test tear-down
809 packet_router.RemoveSendRtpModule(&module);
810}
811
812TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
813 rtc::ScopedFakeClock clock;
814 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200815 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700816
817 constexpr bool remb_candidate = true;
818
819 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700820
821 constexpr uint32_t bitrate_estimate = 456;
822 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200823 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200824 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700825 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
826
827 // Test tear-down
828 packet_router.RemoveSendRtpModule(&module);
829}
830
831TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
832 rtc::ScopedFakeClock clock;
833 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200834 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700835
836 constexpr bool remb_candidate = false;
837
838 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700839
840 constexpr uint32_t bitrate_estimate = 456;
841 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200842 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
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(&module);
848}
849
850TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
851 rtc::ScopedFakeClock clock;
852 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200853 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700854
855 constexpr bool remb_candidate = true;
856
857 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700858
859 constexpr uint32_t bitrate_estimate = 456;
860 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200861 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200862 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700863 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
864
865 // Test tear-down
866 packet_router.RemoveReceiveRtpModule(&module);
867}
868
869TEST(PacketRouterRembTest,
870 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
871 rtc::ScopedFakeClock clock;
872 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200873 NiceMock<MockRtpRtcp> send_module;
874 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700875
876 constexpr bool remb_candidate = true;
877
878 // Send module added - activated.
879 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700880
881 // Receive module added - the send module remains the active one.
882 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700883
884 constexpr uint32_t bitrate_estimate = 456;
885 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200886 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
887 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700888
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200889 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700890 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
891
892 // Test tear-down
893 packet_router.RemoveReceiveRtpModule(&receive_module);
894 packet_router.RemoveSendRtpModule(&send_module);
895}
896
897TEST(PacketRouterRembTest,
898 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
899 rtc::ScopedFakeClock clock;
900 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200901 NiceMock<MockRtpRtcp> send_module;
902 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700903
904 constexpr bool remb_candidate = true;
905
906 // Receive module added - activated.
907 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700908
909 // Send module added - replaces receive module as active.
910 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700911
912 constexpr uint32_t bitrate_estimate = 456;
913 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200914 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
915 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700916
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200917 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700918 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
919
920 // Test tear-down
921 packet_router.RemoveReceiveRtpModule(&receive_module);
922 packet_router.RemoveSendRtpModule(&send_module);
923}
924
925TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
926 rtc::ScopedFakeClock clock;
927 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200928 NiceMock<MockRtpRtcp> send_module;
929 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700930
931 constexpr bool remb_candidate = true;
932
933 // Send module active, receive module inactive.
934 packet_router.AddSendRtpModule(&send_module, remb_candidate);
935 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700936
937 // Send module removed - receive module becomes active.
938 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700939 constexpr uint32_t bitrate_estimate = 456;
940 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200941 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
942 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700943
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200944 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700945 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
946
947 // Test tear-down
948 packet_router.RemoveReceiveRtpModule(&receive_module);
949}
950
Erik Språngf6468d22019-07-05 16:53:43 +0200951TEST(PacketRouterTest, SendPacketWithoutTransportSequenceNumbers) {
952 PacketRouter packet_router;
953 NiceMock<MockRtpRtcp> rtp_1;
954 packet_router.AddSendRtpModule(&rtp_1, false);
955
956 const uint16_t kSsrc1 = 1234;
957 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
958 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
959
960 // Send a packet without TransportSequenceNumber extension registered,
961 // packets sent should not have the extension set.
962 RtpHeaderExtensionMap extension_manager;
963 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
964 packet->SetSsrc(kSsrc1);
965 EXPECT_CALL(
966 rtp_1,
967 TrySendPacket(
968 Property(&RtpPacketToSend::HasExtension<TransportSequenceNumber>,
969 false),
970 _))
971 .WillOnce(Return(true));
972 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
973
974 packet_router.RemoveSendRtpModule(&rtp_1);
975}
976
977TEST(PacketRouterTest, SendPacketAssignsTransportSequenceNumbers) {
978 PacketRouter packet_router;
979 NiceMock<MockRtpRtcp> rtp_1;
980 NiceMock<MockRtpRtcp> rtp_2;
981
982 packet_router.AddSendRtpModule(&rtp_1, false);
983 packet_router.AddSendRtpModule(&rtp_2, false);
984
985 const uint16_t kSsrc1 = 1234;
986 const uint16_t kSsrc2 = 2345;
987
988 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
989 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
990 ON_CALL(rtp_2, SendingMedia).WillByDefault(Return(true));
991 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
992
993 RtpHeaderExtensionMap extension_manager;
994 const int kTransportSequenceNumberExtensionId = 1;
995 extension_manager.Register(kRtpExtensionTransportSequenceNumber,
996 kTransportSequenceNumberExtensionId);
997
998 uint16_t transport_sequence_number = 0;
999
1000 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
1001 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
1002 packet->SetSsrc(kSsrc1);
1003 EXPECT_CALL(
1004 rtp_1,
1005 TrySendPacket(
1006 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
1007 transport_sequence_number),
1008 _))
1009 .WillOnce(Return(true));
1010 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
1011
1012 ++transport_sequence_number;
1013 packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
1014 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
1015 packet->SetSsrc(kSsrc2);
1016
1017 // There will be a failed attempt to send on kSsrc1 before trying
1018 // the correct RTP module.
1019 EXPECT_CALL(rtp_1, TrySendPacket).WillOnce(Return(false));
1020 EXPECT_CALL(
1021 rtp_2,
1022 TrySendPacket(
1023 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
1024 transport_sequence_number),
1025 _))
1026 .WillOnce(Return(true));
1027 packet_router.SendPacket(std::move(packet), PacedPacketInfo());
1028
1029 packet_router.RemoveSendRtpModule(&rtp_1);
1030 packet_router.RemoveSendRtpModule(&rtp_2);
1031}
1032
Stefan Holmere5904162015-03-26 11:11:06 +01001033} // namespace webrtc