blob: 34b533bbe4fc117567df37175674e2ce52318cdc [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
11#include <list>
kwiberg22feaa32016-03-17 09:17:43 -070012#include <memory>
Stefan Holmere5904162015-03-26 11:11:06 +010013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/pacing/packet_router.h"
15#include "modules/rtp_rtcp/include/rtp_rtcp.h"
16#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"
19#include "rtc_base/fakeclock.h"
20#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);
philipelc7bf32a2017-02-17 03:59:43 -0800237 EXPECT_EQ(0u,
eladalonb1338fe2017-08-01 09:36:19 -0700238 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800239 requested_padding_bytes,
240 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
241 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100242
stefan53b6cc32017-02-03 08:13:57 -0800243 // Only one module has BWE extensions.
244 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
245 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
246 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
247 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
248 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
249 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
250 .Times(1)
251 .WillOnce(Return(sent_padding_bytes));
252 EXPECT_EQ(sent_padding_bytes,
eladalonb1338fe2017-08-01 09:36:19 -0700253 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800254 requested_padding_bytes,
255 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
256 kProbeMinBytes)));
stefan53b6cc32017-02-03 08:13:57 -0800257
eladalonb1338fe2017-08-01 09:36:19 -0700258 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100259
260 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
261 // to send by not expecting any calls. Instead verify rtp_2 is called.
262 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800263 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700264 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
philipelc7bf32a2017-02-17 03:59:43 -0800265 EXPECT_EQ(0u,
eladalonb1338fe2017-08-01 09:36:19 -0700266 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800267 requested_padding_bytes,
268 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
269 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100270
eladalonb1338fe2017-08-01 09:36:19 -0700271 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100272}
273
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200274TEST(PacketRouterTest, PadsOnLastActiveMediaStream) {
275 PacketRouter packet_router;
276
277 const uint16_t kSsrc1 = 1234;
278 const uint16_t kSsrc2 = 4567;
279 const uint16_t kSsrc3 = 8901;
280
281 // First two rtp modules send media and have rtx.
282 NiceMock<MockRtpRtcp> rtp_1;
283 EXPECT_CALL(rtp_1, RtxSendStatus())
284 .WillRepeatedly(Return(kRtxRedundantPayloads));
285 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
286 EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
287 EXPECT_CALL(rtp_1, HasBweExtensions()).WillRepeatedly(Return(true));
288
289 NiceMock<MockRtpRtcp> rtp_2;
290 EXPECT_CALL(rtp_2, RtxSendStatus())
291 .WillRepeatedly(Return(kRtxRedundantPayloads));
292 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
293 EXPECT_CALL(rtp_2, SendingMedia()).WillRepeatedly(Return(true));
294 EXPECT_CALL(rtp_2, HasBweExtensions()).WillRepeatedly(Return(true));
295
296 // Third module is sending media, but does not support rtx.
297 NiceMock<MockRtpRtcp> rtp_3;
298 EXPECT_CALL(rtp_3, RtxSendStatus()).WillRepeatedly(Return(kRtxOff));
299 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
300 EXPECT_CALL(rtp_3, SendingMedia()).WillRepeatedly(Return(true));
301 EXPECT_CALL(rtp_3, HasBweExtensions()).WillRepeatedly(Return(true));
302
303 packet_router.AddSendRtpModule(&rtp_1, false);
304 packet_router.AddSendRtpModule(&rtp_2, false);
305 packet_router.AddSendRtpModule(&rtp_3, false);
306
307 const size_t kPaddingBytes = 100;
308
309 // Initially, padding will be sent on last added rtp module that sends media
310 // and supports rtx.
311 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
312 .Times(1)
313 .WillOnce(Return(kPaddingBytes));
314 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
315
316 // Send media on first module. Padding should be sent on that module.
317 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, _, _, _, _));
318 packet_router.TimeToSendPacket(kSsrc1, 0, 0, false, PacedPacketInfo());
319
320 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
321 .Times(1)
322 .WillOnce(Return(kPaddingBytes));
323 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
324
325 // Send media on second module. Padding should be sent there.
326 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, _, _, _, _));
327 packet_router.TimeToSendPacket(kSsrc2, 0, 0, false, PacedPacketInfo());
328
329 EXPECT_CALL(rtp_2, TimeToSendPadding(kPaddingBytes, _))
330 .Times(1)
331 .WillOnce(Return(kPaddingBytes));
332 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
333
334 // Remove second module, padding should now fall back to first module.
335 packet_router.RemoveSendRtpModule(&rtp_2);
336 EXPECT_CALL(rtp_1, TimeToSendPadding(kPaddingBytes, _))
337 .Times(1)
338 .WillOnce(Return(kPaddingBytes));
339 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
340
341 // Remove first module too, leaving only the one without rtx.
342 packet_router.RemoveSendRtpModule(&rtp_1);
343
344 EXPECT_CALL(rtp_3, TimeToSendPadding(kPaddingBytes, _))
345 .Times(1)
346 .WillOnce(Return(kPaddingBytes));
347 packet_router.TimeToSendPadding(kPaddingBytes, PacedPacketInfo());
348
349 packet_router.RemoveSendRtpModule(&rtp_3);
350}
351
eladalonb1338fe2017-08-01 09:36:19 -0700352TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
353 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700354 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700355 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100356 static const uint16_t kSsrc = 1234;
357 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
358 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
359
360 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700361 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalonb1338fe2017-08-01 09:36:19 -0700362 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800363 kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
364 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100365 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700366 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800367 EXPECT_EQ(0u,
eladalonb1338fe2017-08-01 09:36:19 -0700368 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800369 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
370 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100371
eladalonb1338fe2017-08-01 09:36:19 -0700372 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100373}
sprang867fb522015-08-03 04:38:41 -0700374
eladalonb1338fe2017-08-01 09:36:19 -0700375TEST(PacketRouterTest, AllocateSequenceNumbers) {
376 PacketRouter packet_router;
377
sprang867fb522015-08-03 04:38:41 -0700378 const uint16_t kStartSeq = 0xFFF0;
379 const size_t kNumPackets = 32;
380
eladalonb1338fe2017-08-01 09:36:19 -0700381 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700382
383 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700384 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700385 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
386 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
387 }
388}
stefanbba9dec2016-02-01 04:39:55 -0800389
eladalonb1338fe2017-08-01 09:36:19 -0700390TEST(PacketRouterTest, SendTransportFeedback) {
391 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700392 NiceMock<MockRtpRtcp> rtp_1;
393 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700394
395 packet_router.AddSendRtpModule(&rtp_1, false);
396 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800397
398 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700399 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700400 packet_router.SendTransportFeedback(&feedback);
401 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700402 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700403 packet_router.SendTransportFeedback(&feedback);
404 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800405}
nisse05843312017-04-18 23:38:35 -0700406
eladalon822ff2b2017-08-01 06:30:28 -0700407#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalonb1338fe2017-08-01 09:36:19 -0700408TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
409 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700410 NiceMock<MockRtpRtcp> module;
411
412 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700413 packet_router.AddSendRtpModule(&module, remb_candidate);
414 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700415
416 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700417 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700418}
419
eladalonb1338fe2017-08-01 09:36:19 -0700420TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
421 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700422 NiceMock<MockRtpRtcp> module;
423
424 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700425 packet_router.AddReceiveRtpModule(&module, remb_candidate);
426 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700427
428 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700429 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700430}
431
eladalonb1338fe2017-08-01 09:36:19 -0700432TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
433 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700434 NiceMock<MockRtpRtcp> module;
435
eladalonb1338fe2017-08-01 09:36:19 -0700436 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700437}
438
eladalonb1338fe2017-08-01 09:36:19 -0700439TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
440 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700441 NiceMock<MockRtpRtcp> module;
442
eladalonb1338fe2017-08-01 09:36:19 -0700443 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700444}
445#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
446
nisse05843312017-04-18 23:38:35 -0700447TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
448 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200449 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700450 PacketRouter packet_router;
451
eladalon822ff2b2017-08-01 06:30:28 -0700452 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700453
454 uint32_t bitrate_estimate = 456;
455 const std::vector<uint32_t> ssrcs = {1234};
456
nisse05843312017-04-18 23:38:35 -0700457 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
458
459 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200460 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200461 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700462 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
463
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200464 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700465 // away.
466 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200467 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700468 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
469
nisse05843312017-04-18 23:38:35 -0700470 packet_router.RemoveSendRtpModule(&rtp);
471}
472
473TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
474 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700475 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700476 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700477 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700478
479 uint32_t bitrate_estimate[] = {456, 789};
480 std::vector<uint32_t> ssrcs = {1234, 5678};
481
nisse05843312017-04-18 23:38:35 -0700482 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
483
484 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200485 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200486 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700487 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
488
489 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
490
491 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200492 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700493 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
494
495 packet_router.RemoveSendRtpModule(&rtp);
496}
497
498TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
499 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700500 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700501 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700502 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700503
504 uint32_t bitrate_estimate = 456;
505 std::vector<uint32_t> ssrcs = {1234, 5678};
506
nisse05843312017-04-18 23:38:35 -0700507 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
508
509 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200510 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200511 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700512 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
513
514 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200515 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700516 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
517
518 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200519 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700520 int lower_estimate = bitrate_estimate * 98 / 100;
521 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
522
523 packet_router.RemoveSendRtpModule(&rtp);
524}
525
526TEST(PacketRouterRembTest, ChangeSendRtpModule) {
527 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700528 NiceMock<MockRtpRtcp> rtp_send;
529 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700530 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700531 packet_router.AddSendRtpModule(&rtp_send, true);
532 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700533
534 uint32_t bitrate_estimate = 456;
535 std::vector<uint32_t> ssrcs = {1234, 5678};
536
nisse05843312017-04-18 23:38:35 -0700537 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
538
539 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200540 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200541 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700542 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
543
544 // Decrease estimate to trigger a REMB.
545 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200546 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700547 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
548
549 // Remove the sending module -> should get remb on the second module.
550 packet_router.RemoveSendRtpModule(&rtp_send);
551
nisse05843312017-04-18 23:38:35 -0700552 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
553
554 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200555 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700556 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
557
558 packet_router.RemoveReceiveRtpModule(&rtp_recv);
559}
560
561TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
562 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700563 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700564 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700565 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700566
567 uint32_t bitrate_estimate = 456;
568 const std::vector<uint32_t> ssrcs = {1234};
569
nisse05843312017-04-18 23:38:35 -0700570 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
571
572 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200573 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200574 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700575 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
576
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200577 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700578 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200579 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700580 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
581
582 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200583 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700584 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
585 packet_router.RemoveSendRtpModule(&rtp);
586}
587
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200588TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700589 rtc::ScopedFakeClock clock;
590 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200591 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200592 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700593 constexpr bool remb_candidate = true;
594 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700595
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100596 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200597 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
598 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700599
600 const std::vector<uint32_t> ssrcs = {1234};
601 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
602 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200603 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700604 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
605
606 // Test tear-down.
607 packet_router.RemoveSendRtpModule(&remb_sender);
608}
609
610TEST(PacketRouterRembTest,
611 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
612 rtc::ScopedFakeClock clock;
613 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200614 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200615 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700616 constexpr bool remb_candidate = true;
617 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700618
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100619 const int64_t measured_bitrate_bps = 150000;
620 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700621 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200622 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700623 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
624
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200625 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700626 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
627
628 // Test tear-down.
629 packet_router.RemoveSendRtpModule(&remb_sender);
630}
631
632TEST(PacketRouterRembTest,
633 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
634 rtc::ScopedFakeClock clock;
635 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200636 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200637 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700638 constexpr bool remb_candidate = true;
639 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700640
641 const uint32_t measured_bitrate_bps = 150000;
642 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
643 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200644 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700645 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
646
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200647 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700648 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
649
650 // Test tear-down.
651 packet_router.RemoveSendRtpModule(&remb_sender);
652}
653
654TEST(PacketRouterRembTest,
655 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
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
663 const uint32_t measured_bitrate_bps = 150000;
664 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
665 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(_, _)).Times(0);
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 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
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 + 5000;
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);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200690 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700691
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200692 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700693 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
694
695 // Test tear-down.
696 packet_router.RemoveSendRtpModule(&remb_sender);
697}
698
699TEST(PacketRouterRembTest,
700 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
701 rtc::ScopedFakeClock clock;
702 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200703 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200704 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700705 constexpr bool remb_candidate = true;
706 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700707
708 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200709 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700710 packet_router.SetMaxDesiredReceiveBitrate(100000);
711 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200712 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700713 packet_router.SetMaxDesiredReceiveBitrate(200000);
714 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200715 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700716 packet_router.SetMaxDesiredReceiveBitrate(150000);
717
718 // Test tear-down.
719 packet_router.RemoveSendRtpModule(&remb_sender);
720}
721
nisse05843312017-04-18 23:38:35 -0700722// Only register receiving modules and make sure we fallback to trigger a REMB
723// packet on this one.
724TEST(PacketRouterRembTest, NoSendingRtpModule) {
725 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700726 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700727 PacketRouter packet_router;
728
eladalon822ff2b2017-08-01 06:30:28 -0700729 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700730
731 uint32_t bitrate_estimate = 456;
732 const std::vector<uint32_t> ssrcs = {1234};
733
nisse05843312017-04-18 23:38:35 -0700734 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
735
736 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200737 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200738 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700739 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
740
741 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200742 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700743 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
744
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200745 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700746 packet_router.RemoveReceiveRtpModule(&rtp);
747}
748
eladalon822ff2b2017-08-01 06:30:28 -0700749TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
750 rtc::ScopedFakeClock clock;
751 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200752 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700753
754 constexpr bool remb_candidate = false;
755
756 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700757
758 constexpr uint32_t bitrate_estimate = 456;
759 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200760 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200761 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700762 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
763
764 // Test tear-down
765 packet_router.RemoveSendRtpModule(&module);
766}
767
768TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
769 rtc::ScopedFakeClock clock;
770 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200771 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700772
773 constexpr bool remb_candidate = true;
774
775 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700776
777 constexpr uint32_t bitrate_estimate = 456;
778 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200779 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200780 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700781 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
782
783 // Test tear-down
784 packet_router.RemoveSendRtpModule(&module);
785}
786
787TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
788 rtc::ScopedFakeClock clock;
789 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200790 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700791
792 constexpr bool remb_candidate = false;
793
794 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700795
796 constexpr uint32_t bitrate_estimate = 456;
797 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200798 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200799 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700800 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
801
802 // Test tear-down
803 packet_router.RemoveReceiveRtpModule(&module);
804}
805
806TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
807 rtc::ScopedFakeClock clock;
808 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200809 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700810
811 constexpr bool remb_candidate = true;
812
813 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700814
815 constexpr uint32_t bitrate_estimate = 456;
816 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200817 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200818 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700819 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
820
821 // Test tear-down
822 packet_router.RemoveReceiveRtpModule(&module);
823}
824
825TEST(PacketRouterRembTest,
826 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
827 rtc::ScopedFakeClock clock;
828 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200829 NiceMock<MockRtpRtcp> send_module;
830 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700831
832 constexpr bool remb_candidate = true;
833
834 // Send module added - activated.
835 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700836
837 // Receive module added - the send module remains the active one.
838 packet_router.AddReceiveRtpModule(&receive_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(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
843 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700844
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200845 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700846 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
847
848 // Test tear-down
849 packet_router.RemoveReceiveRtpModule(&receive_module);
850 packet_router.RemoveSendRtpModule(&send_module);
851}
852
853TEST(PacketRouterRembTest,
854 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
855 rtc::ScopedFakeClock clock;
856 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200857 NiceMock<MockRtpRtcp> send_module;
858 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700859
860 constexpr bool remb_candidate = true;
861
862 // Receive module added - activated.
863 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700864
865 // Send module added - replaces receive module as active.
866 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700867
868 constexpr uint32_t bitrate_estimate = 456;
869 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200870 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
871 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700872
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200873 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700874 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
875
876 // Test tear-down
877 packet_router.RemoveReceiveRtpModule(&receive_module);
878 packet_router.RemoveSendRtpModule(&send_module);
879}
880
881TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
882 rtc::ScopedFakeClock clock;
883 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200884 NiceMock<MockRtpRtcp> send_module;
885 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700886
887 constexpr bool remb_candidate = true;
888
889 // Send module active, receive module inactive.
890 packet_router.AddSendRtpModule(&send_module, remb_candidate);
891 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700892
893 // Send module removed - receive module becomes active.
894 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700895 constexpr uint32_t bitrate_estimate = 456;
896 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200897 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
898 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700899
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200900 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700901 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
902
903 // Test tear-down
904 packet_router.RemoveReceiveRtpModule(&receive_module);
905}
906
Stefan Holmere5904162015-03-26 11:11:06 +0100907} // namespace webrtc