blob: 3fd9882207422bc622a044d1c5ecf7e6aae11300 [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/pacing/packet_router.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <cstddef>
14#include <cstdint>
Mirko Bonadei317a1f02019-09-17 17:06:18 +020015#include <memory>
Erik Språngf6468d22019-07-05 16:53:43 +020016#include <utility>
Stefan Holmere5904162015-03-26 11:11:06 +010017
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/units/time_delta.h"
Erik Språngf6468d22019-07-05 16:53:43 +020019#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
21#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
22#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080023#include "rtc_base/fake_clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/gmock.h"
25#include "test/gtest.h"
Stefan Holmere5904162015-03-26 11:11:06 +010026
Stefan Holmere5904162015-03-26 11:11:06 +010027namespace webrtc {
28
eladalon822ff2b2017-08-01 06:30:28 -070029// TODO(eladalon): Restructure and/or replace the existing monolithic tests
30// (only some of the test are monolithic) according to the new
31// guidelines - small tests for one thing at a time.
32// (I'm not removing any tests during CL, so as to demonstrate no regressions.)
33
eladalonb1338fe2017-08-01 09:36:19 -070034namespace {
danilchap47085372017-08-10 06:03:57 -070035
36using ::testing::_;
37using ::testing::AnyNumber;
38using ::testing::AtLeast;
39using ::testing::Field;
40using ::testing::Gt;
41using ::testing::Le;
42using ::testing::NiceMock;
Erik Språngf6468d22019-07-05 16:53:43 +020043using ::testing::Property;
danilchap47085372017-08-10 06:03:57 -070044using ::testing::Return;
danilchap47085372017-08-10 06:03:57 -070045using ::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
Erik Språng4208a132019-08-26 08:58:45 +020052class PacketRouterTest : public ::testing::Test {
53 public:
54 PacketRouterTest() {
Danil Chapovalova74e4772019-09-12 17:53:04 +020055 extension_manager.Register<TransportSequenceNumber>(/*id=*/1);
Erik Språng4208a132019-08-26 08:58:45 +020056 }
eladalon32040ef2017-08-02 06:29:00 -070057
Erik Språng4208a132019-08-26 08:58:45 +020058 protected:
59 std::unique_ptr<RtpPacketToSend> BuildRtpPacket(uint32_t ssrc) {
60 std::unique_ptr<RtpPacketToSend> packet =
Mirko Bonadei317a1f02019-09-17 17:06:18 +020061 std::make_unique<RtpPacketToSend>(&extension_manager);
Erik Språng4208a132019-08-26 08:58:45 +020062 packet->SetSsrc(ssrc);
63 return packet;
64 }
eladalon32040ef2017-08-02 06:29:00 -070065
Erik Språng4208a132019-08-26 08:58:45 +020066 PacketRouter packet_router_;
67 RtpHeaderExtensionMap extension_manager;
68};
eladalon32040ef2017-08-02 06:29:00 -070069
Erik Språng4208a132019-08-26 08:58:45 +020070TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_GeneratePadding) {
eladalon32040ef2017-08-02 06:29:00 -070071 constexpr size_t bytes = 300;
72 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
73
Erik Språng4208a132019-08-26 08:58:45 +020074 EXPECT_TRUE(packet_router_.GeneratePadding(bytes).empty());
eladalon32040ef2017-08-02 06:29:00 -070075}
76
Erik Språng4208a132019-08-26 08:58:45 +020077TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
eladalon32040ef2017-08-02 06:29:00 -070078 const std::vector<uint32_t> ssrcs = {1, 2, 3};
79 constexpr uint32_t bitrate_bps = 10000;
80
Erik Språng4208a132019-08-26 08:58:45 +020081 packet_router_.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
eladalon32040ef2017-08-02 06:29:00 -070082}
83
Erik Språng4208a132019-08-26 08:58:45 +020084TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
eladalon32040ef2017-08-02 06:29:00 -070085 const std::vector<uint32_t> ssrcs = {1, 2, 3};
86 constexpr uint32_t bitrate_bps = 10000;
87
Erik Språng4208a132019-08-26 08:58:45 +020088 EXPECT_FALSE(packet_router_.SendRemb(bitrate_bps, ssrcs));
eladalon32040ef2017-08-02 06:29:00 -070089}
90
Erik Språng4208a132019-08-26 08:58:45 +020091TEST_F(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
Per Kjellanderee153c92019-10-10 16:43:46 +020092 std::vector<std::unique_ptr<rtcp::RtcpPacket>> feedback;
93 feedback.push_back(std::make_unique<rtcp::TransportFeedback>());
eladalon32040ef2017-08-02 06:29:00 -070094
Per Kjellanderee153c92019-10-10 16:43:46 +020095 EXPECT_FALSE(packet_router_.SendCombinedRtcpPacket(std::move(feedback)));
eladalon32040ef2017-08-02 06:29:00 -070096}
97
Erik Språng4208a132019-08-26 08:58:45 +020098TEST_F(PacketRouterTest, GeneratePaddingPicksCorrectModule) {
Erik Språng478cb462019-06-26 15:49:27 +020099 // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
100 // should not be called.
101 const uint16_t kSsrc1 = 1234;
102 const uint16_t kSsrc2 = 4567;
103
104 NiceMock<MockRtpRtcp> rtp_1;
105 ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
106 ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000107 ON_CALL(rtp_1, SupportsPadding).WillByDefault(Return(false));
Erik Språng478cb462019-06-26 15:49:27 +0200108
109 NiceMock<MockRtpRtcp> rtp_2;
110 ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
111 ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000112 ON_CALL(rtp_2, SupportsPadding).WillByDefault(Return(true));
Erik Språng478cb462019-06-26 15:49:27 +0200113
Erik Språng4208a132019-08-26 08:58:45 +0200114 packet_router_.AddSendRtpModule(&rtp_1, false);
115 packet_router_.AddSendRtpModule(&rtp_2, false);
Erik Språng478cb462019-06-26 15:49:27 +0200116
117 const size_t kPaddingSize = 123;
Erik Språngf6468d22019-07-05 16:53:43 +0200118 const size_t kExpectedPaddingPackets = 1;
Erik Språng478cb462019-06-26 15:49:27 +0200119 EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
Erik Språngf6468d22019-07-05 16:53:43 +0200120 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize))
121 .WillOnce([&](size_t padding_size) {
122 return std::vector<std::unique_ptr<RtpPacketToSend>>(
123 kExpectedPaddingPackets);
124 });
Erik Språng4208a132019-08-26 08:58:45 +0200125 auto generated_padding = packet_router_.GeneratePadding(kPaddingSize);
Erik Språngf6468d22019-07-05 16:53:43 +0200126 EXPECT_EQ(generated_padding.size(), kExpectedPaddingPackets);
Erik Språng478cb462019-06-26 15:49:27 +0200127
Erik Språng4208a132019-08-26 08:58:45 +0200128 packet_router_.RemoveSendRtpModule(&rtp_1);
129 packet_router_.RemoveSendRtpModule(&rtp_2);
Erik Språng478cb462019-06-26 15:49:27 +0200130}
131
Erik Språng4208a132019-08-26 08:58:45 +0200132TEST_F(PacketRouterTest, PadsOnLastActiveMediaStream) {
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200133 const uint16_t kSsrc1 = 1234;
134 const uint16_t kSsrc2 = 4567;
135 const uint16_t kSsrc3 = 8901;
136
137 // First two rtp modules send media and have rtx.
138 NiceMock<MockRtpRtcp> rtp_1;
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200139 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000140 EXPECT_CALL(rtp_1, SupportsPadding).WillRepeatedly(Return(true));
141 EXPECT_CALL(rtp_1, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200142 EXPECT_CALL(rtp_1, TrySendPacket).WillRepeatedly(Return(false));
143 EXPECT_CALL(
144 rtp_1,
145 TrySendPacket(
146 ::testing::Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc1)), _))
147 .WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200148
149 NiceMock<MockRtpRtcp> rtp_2;
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200150 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000151 EXPECT_CALL(rtp_2, SupportsPadding).WillRepeatedly(Return(true));
152 EXPECT_CALL(rtp_2, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200153 EXPECT_CALL(rtp_2, TrySendPacket).WillRepeatedly(Return(false));
154 EXPECT_CALL(
155 rtp_2,
156 TrySendPacket(
157 ::testing::Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc2)), _))
158 .WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200159
160 // Third module is sending media, but does not support rtx.
161 NiceMock<MockRtpRtcp> rtp_3;
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200162 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000163 EXPECT_CALL(rtp_3, SupportsPadding).WillRepeatedly(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200164 EXPECT_CALL(rtp_3, SupportsRtxPayloadPadding).WillRepeatedly(Return(false));
165 EXPECT_CALL(rtp_3, TrySendPacket).WillRepeatedly(Return(false));
166 EXPECT_CALL(
167 rtp_3,
168 TrySendPacket(
169 ::testing::Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc3)), _))
170 .WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200171
Erik Språng4208a132019-08-26 08:58:45 +0200172 packet_router_.AddSendRtpModule(&rtp_1, false);
173 packet_router_.AddSendRtpModule(&rtp_2, false);
174 packet_router_.AddSendRtpModule(&rtp_3, false);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200175
176 const size_t kPaddingBytes = 100;
177
178 // Initially, padding will be sent on last added rtp module that sends media
179 // and supports rtx.
Erik Språng4208a132019-08-26 08:58:45 +0200180 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200181 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200182 .WillOnce([](size_t target_size_bytes) {
183 return std::vector<std::unique_ptr<RtpPacketToSend>>();
184 });
185 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200186
187 // Send media on first module. Padding should be sent on that module.
Erik Språng4208a132019-08-26 08:58:45 +0200188 packet_router_.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200189
Erik Språng4208a132019-08-26 08:58:45 +0200190 EXPECT_CALL(rtp_1, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200191 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200192 .WillOnce([](size_t target_size_bytes) {
193 return std::vector<std::unique_ptr<RtpPacketToSend>>();
194 });
195 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200196
197 // Send media on second module. Padding should be sent there.
Erik Språng4208a132019-08-26 08:58:45 +0200198 packet_router_.SendPacket(BuildRtpPacket(kSsrc2), PacedPacketInfo());
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200199
Erik Språng4208a132019-08-26 08:58:45 +0200200 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200201 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200202 .WillOnce([](size_t target_size_bytes) {
203 return std::vector<std::unique_ptr<RtpPacketToSend>>();
204 });
205 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200206
207 // Remove second module, padding should now fall back to first module.
Erik Språng4208a132019-08-26 08:58:45 +0200208 packet_router_.RemoveSendRtpModule(&rtp_2);
209 EXPECT_CALL(rtp_1, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200210 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200211 .WillOnce([](size_t target_size_bytes) {
212 return std::vector<std::unique_ptr<RtpPacketToSend>>();
213 });
214 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200215
216 // Remove first module too, leaving only the one without rtx.
Erik Språng4208a132019-08-26 08:58:45 +0200217 packet_router_.RemoveSendRtpModule(&rtp_1);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200218
Erik Språng4208a132019-08-26 08:58:45 +0200219 EXPECT_CALL(rtp_3, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200220 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200221 .WillOnce([](size_t target_size_bytes) {
222 return std::vector<std::unique_ptr<RtpPacketToSend>>();
223 });
224 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200225
Erik Språng4208a132019-08-26 08:58:45 +0200226 packet_router_.RemoveSendRtpModule(&rtp_3);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200227}
228
Erik Språng4208a132019-08-26 08:58:45 +0200229TEST_F(PacketRouterTest, AllocateSequenceNumbers) {
sprang867fb522015-08-03 04:38:41 -0700230 const uint16_t kStartSeq = 0xFFF0;
231 const size_t kNumPackets = 32;
232
Erik Språng4208a132019-08-26 08:58:45 +0200233 packet_router_.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700234
235 for (size_t i = 0; i < kNumPackets; ++i) {
Erik Språng4208a132019-08-26 08:58:45 +0200236 uint16_t seq = packet_router_.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700237 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
238 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
239 }
240}
stefanbba9dec2016-02-01 04:39:55 -0800241
Erik Språng4208a132019-08-26 08:58:45 +0200242TEST_F(PacketRouterTest, SendTransportFeedback) {
eladalon6c9556e2017-07-10 03:33:00 -0700243 NiceMock<MockRtpRtcp> rtp_1;
244 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700245
Per Kjellanderee153c92019-10-10 16:43:46 +0200246 ON_CALL(rtp_1, RTCP()).WillByDefault(Return(RtcpMode::kCompound));
247 ON_CALL(rtp_2, RTCP()).WillByDefault(Return(RtcpMode::kCompound));
248
Erik Språng4208a132019-08-26 08:58:45 +0200249 packet_router_.AddSendRtpModule(&rtp_1, false);
250 packet_router_.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800251
Per Kjellanderee153c92019-10-10 16:43:46 +0200252 std::vector<std::unique_ptr<rtcp::RtcpPacket>> feedback;
253 feedback.push_back(std::make_unique<rtcp::TransportFeedback>());
254 EXPECT_CALL(rtp_1, SendCombinedRtcpPacket).Times(1);
255 packet_router_.SendCombinedRtcpPacket(std::move(feedback));
Erik Språng4208a132019-08-26 08:58:45 +0200256 packet_router_.RemoveSendRtpModule(&rtp_1);
Per Kjellanderee153c92019-10-10 16:43:46 +0200257 EXPECT_CALL(rtp_2, SendCombinedRtcpPacket).Times(1);
258 std::vector<std::unique_ptr<rtcp::RtcpPacket>> new_feedback;
259 new_feedback.push_back(std::make_unique<rtcp::TransportFeedback>());
260 packet_router_.SendCombinedRtcpPacket(std::move(new_feedback));
Erik Språng4208a132019-08-26 08:58:45 +0200261 packet_router_.RemoveReceiveRtpModule(&rtp_2);
262}
263
264TEST_F(PacketRouterTest, SendPacketWithoutTransportSequenceNumbers) {
265 NiceMock<MockRtpRtcp> rtp_1;
266 packet_router_.AddSendRtpModule(&rtp_1, false);
267
268 const uint16_t kSsrc1 = 1234;
269 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
270 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
271
272 // Send a packet without TransportSequenceNumber extension registered,
273 // packets sent should not have the extension set.
274 RtpHeaderExtensionMap extension_manager;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200275 auto packet = std::make_unique<RtpPacketToSend>(&extension_manager);
Erik Språng4208a132019-08-26 08:58:45 +0200276 packet->SetSsrc(kSsrc1);
277 EXPECT_CALL(
278 rtp_1,
279 TrySendPacket(
280 Property(&RtpPacketToSend::HasExtension<TransportSequenceNumber>,
281 false),
282 _))
283 .WillOnce(Return(true));
284 packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
285
286 packet_router_.RemoveSendRtpModule(&rtp_1);
287}
288
289TEST_F(PacketRouterTest, SendPacketAssignsTransportSequenceNumbers) {
290 NiceMock<MockRtpRtcp> rtp_1;
291 NiceMock<MockRtpRtcp> rtp_2;
292
293 packet_router_.AddSendRtpModule(&rtp_1, false);
294 packet_router_.AddSendRtpModule(&rtp_2, false);
295
296 const uint16_t kSsrc1 = 1234;
297 const uint16_t kSsrc2 = 2345;
298
299 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
300 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
301
302 // Transport sequence numbers start at 1, for historical reasons.
303 uint16_t transport_sequence_number = 1;
304
305 auto packet = BuildRtpPacket(kSsrc1);
306 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
307 EXPECT_CALL(
308 rtp_1,
309 TrySendPacket(
310 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
311 transport_sequence_number),
312 _))
313 .WillOnce(Return(true));
314 packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
315
316 ++transport_sequence_number;
317 packet = BuildRtpPacket(kSsrc2);
318 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
319
320 // There will be a failed attempt to send on kSsrc1 before trying
321 // the correct RTP module.
322 EXPECT_CALL(rtp_1, TrySendPacket).WillOnce(Return(false));
323 EXPECT_CALL(
324 rtp_2,
325 TrySendPacket(
326 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
327 transport_sequence_number),
328 _))
329 .WillOnce(Return(true));
330 packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
331
332 packet_router_.RemoveSendRtpModule(&rtp_1);
333 packet_router_.RemoveSendRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800334}
nisse05843312017-04-18 23:38:35 -0700335
eladalon822ff2b2017-08-01 06:30:28 -0700336#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Erik Språng4208a132019-08-26 08:58:45 +0200337TEST_F(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700338 NiceMock<MockRtpRtcp> module;
339
340 constexpr bool remb_candidate = false; // Value irrelevant.
Erik Språng4208a132019-08-26 08:58:45 +0200341 packet_router_.AddSendRtpModule(&module, remb_candidate);
342 EXPECT_DEATH(packet_router_.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700343
344 // Test tear-down
Erik Språng4208a132019-08-26 08:58:45 +0200345 packet_router_.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700346}
347
Erik Språng4208a132019-08-26 08:58:45 +0200348TEST_F(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700349 NiceMock<MockRtpRtcp> module;
350
351 constexpr bool remb_candidate = false; // Value irrelevant.
Erik Språng4208a132019-08-26 08:58:45 +0200352 packet_router_.AddReceiveRtpModule(&module, remb_candidate);
353 EXPECT_DEATH(packet_router_.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700354
355 // Test tear-down
Erik Språng4208a132019-08-26 08:58:45 +0200356 packet_router_.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700357}
358
Erik Språng4208a132019-08-26 08:58:45 +0200359TEST_F(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700360 NiceMock<MockRtpRtcp> module;
361
Erik Språng4208a132019-08-26 08:58:45 +0200362 EXPECT_DEATH(packet_router_.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700363}
364
Erik Språng4208a132019-08-26 08:58:45 +0200365TEST_F(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700366 NiceMock<MockRtpRtcp> module;
367
Erik Språng4208a132019-08-26 08:58:45 +0200368 EXPECT_DEATH(packet_router_.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700369}
370#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
371
nisse05843312017-04-18 23:38:35 -0700372TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
373 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200374 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700375 PacketRouter packet_router;
376
eladalon822ff2b2017-08-01 06:30:28 -0700377 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700378
379 uint32_t bitrate_estimate = 456;
380 const std::vector<uint32_t> ssrcs = {1234};
381
nisse05843312017-04-18 23:38:35 -0700382 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
383
384 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200385 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200386 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700387 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
388
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200389 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700390 // away.
391 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200392 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700393 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
394
nisse05843312017-04-18 23:38:35 -0700395 packet_router.RemoveSendRtpModule(&rtp);
396}
397
398TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
399 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700400 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700401 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700402 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700403
404 uint32_t bitrate_estimate[] = {456, 789};
405 std::vector<uint32_t> ssrcs = {1234, 5678};
406
nisse05843312017-04-18 23:38:35 -0700407 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
408
409 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200410 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200411 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700412 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
413
414 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
415
416 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200417 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700418 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
419
420 packet_router.RemoveSendRtpModule(&rtp);
421}
422
423TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
424 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700425 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700426 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700427 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700428
429 uint32_t bitrate_estimate = 456;
430 std::vector<uint32_t> ssrcs = {1234, 5678};
431
nisse05843312017-04-18 23:38:35 -0700432 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
433
434 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200435 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200436 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700437 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
438
439 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200440 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700441 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
442
443 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200444 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700445 int lower_estimate = bitrate_estimate * 98 / 100;
446 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
447
448 packet_router.RemoveSendRtpModule(&rtp);
449}
450
451TEST(PacketRouterRembTest, ChangeSendRtpModule) {
452 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700453 NiceMock<MockRtpRtcp> rtp_send;
454 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700455 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700456 packet_router.AddSendRtpModule(&rtp_send, true);
457 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700458
459 uint32_t bitrate_estimate = 456;
460 std::vector<uint32_t> ssrcs = {1234, 5678};
461
nisse05843312017-04-18 23:38:35 -0700462 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
463
464 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200465 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200466 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700467 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
468
469 // Decrease estimate to trigger a REMB.
470 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200471 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700472 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
473
474 // Remove the sending module -> should get remb on the second module.
475 packet_router.RemoveSendRtpModule(&rtp_send);
476
nisse05843312017-04-18 23:38:35 -0700477 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
478
479 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200480 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700481 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
482
483 packet_router.RemoveReceiveRtpModule(&rtp_recv);
484}
485
486TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
487 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700488 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700489 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700490 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700491
492 uint32_t bitrate_estimate = 456;
493 const std::vector<uint32_t> ssrcs = {1234};
494
nisse05843312017-04-18 23:38:35 -0700495 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
496
497 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200498 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200499 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700500 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
501
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200502 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700503 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200504 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700505 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
506
507 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200508 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700509 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
510 packet_router.RemoveSendRtpModule(&rtp);
511}
512
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200513TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700514 rtc::ScopedFakeClock clock;
515 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200516 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200517 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700518 constexpr bool remb_candidate = true;
519 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700520
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100521 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200522 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
523 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700524
525 const std::vector<uint32_t> ssrcs = {1234};
526 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
527 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200528 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700529 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
530
531 // Test tear-down.
532 packet_router.RemoveSendRtpModule(&remb_sender);
533}
534
535TEST(PacketRouterRembTest,
536 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
537 rtc::ScopedFakeClock clock;
538 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200539 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200540 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700541 constexpr bool remb_candidate = true;
542 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700543
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100544 const int64_t measured_bitrate_bps = 150000;
545 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700546 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200547 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700548 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
549
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200550 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700551 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
552
553 // Test tear-down.
554 packet_router.RemoveSendRtpModule(&remb_sender);
555}
556
557TEST(PacketRouterRembTest,
558 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
559 rtc::ScopedFakeClock clock;
560 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200561 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200562 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700563 constexpr bool remb_candidate = true;
564 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700565
566 const uint32_t measured_bitrate_bps = 150000;
567 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
568 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200569 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700570 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
571
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200572 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700573 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
574
575 // Test tear-down.
576 packet_router.RemoveSendRtpModule(&remb_sender);
577}
578
579TEST(PacketRouterRembTest,
580 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
581 rtc::ScopedFakeClock clock;
582 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200583 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200584 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700585 constexpr bool remb_candidate = true;
586 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700587
588 const uint32_t measured_bitrate_bps = 150000;
589 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
590 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200591 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700592 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
593
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200594 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700595 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
596
597 // Test tear-down.
598 packet_router.RemoveSendRtpModule(&remb_sender);
599}
600
601TEST(PacketRouterRembTest,
602 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
603 rtc::ScopedFakeClock clock;
604 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200605 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200606 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700607 constexpr bool remb_candidate = true;
608 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700609
610 const uint32_t measured_bitrate_bps = 150000;
611 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
612 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200613 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700614 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200615 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700616
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200617 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700618 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
619
620 // Test tear-down.
621 packet_router.RemoveSendRtpModule(&remb_sender);
622}
623
624TEST(PacketRouterRembTest,
625 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
626 rtc::ScopedFakeClock clock;
627 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200628 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200629 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700630 constexpr bool remb_candidate = true;
631 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700632
633 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200634 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700635 packet_router.SetMaxDesiredReceiveBitrate(100000);
636 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200637 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700638 packet_router.SetMaxDesiredReceiveBitrate(200000);
639 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200640 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700641 packet_router.SetMaxDesiredReceiveBitrate(150000);
642
643 // Test tear-down.
644 packet_router.RemoveSendRtpModule(&remb_sender);
645}
646
nisse05843312017-04-18 23:38:35 -0700647// Only register receiving modules and make sure we fallback to trigger a REMB
648// packet on this one.
649TEST(PacketRouterRembTest, NoSendingRtpModule) {
650 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700651 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700652 PacketRouter packet_router;
653
eladalon822ff2b2017-08-01 06:30:28 -0700654 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700655
656 uint32_t bitrate_estimate = 456;
657 const std::vector<uint32_t> ssrcs = {1234};
658
nisse05843312017-04-18 23:38:35 -0700659 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
660
661 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200662 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200663 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700664 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
665
666 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200667 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700668 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
669
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200670 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700671 packet_router.RemoveReceiveRtpModule(&rtp);
672}
673
eladalon822ff2b2017-08-01 06:30:28 -0700674TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
675 rtc::ScopedFakeClock clock;
676 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200677 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700678
679 constexpr bool remb_candidate = false;
680
681 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700682
683 constexpr uint32_t bitrate_estimate = 456;
684 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200685 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200686 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700687 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
688
689 // Test tear-down
690 packet_router.RemoveSendRtpModule(&module);
691}
692
693TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
694 rtc::ScopedFakeClock clock;
695 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200696 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700697
698 constexpr bool remb_candidate = true;
699
700 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700701
702 constexpr uint32_t bitrate_estimate = 456;
703 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200704 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200705 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700706 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
707
708 // Test tear-down
709 packet_router.RemoveSendRtpModule(&module);
710}
711
712TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
713 rtc::ScopedFakeClock clock;
714 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200715 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700716
717 constexpr bool remb_candidate = false;
718
719 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700720
721 constexpr uint32_t bitrate_estimate = 456;
722 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200723 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200724 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700725 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
726
727 // Test tear-down
728 packet_router.RemoveReceiveRtpModule(&module);
729}
730
731TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
732 rtc::ScopedFakeClock clock;
733 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200734 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700735
736 constexpr bool remb_candidate = true;
737
738 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700739
740 constexpr uint32_t bitrate_estimate = 456;
741 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200742 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200743 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700744 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
745
746 // Test tear-down
747 packet_router.RemoveReceiveRtpModule(&module);
748}
749
750TEST(PacketRouterRembTest,
751 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
752 rtc::ScopedFakeClock clock;
753 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200754 NiceMock<MockRtpRtcp> send_module;
755 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700756
757 constexpr bool remb_candidate = true;
758
759 // Send module added - activated.
760 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700761
762 // Receive module added - the send module remains the active one.
763 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700764
765 constexpr uint32_t bitrate_estimate = 456;
766 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200767 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
768 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700769
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200770 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700771 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
772
773 // Test tear-down
774 packet_router.RemoveReceiveRtpModule(&receive_module);
775 packet_router.RemoveSendRtpModule(&send_module);
776}
777
778TEST(PacketRouterRembTest,
779 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
780 rtc::ScopedFakeClock clock;
781 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200782 NiceMock<MockRtpRtcp> send_module;
783 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700784
785 constexpr bool remb_candidate = true;
786
787 // Receive module added - activated.
788 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700789
790 // Send module added - replaces receive module as active.
791 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700792
793 constexpr uint32_t bitrate_estimate = 456;
794 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200795 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
796 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700797
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200798 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700799 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
800
801 // Test tear-down
802 packet_router.RemoveReceiveRtpModule(&receive_module);
803 packet_router.RemoveSendRtpModule(&send_module);
804}
805
806TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
807 rtc::ScopedFakeClock clock;
808 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200809 NiceMock<MockRtpRtcp> send_module;
810 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700811
812 constexpr bool remb_candidate = true;
813
814 // Send module active, receive module inactive.
815 packet_router.AddSendRtpModule(&send_module, remb_candidate);
816 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700817
818 // Send module removed - receive module becomes active.
819 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700820 constexpr uint32_t bitrate_estimate = 456;
821 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200822 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
823 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700824
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200825 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700826 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
827
828 // Test tear-down
829 packet_router.RemoveReceiveRtpModule(&receive_module);
830}
831
Stefan Holmere5904162015-03-26 11:11:06 +0100832} // namespace webrtc