blob: ec82a66c4cfc0e9797bb03b0f7045ee4551aa111 [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>
Erik Språngf6468d22019-07-05 16:53:43 +020015#include <utility>
Stefan Holmere5904162015-03-26 11:11:06 +010016
Erik Språngf6468d22019-07-05 16:53:43 +020017#include "absl/memory/memory.h"
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 =
61 absl::make_unique<RtpPacketToSend>(&extension_manager);
62 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) {
eladalon32040ef2017-08-02 06:29:00 -070092 rtcp::TransportFeedback feedback;
93
Erik Språng4208a132019-08-26 08:58:45 +020094 EXPECT_FALSE(packet_router_.SendTransportFeedback(&feedback));
eladalon32040ef2017-08-02 06:29:00 -070095}
96
Erik Språng4208a132019-08-26 08:58:45 +020097TEST_F(PacketRouterTest, GeneratePaddingPicksCorrectModule) {
Erik Språng478cb462019-06-26 15:49:27 +020098 // Two RTP modules. The first (prioritized due to rtx) isn't sending media so
99 // should not be called.
100 const uint16_t kSsrc1 = 1234;
101 const uint16_t kSsrc2 = 4567;
102
103 NiceMock<MockRtpRtcp> rtp_1;
104 ON_CALL(rtp_1, RtxSendStatus()).WillByDefault(Return(kRtxRedundantPayloads));
105 ON_CALL(rtp_1, SSRC()).WillByDefault(Return(kSsrc1));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000106 ON_CALL(rtp_1, SupportsPadding).WillByDefault(Return(false));
Erik Språng478cb462019-06-26 15:49:27 +0200107
108 NiceMock<MockRtpRtcp> rtp_2;
109 ON_CALL(rtp_2, RtxSendStatus()).WillByDefault(Return(kRtxOff));
110 ON_CALL(rtp_2, SSRC()).WillByDefault(Return(kSsrc2));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000111 ON_CALL(rtp_2, SupportsPadding).WillByDefault(Return(true));
Erik Språng478cb462019-06-26 15:49:27 +0200112
Erik Språng4208a132019-08-26 08:58:45 +0200113 packet_router_.AddSendRtpModule(&rtp_1, false);
114 packet_router_.AddSendRtpModule(&rtp_2, false);
Erik Språng478cb462019-06-26 15:49:27 +0200115
116 const size_t kPaddingSize = 123;
Erik Språngf6468d22019-07-05 16:53:43 +0200117 const size_t kExpectedPaddingPackets = 1;
Erik Språng478cb462019-06-26 15:49:27 +0200118 EXPECT_CALL(rtp_1, GeneratePadding(_)).Times(0);
Erik Språngf6468d22019-07-05 16:53:43 +0200119 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingSize))
120 .WillOnce([&](size_t padding_size) {
121 return std::vector<std::unique_ptr<RtpPacketToSend>>(
122 kExpectedPaddingPackets);
123 });
Erik Språng4208a132019-08-26 08:58:45 +0200124 auto generated_padding = packet_router_.GeneratePadding(kPaddingSize);
Erik Språngf6468d22019-07-05 16:53:43 +0200125 EXPECT_EQ(generated_padding.size(), kExpectedPaddingPackets);
Erik Språng478cb462019-06-26 15:49:27 +0200126
Erik Språng4208a132019-08-26 08:58:45 +0200127 packet_router_.RemoveSendRtpModule(&rtp_1);
128 packet_router_.RemoveSendRtpModule(&rtp_2);
Erik Språng478cb462019-06-26 15:49:27 +0200129}
130
Erik Språng4208a132019-08-26 08:58:45 +0200131TEST_F(PacketRouterTest, PadsOnLastActiveMediaStream) {
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200132 const uint16_t kSsrc1 = 1234;
133 const uint16_t kSsrc2 = 4567;
134 const uint16_t kSsrc3 = 8901;
135
136 // First two rtp modules send media and have rtx.
137 NiceMock<MockRtpRtcp> rtp_1;
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200138 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000139 EXPECT_CALL(rtp_1, SupportsPadding).WillRepeatedly(Return(true));
140 EXPECT_CALL(rtp_1, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200141 EXPECT_CALL(rtp_1, TrySendPacket).WillRepeatedly(Return(false));
142 EXPECT_CALL(
143 rtp_1,
144 TrySendPacket(
145 ::testing::Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc1)), _))
146 .WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200147
148 NiceMock<MockRtpRtcp> rtp_2;
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200149 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000150 EXPECT_CALL(rtp_2, SupportsPadding).WillRepeatedly(Return(true));
151 EXPECT_CALL(rtp_2, SupportsRtxPayloadPadding).WillRepeatedly(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200152 EXPECT_CALL(rtp_2, TrySendPacket).WillRepeatedly(Return(false));
153 EXPECT_CALL(
154 rtp_2,
155 TrySendPacket(
156 ::testing::Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc2)), _))
157 .WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200158
159 // Third module is sending media, but does not support rtx.
160 NiceMock<MockRtpRtcp> rtp_3;
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200161 EXPECT_CALL(rtp_3, SSRC()).WillRepeatedly(Return(kSsrc3));
Mirko Bonadei999a72a2019-07-12 17:33:46 +0000162 EXPECT_CALL(rtp_3, SupportsPadding).WillRepeatedly(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200163 EXPECT_CALL(rtp_3, SupportsRtxPayloadPadding).WillRepeatedly(Return(false));
164 EXPECT_CALL(rtp_3, TrySendPacket).WillRepeatedly(Return(false));
165 EXPECT_CALL(
166 rtp_3,
167 TrySendPacket(
168 ::testing::Pointee(Property(&RtpPacketToSend::Ssrc, kSsrc3)), _))
169 .WillRepeatedly(Return(true));
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200170
Erik Språng4208a132019-08-26 08:58:45 +0200171 packet_router_.AddSendRtpModule(&rtp_1, false);
172 packet_router_.AddSendRtpModule(&rtp_2, false);
173 packet_router_.AddSendRtpModule(&rtp_3, false);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200174
175 const size_t kPaddingBytes = 100;
176
177 // Initially, padding will be sent on last added rtp module that sends media
178 // and supports rtx.
Erik Språng4208a132019-08-26 08:58:45 +0200179 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200180 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200181 .WillOnce([](size_t target_size_bytes) {
182 return std::vector<std::unique_ptr<RtpPacketToSend>>();
183 });
184 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200185
186 // Send media on first module. Padding should be sent on that module.
Erik Språng4208a132019-08-26 08:58:45 +0200187 packet_router_.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200188
Erik Språng4208a132019-08-26 08:58:45 +0200189 EXPECT_CALL(rtp_1, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200190 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200191 .WillOnce([](size_t target_size_bytes) {
192 return std::vector<std::unique_ptr<RtpPacketToSend>>();
193 });
194 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200195
196 // Send media on second module. Padding should be sent there.
Erik Språng4208a132019-08-26 08:58:45 +0200197 packet_router_.SendPacket(BuildRtpPacket(kSsrc2), PacedPacketInfo());
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200198
Erik Språng4208a132019-08-26 08:58:45 +0200199 EXPECT_CALL(rtp_2, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200200 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200201 .WillOnce([](size_t target_size_bytes) {
202 return std::vector<std::unique_ptr<RtpPacketToSend>>();
203 });
204 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200205
206 // Remove second module, padding should now fall back to first module.
Erik Språng4208a132019-08-26 08:58:45 +0200207 packet_router_.RemoveSendRtpModule(&rtp_2);
208 EXPECT_CALL(rtp_1, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200209 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200210 .WillOnce([](size_t target_size_bytes) {
211 return std::vector<std::unique_ptr<RtpPacketToSend>>();
212 });
213 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200214
215 // Remove first module too, leaving only the one without rtx.
Erik Språng4208a132019-08-26 08:58:45 +0200216 packet_router_.RemoveSendRtpModule(&rtp_1);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200217
Erik Språng4208a132019-08-26 08:58:45 +0200218 EXPECT_CALL(rtp_3, GeneratePadding(kPaddingBytes))
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200219 .Times(1)
Erik Språng4208a132019-08-26 08:58:45 +0200220 .WillOnce([](size_t target_size_bytes) {
221 return std::vector<std::unique_ptr<RtpPacketToSend>>();
222 });
223 packet_router_.GeneratePadding(kPaddingBytes);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200224
Erik Språng4208a132019-08-26 08:58:45 +0200225 packet_router_.RemoveSendRtpModule(&rtp_3);
Erik Språng8b7ca4a2018-05-17 13:43:35 +0200226}
227
Erik Språng4208a132019-08-26 08:58:45 +0200228TEST_F(PacketRouterTest, AllocateSequenceNumbers) {
sprang867fb522015-08-03 04:38:41 -0700229 const uint16_t kStartSeq = 0xFFF0;
230 const size_t kNumPackets = 32;
231
Erik Språng4208a132019-08-26 08:58:45 +0200232 packet_router_.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700233
234 for (size_t i = 0; i < kNumPackets; ++i) {
Erik Språng4208a132019-08-26 08:58:45 +0200235 uint16_t seq = packet_router_.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700236 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
237 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
238 }
239}
stefanbba9dec2016-02-01 04:39:55 -0800240
Erik Språng4208a132019-08-26 08:58:45 +0200241TEST_F(PacketRouterTest, SendTransportFeedback) {
eladalon6c9556e2017-07-10 03:33:00 -0700242 NiceMock<MockRtpRtcp> rtp_1;
243 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700244
Erik Språng4208a132019-08-26 08:58:45 +0200245 packet_router_.AddSendRtpModule(&rtp_1, false);
246 packet_router_.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800247
248 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700249 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200250 packet_router_.SendTransportFeedback(&feedback);
251 packet_router_.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700252 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
Erik Språng4208a132019-08-26 08:58:45 +0200253 packet_router_.SendTransportFeedback(&feedback);
254 packet_router_.RemoveReceiveRtpModule(&rtp_2);
255}
256
257TEST_F(PacketRouterTest, SendPacketWithoutTransportSequenceNumbers) {
258 NiceMock<MockRtpRtcp> rtp_1;
259 packet_router_.AddSendRtpModule(&rtp_1, false);
260
261 const uint16_t kSsrc1 = 1234;
262 ON_CALL(rtp_1, SendingMedia).WillByDefault(Return(true));
263 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
264
265 // Send a packet without TransportSequenceNumber extension registered,
266 // packets sent should not have the extension set.
267 RtpHeaderExtensionMap extension_manager;
268 auto packet = absl::make_unique<RtpPacketToSend>(&extension_manager);
269 packet->SetSsrc(kSsrc1);
270 EXPECT_CALL(
271 rtp_1,
272 TrySendPacket(
273 Property(&RtpPacketToSend::HasExtension<TransportSequenceNumber>,
274 false),
275 _))
276 .WillOnce(Return(true));
277 packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
278
279 packet_router_.RemoveSendRtpModule(&rtp_1);
280}
281
282TEST_F(PacketRouterTest, SendPacketAssignsTransportSequenceNumbers) {
283 NiceMock<MockRtpRtcp> rtp_1;
284 NiceMock<MockRtpRtcp> rtp_2;
285
286 packet_router_.AddSendRtpModule(&rtp_1, false);
287 packet_router_.AddSendRtpModule(&rtp_2, false);
288
289 const uint16_t kSsrc1 = 1234;
290 const uint16_t kSsrc2 = 2345;
291
292 ON_CALL(rtp_1, SSRC).WillByDefault(Return(kSsrc1));
293 ON_CALL(rtp_2, SSRC).WillByDefault(Return(kSsrc2));
294
295 // Transport sequence numbers start at 1, for historical reasons.
296 uint16_t transport_sequence_number = 1;
297
298 auto packet = BuildRtpPacket(kSsrc1);
299 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
300 EXPECT_CALL(
301 rtp_1,
302 TrySendPacket(
303 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
304 transport_sequence_number),
305 _))
306 .WillOnce(Return(true));
307 packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
308
309 ++transport_sequence_number;
310 packet = BuildRtpPacket(kSsrc2);
311 EXPECT_TRUE(packet->ReserveExtension<TransportSequenceNumber>());
312
313 // There will be a failed attempt to send on kSsrc1 before trying
314 // the correct RTP module.
315 EXPECT_CALL(rtp_1, TrySendPacket).WillOnce(Return(false));
316 EXPECT_CALL(
317 rtp_2,
318 TrySendPacket(
319 Property(&RtpPacketToSend::GetExtension<TransportSequenceNumber>,
320 transport_sequence_number),
321 _))
322 .WillOnce(Return(true));
323 packet_router_.SendPacket(std::move(packet), PacedPacketInfo());
324
325 packet_router_.RemoveSendRtpModule(&rtp_1);
326 packet_router_.RemoveSendRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800327}
nisse05843312017-04-18 23:38:35 -0700328
eladalon822ff2b2017-08-01 06:30:28 -0700329#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Erik Språng4208a132019-08-26 08:58:45 +0200330TEST_F(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700331 NiceMock<MockRtpRtcp> module;
332
333 constexpr bool remb_candidate = false; // Value irrelevant.
Erik Språng4208a132019-08-26 08:58:45 +0200334 packet_router_.AddSendRtpModule(&module, remb_candidate);
335 EXPECT_DEATH(packet_router_.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700336
337 // Test tear-down
Erik Språng4208a132019-08-26 08:58:45 +0200338 packet_router_.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700339}
340
Erik Språng4208a132019-08-26 08:58:45 +0200341TEST_F(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700342 NiceMock<MockRtpRtcp> module;
343
344 constexpr bool remb_candidate = false; // Value irrelevant.
Erik Språng4208a132019-08-26 08:58:45 +0200345 packet_router_.AddReceiveRtpModule(&module, remb_candidate);
346 EXPECT_DEATH(packet_router_.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700347
348 // Test tear-down
Erik Språng4208a132019-08-26 08:58:45 +0200349 packet_router_.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700350}
351
Erik Språng4208a132019-08-26 08:58:45 +0200352TEST_F(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700353 NiceMock<MockRtpRtcp> module;
354
Erik Språng4208a132019-08-26 08:58:45 +0200355 EXPECT_DEATH(packet_router_.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700356}
357
Erik Språng4208a132019-08-26 08:58:45 +0200358TEST_F(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
eladalon822ff2b2017-08-01 06:30:28 -0700359 NiceMock<MockRtpRtcp> module;
360
Erik Språng4208a132019-08-26 08:58:45 +0200361 EXPECT_DEATH(packet_router_.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700362}
363#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
364
nisse05843312017-04-18 23:38:35 -0700365TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
366 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200367 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700368 PacketRouter packet_router;
369
eladalon822ff2b2017-08-01 06:30:28 -0700370 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700371
372 uint32_t bitrate_estimate = 456;
373 const std::vector<uint32_t> ssrcs = {1234};
374
nisse05843312017-04-18 23:38:35 -0700375 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
376
377 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200378 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200379 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700380 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
381
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200382 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700383 // away.
384 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200385 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700386 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
387
nisse05843312017-04-18 23:38:35 -0700388 packet_router.RemoveSendRtpModule(&rtp);
389}
390
391TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
392 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700393 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700394 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700395 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700396
397 uint32_t bitrate_estimate[] = {456, 789};
398 std::vector<uint32_t> ssrcs = {1234, 5678};
399
nisse05843312017-04-18 23:38:35 -0700400 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
401
402 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200403 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200404 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700405 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
406
407 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
408
409 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200410 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700411 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
412
413 packet_router.RemoveSendRtpModule(&rtp);
414}
415
416TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
417 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700418 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700419 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700420 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700421
422 uint32_t bitrate_estimate = 456;
423 std::vector<uint32_t> ssrcs = {1234, 5678};
424
nisse05843312017-04-18 23:38:35 -0700425 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
426
427 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200428 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200429 clock.AdvanceTime(TimeDelta::ms(1000));
nisse05843312017-04-18 23:38:35 -0700430 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
431
432 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200433 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700434 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
435
436 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200437 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700438 int lower_estimate = bitrate_estimate * 98 / 100;
439 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
440
441 packet_router.RemoveSendRtpModule(&rtp);
442}
443
444TEST(PacketRouterRembTest, ChangeSendRtpModule) {
445 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700446 NiceMock<MockRtpRtcp> rtp_send;
447 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700448 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700449 packet_router.AddSendRtpModule(&rtp_send, true);
450 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700451
452 uint32_t bitrate_estimate = 456;
453 std::vector<uint32_t> ssrcs = {1234, 5678};
454
nisse05843312017-04-18 23:38:35 -0700455 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
456
457 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200458 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200459 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700460 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
461
462 // Decrease estimate to trigger a REMB.
463 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200464 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700465 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
466
467 // Remove the sending module -> should get remb on the second module.
468 packet_router.RemoveSendRtpModule(&rtp_send);
469
nisse05843312017-04-18 23:38:35 -0700470 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
471
472 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200473 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700474 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
475
476 packet_router.RemoveReceiveRtpModule(&rtp_recv);
477}
478
479TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
480 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700481 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700482 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700483 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700484
485 uint32_t bitrate_estimate = 456;
486 const std::vector<uint32_t> ssrcs = {1234};
487
nisse05843312017-04-18 23:38:35 -0700488 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
489
490 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200491 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200492 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700493 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
494
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200495 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700496 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200497 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700498 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
499
500 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200501 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700502 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
503 packet_router.RemoveSendRtpModule(&rtp);
504}
505
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200506TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700507 rtc::ScopedFakeClock clock;
508 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200509 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200510 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700511 constexpr bool remb_candidate = true;
512 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700513
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100514 const int64_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200515 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
516 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700517
518 const std::vector<uint32_t> ssrcs = {1234};
519 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
520 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200521 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700522 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
523
524 // Test tear-down.
525 packet_router.RemoveSendRtpModule(&remb_sender);
526}
527
528TEST(PacketRouterRembTest,
529 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
530 rtc::ScopedFakeClock clock;
531 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200532 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200533 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700534 constexpr bool remb_candidate = true;
535 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700536
Danil Chapovalov1de4b622017-12-13 13:35:10 +0100537 const int64_t measured_bitrate_bps = 150000;
538 const int64_t cap_bitrate_bps = measured_bitrate_bps - 5000;
danilchap47085372017-08-10 06:03:57 -0700539 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200540 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700541 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
542
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200543 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700544 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
545
546 // Test tear-down.
547 packet_router.RemoveSendRtpModule(&remb_sender);
548}
549
550TEST(PacketRouterRembTest,
551 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
552 rtc::ScopedFakeClock clock;
553 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200554 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200555 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700556 constexpr bool remb_candidate = true;
557 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700558
559 const uint32_t measured_bitrate_bps = 150000;
560 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
561 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200562 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700563 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
564
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200565 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700566 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
567
568 // Test tear-down.
569 packet_router.RemoveSendRtpModule(&remb_sender);
570}
571
572TEST(PacketRouterRembTest,
573 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
574 rtc::ScopedFakeClock clock;
575 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200576 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200577 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700578 constexpr bool remb_candidate = true;
579 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700580
581 const uint32_t measured_bitrate_bps = 150000;
582 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
583 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200584 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700585 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
586
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200587 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700588 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
589
590 // Test tear-down.
591 packet_router.RemoveSendRtpModule(&remb_sender);
592}
593
594TEST(PacketRouterRembTest,
595 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
596 rtc::ScopedFakeClock clock;
597 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200598 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200599 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700600 constexpr bool remb_candidate = true;
601 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700602
603 const uint32_t measured_bitrate_bps = 150000;
604 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
605 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200606 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700607 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200608 clock.AdvanceTime(TimeDelta::ms(1000));
danilchap47085372017-08-10 06:03:57 -0700609
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200610 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700611 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
612
613 // Test tear-down.
614 packet_router.RemoveSendRtpModule(&remb_sender);
615}
616
617TEST(PacketRouterRembTest,
618 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
619 rtc::ScopedFakeClock clock;
620 PacketRouter packet_router;
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200621 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200622 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700623 constexpr bool remb_candidate = true;
624 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700625
626 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200627 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700628 packet_router.SetMaxDesiredReceiveBitrate(100000);
629 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200630 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700631 packet_router.SetMaxDesiredReceiveBitrate(200000);
632 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200633 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700634 packet_router.SetMaxDesiredReceiveBitrate(150000);
635
636 // Test tear-down.
637 packet_router.RemoveSendRtpModule(&remb_sender);
638}
639
nisse05843312017-04-18 23:38:35 -0700640// Only register receiving modules and make sure we fallback to trigger a REMB
641// packet on this one.
642TEST(PacketRouterRembTest, NoSendingRtpModule) {
643 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700644 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700645 PacketRouter packet_router;
646
eladalon822ff2b2017-08-01 06:30:28 -0700647 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700648
649 uint32_t bitrate_estimate = 456;
650 const std::vector<uint32_t> ssrcs = {1234};
651
nisse05843312017-04-18 23:38:35 -0700652 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
653
654 // Call OnReceiveBitrateChanged twice to get a first estimate.
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200655 clock.AdvanceTime(TimeDelta::ms(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200656 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700657 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
658
659 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200660 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700661 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
662
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200663 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700664 packet_router.RemoveReceiveRtpModule(&rtp);
665}
666
eladalon822ff2b2017-08-01 06:30:28 -0700667TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
668 rtc::ScopedFakeClock clock;
669 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200670 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700671
672 constexpr bool remb_candidate = false;
673
674 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700675
676 constexpr uint32_t bitrate_estimate = 456;
677 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200678 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200679 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700680 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
681
682 // Test tear-down
683 packet_router.RemoveSendRtpModule(&module);
684}
685
686TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
687 rtc::ScopedFakeClock clock;
688 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200689 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700690
691 constexpr bool remb_candidate = true;
692
693 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700694
695 constexpr uint32_t bitrate_estimate = 456;
696 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200697 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200698 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700699 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
700
701 // Test tear-down
702 packet_router.RemoveSendRtpModule(&module);
703}
704
705TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
706 rtc::ScopedFakeClock clock;
707 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200708 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700709
710 constexpr bool remb_candidate = false;
711
712 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700713
714 constexpr uint32_t bitrate_estimate = 456;
715 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200716 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200717 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700718 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
719
720 // Test tear-down
721 packet_router.RemoveReceiveRtpModule(&module);
722}
723
724TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
725 rtc::ScopedFakeClock clock;
726 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200727 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700728
729 constexpr bool remb_candidate = true;
730
731 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700732
733 constexpr uint32_t bitrate_estimate = 456;
734 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200735 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200736 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700737 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
738
739 // Test tear-down
740 packet_router.RemoveReceiveRtpModule(&module);
741}
742
743TEST(PacketRouterRembTest,
744 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
745 rtc::ScopedFakeClock clock;
746 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200747 NiceMock<MockRtpRtcp> send_module;
748 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700749
750 constexpr bool remb_candidate = true;
751
752 // Send module added - activated.
753 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700754
755 // Receive module added - the send module remains the active one.
756 packet_router.AddReceiveRtpModule(&receive_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(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
761 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700762
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200763 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700764 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
765
766 // Test tear-down
767 packet_router.RemoveReceiveRtpModule(&receive_module);
768 packet_router.RemoveSendRtpModule(&send_module);
769}
770
771TEST(PacketRouterRembTest,
772 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
773 rtc::ScopedFakeClock clock;
774 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200775 NiceMock<MockRtpRtcp> send_module;
776 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700777
778 constexpr bool remb_candidate = true;
779
780 // Receive module added - activated.
781 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700782
783 // Send module added - replaces receive module as active.
784 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700785
786 constexpr uint32_t bitrate_estimate = 456;
787 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200788 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
789 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700790
Sebastian Jansson5f83cf02018-05-08 14:52:22 +0200791 clock.AdvanceTime(TimeDelta::ms(1000));
eladalon822ff2b2017-08-01 06:30:28 -0700792 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
793
794 // Test tear-down
795 packet_router.RemoveReceiveRtpModule(&receive_module);
796 packet_router.RemoveSendRtpModule(&send_module);
797}
798
799TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
800 rtc::ScopedFakeClock clock;
801 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200802 NiceMock<MockRtpRtcp> send_module;
803 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700804
805 constexpr bool remb_candidate = true;
806
807 // Send module active, receive module inactive.
808 packet_router.AddSendRtpModule(&send_module, remb_candidate);
809 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700810
811 // Send module removed - receive module becomes active.
812 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700813 constexpr uint32_t bitrate_estimate = 456;
814 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200815 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
816 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700817
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(&receive_module);
823}
824
Stefan Holmere5904162015-03-26 11:11:06 +0100825} // namespace webrtc