blob: 54c8f12c0591662ddfe7ac97a131f0e48c64f2c1 [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
eladalonb1338fe2017-08-01 09:36:19 -0700274TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
275 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700276 NiceMock<MockRtpRtcp> rtp;
eladalonb1338fe2017-08-01 09:36:19 -0700277 packet_router.AddSendRtpModule(&rtp, false);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100278 static const uint16_t kSsrc = 1234;
279 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
280 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
281
282 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700283 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalonb1338fe2017-08-01 09:36:19 -0700284 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipelc7bf32a2017-02-17 03:59:43 -0800285 kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
286 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100287 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700288 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800289 EXPECT_EQ(0u,
eladalonb1338fe2017-08-01 09:36:19 -0700290 packet_router.TimeToSendPadding(
philipelc7bf32a2017-02-17 03:59:43 -0800291 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
292 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100293
eladalonb1338fe2017-08-01 09:36:19 -0700294 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100295}
sprang867fb522015-08-03 04:38:41 -0700296
eladalonb1338fe2017-08-01 09:36:19 -0700297TEST(PacketRouterTest, AllocateSequenceNumbers) {
298 PacketRouter packet_router;
299
sprang867fb522015-08-03 04:38:41 -0700300 const uint16_t kStartSeq = 0xFFF0;
301 const size_t kNumPackets = 32;
302
eladalonb1338fe2017-08-01 09:36:19 -0700303 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang867fb522015-08-03 04:38:41 -0700304
305 for (size_t i = 0; i < kNumPackets; ++i) {
eladalonb1338fe2017-08-01 09:36:19 -0700306 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang867fb522015-08-03 04:38:41 -0700307 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
308 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
309 }
310}
stefanbba9dec2016-02-01 04:39:55 -0800311
eladalonb1338fe2017-08-01 09:36:19 -0700312TEST(PacketRouterTest, SendTransportFeedback) {
313 PacketRouter packet_router;
eladalon6c9556e2017-07-10 03:33:00 -0700314 NiceMock<MockRtpRtcp> rtp_1;
315 NiceMock<MockRtpRtcp> rtp_2;
eladalonb1338fe2017-08-01 09:36:19 -0700316
317 packet_router.AddSendRtpModule(&rtp_1, false);
318 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefanbba9dec2016-02-01 04:39:55 -0800319
320 rtcp::TransportFeedback feedback;
nisse05843312017-04-18 23:38:35 -0700321 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700322 packet_router.SendTransportFeedback(&feedback);
323 packet_router.RemoveSendRtpModule(&rtp_1);
nisse05843312017-04-18 23:38:35 -0700324 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalonb1338fe2017-08-01 09:36:19 -0700325 packet_router.SendTransportFeedback(&feedback);
326 packet_router.RemoveReceiveRtpModule(&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)
eladalonb1338fe2017-08-01 09:36:19 -0700330TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
331 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700332 NiceMock<MockRtpRtcp> module;
333
334 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700335 packet_router.AddSendRtpModule(&module, remb_candidate);
336 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700337
338 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700339 packet_router.RemoveSendRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700340}
341
eladalonb1338fe2017-08-01 09:36:19 -0700342TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
343 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700344 NiceMock<MockRtpRtcp> module;
345
346 constexpr bool remb_candidate = false; // Value irrelevant.
eladalonb1338fe2017-08-01 09:36:19 -0700347 packet_router.AddReceiveRtpModule(&module, remb_candidate);
348 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalon822ff2b2017-08-01 06:30:28 -0700349
350 // Test tear-down
eladalonb1338fe2017-08-01 09:36:19 -0700351 packet_router.RemoveReceiveRtpModule(&module);
eladalon822ff2b2017-08-01 06:30:28 -0700352}
353
eladalonb1338fe2017-08-01 09:36:19 -0700354TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
355 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700356 NiceMock<MockRtpRtcp> module;
357
eladalonb1338fe2017-08-01 09:36:19 -0700358 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700359}
360
eladalonb1338fe2017-08-01 09:36:19 -0700361TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
362 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700363 NiceMock<MockRtpRtcp> module;
364
eladalonb1338fe2017-08-01 09:36:19 -0700365 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalon822ff2b2017-08-01 06:30:28 -0700366}
367#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
368
nisse05843312017-04-18 23:38:35 -0700369TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
370 rtc::ScopedFakeClock clock;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200371 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700372 PacketRouter packet_router;
373
eladalon822ff2b2017-08-01 06:30:28 -0700374 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700375
376 uint32_t bitrate_estimate = 456;
377 const std::vector<uint32_t> ssrcs = {1234};
378
nisse05843312017-04-18 23:38:35 -0700379 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
380
381 // Call OnReceiveBitrateChanged twice to get a first estimate.
382 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200383 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700384 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
385
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200386 // Lower the estimate with more than 3% to trigger a call to SetRemb right
nisse05843312017-04-18 23:38:35 -0700387 // away.
388 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200389 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700390 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
391
nisse05843312017-04-18 23:38:35 -0700392 packet_router.RemoveSendRtpModule(&rtp);
393}
394
395TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
396 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700397 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700398 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700399 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700400
401 uint32_t bitrate_estimate[] = {456, 789};
402 std::vector<uint32_t> ssrcs = {1234, 5678};
403
nisse05843312017-04-18 23:38:35 -0700404 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
405
406 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200407 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[0], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700408 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
409 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
410
411 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
412
413 // Lower the estimate to trigger a callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200414 EXPECT_CALL(rtp, SetRemb(bitrate_estimate[1], ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700415 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
416
417 packet_router.RemoveSendRtpModule(&rtp);
418}
419
420TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
421 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700422 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700423 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700424 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700425
426 uint32_t bitrate_estimate = 456;
427 std::vector<uint32_t> ssrcs = {1234, 5678};
428
nisse05843312017-04-18 23:38:35 -0700429 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
430
431 // Call OnReceiveBitrateChanged twice to get a first estimate.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200432 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700433 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
434 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
435
436 // Increased estimate shouldn't trigger a callback right away.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200437 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700438 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
439
440 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200441 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700442 int lower_estimate = bitrate_estimate * 98 / 100;
443 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
444
445 packet_router.RemoveSendRtpModule(&rtp);
446}
447
448TEST(PacketRouterRembTest, ChangeSendRtpModule) {
449 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700450 NiceMock<MockRtpRtcp> rtp_send;
451 NiceMock<MockRtpRtcp> rtp_recv;
nisse05843312017-04-18 23:38:35 -0700452 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700453 packet_router.AddSendRtpModule(&rtp_send, true);
454 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse05843312017-04-18 23:38:35 -0700455
456 uint32_t bitrate_estimate = 456;
457 std::vector<uint32_t> ssrcs = {1234, 5678};
458
nisse05843312017-04-18 23:38:35 -0700459 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
460
461 // Call OnReceiveBitrateChanged twice to get a first estimate.
462 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200463 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700464 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
465
466 // Decrease estimate to trigger a REMB.
467 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200468 EXPECT_CALL(rtp_send, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700469 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
470
471 // Remove the sending module -> should get remb on the second module.
472 packet_router.RemoveSendRtpModule(&rtp_send);
473
nisse05843312017-04-18 23:38:35 -0700474 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
475
476 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200477 EXPECT_CALL(rtp_recv, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700478 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
479
480 packet_router.RemoveReceiveRtpModule(&rtp_recv);
481}
482
483TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
484 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700485 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700486 PacketRouter packet_router;
eladalon822ff2b2017-08-01 06:30:28 -0700487 packet_router.AddSendRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700488
489 uint32_t bitrate_estimate = 456;
490 const std::vector<uint32_t> ssrcs = {1234};
491
nisse05843312017-04-18 23:38:35 -0700492 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
493
494 // Call OnReceiveBitrateChanged twice to get a first estimate.
495 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200496 EXPECT_CALL(rtp, SetRemb(_, _)).Times(1);
nisse05843312017-04-18 23:38:35 -0700497 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
498
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200499 // Lower the estimate, should trigger a call to SetRemb right away.
nisse05843312017-04-18 23:38:35 -0700500 bitrate_estimate = bitrate_estimate - 100;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200501 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700502 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
503
504 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200505 EXPECT_CALL(rtp, SetRemb(_, _)).Times(0);
nisse05843312017-04-18 23:38:35 -0700506 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
507 packet_router.RemoveSendRtpModule(&rtp);
508}
509
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200510TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetRemb) {
danilchap47085372017-08-10 06:03:57 -0700511 rtc::ScopedFakeClock clock;
512 PacketRouter packet_router;
513 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200514 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700515 constexpr bool remb_candidate = true;
516 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700517
518 const uint32_t cap_bitrate = 100000;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200519 EXPECT_CALL(remb_sender, SetRemb(Le(cap_bitrate), _)).Times(AtLeast(1));
520 EXPECT_CALL(remb_sender, SetRemb(Gt(cap_bitrate), _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700521
522 const std::vector<uint32_t> ssrcs = {1234};
523 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
524 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
525 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
526 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
527
528 // Test tear-down.
529 packet_router.RemoveSendRtpModule(&remb_sender);
530}
531
532TEST(PacketRouterRembTest,
533 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
534 rtc::ScopedFakeClock clock;
535 PacketRouter packet_router;
536 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200537 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700538 constexpr bool remb_candidate = true;
539 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700540
541 const uint32_t measured_bitrate_bps = 150000;
542 const uint32_t cap_bitrate_bps = measured_bitrate_bps - 5000;
543 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200544 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700545 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
546
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200547 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700548 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
549
550 // Test tear-down.
551 packet_router.RemoveSendRtpModule(&remb_sender);
552}
553
554TEST(PacketRouterRembTest,
555 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
556 rtc::ScopedFakeClock clock;
557 PacketRouter packet_router;
558 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200559 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700560 constexpr bool remb_candidate = true;
561 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700562
563 const uint32_t measured_bitrate_bps = 150000;
564 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
565 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200566 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700567 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
568
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200569 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700570 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
571
572 // Test tear-down.
573 packet_router.RemoveSendRtpModule(&remb_sender);
574}
575
576TEST(PacketRouterRembTest,
577 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
578 rtc::ScopedFakeClock clock;
579 PacketRouter packet_router;
580 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200581 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700582 constexpr bool remb_candidate = true;
583 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700584
585 const uint32_t measured_bitrate_bps = 150000;
586 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
587 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200588 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700589 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
590
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200591 EXPECT_CALL(remb_sender, SetRemb(_, _)).Times(0);
danilchap47085372017-08-10 06:03:57 -0700592 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
593
594 // Test tear-down.
595 packet_router.RemoveSendRtpModule(&remb_sender);
596}
597
598TEST(PacketRouterRembTest,
599 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
600 rtc::ScopedFakeClock clock;
601 PacketRouter packet_router;
602 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200603 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700604 constexpr bool remb_candidate = true;
605 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700606
607 const uint32_t measured_bitrate_bps = 150000;
608 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
609 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200610 EXPECT_CALL(remb_sender, SetRemb(measured_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700611 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
612 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
613
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200614 EXPECT_CALL(remb_sender, SetRemb(cap_bitrate_bps, _));
danilchap47085372017-08-10 06:03:57 -0700615 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
616
617 // Test tear-down.
618 packet_router.RemoveSendRtpModule(&remb_sender);
619}
620
621TEST(PacketRouterRembTest,
622 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
623 rtc::ScopedFakeClock clock;
624 PacketRouter packet_router;
625 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200626 NiceMock<MockRtpRtcp> remb_sender;
danilchap47085372017-08-10 06:03:57 -0700627 constexpr bool remb_candidate = true;
628 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
danilchap47085372017-08-10 06:03:57 -0700629
630 // Set cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200631 EXPECT_CALL(remb_sender, SetRemb(100000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700632 packet_router.SetMaxDesiredReceiveBitrate(100000);
633 // Increase cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200634 EXPECT_CALL(remb_sender, SetRemb(200000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700635 packet_router.SetMaxDesiredReceiveBitrate(200000);
636 // Decrease cap.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200637 EXPECT_CALL(remb_sender, SetRemb(150000, _)).Times(1);
danilchap47085372017-08-10 06:03:57 -0700638 packet_router.SetMaxDesiredReceiveBitrate(150000);
639
640 // Test tear-down.
641 packet_router.RemoveSendRtpModule(&remb_sender);
642}
643
nisse05843312017-04-18 23:38:35 -0700644// Only register receiving modules and make sure we fallback to trigger a REMB
645// packet on this one.
646TEST(PacketRouterRembTest, NoSendingRtpModule) {
647 rtc::ScopedFakeClock clock;
eladalon6c9556e2017-07-10 03:33:00 -0700648 NiceMock<MockRtpRtcp> rtp;
nisse05843312017-04-18 23:38:35 -0700649 PacketRouter packet_router;
650
eladalon822ff2b2017-08-01 06:30:28 -0700651 packet_router.AddReceiveRtpModule(&rtp, true);
nisse05843312017-04-18 23:38:35 -0700652
653 uint32_t bitrate_estimate = 456;
654 const std::vector<uint32_t> ssrcs = {1234};
655
nisse05843312017-04-18 23:38:35 -0700656 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
657
658 // Call OnReceiveBitrateChanged twice to get a first estimate.
659 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200660 EXPECT_CALL(rtp, SetRemb(bitrate_estimate, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700661 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
662
663 // Lower the estimate to trigger a new packet REMB packet.
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200664 EXPECT_CALL(rtp, SetRemb(bitrate_estimate - 100, ssrcs)).Times(1);
nisse05843312017-04-18 23:38:35 -0700665 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
666
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200667 EXPECT_CALL(rtp, UnsetRemb()).Times(1);
nisse05843312017-04-18 23:38:35 -0700668 packet_router.RemoveReceiveRtpModule(&rtp);
669}
670
eladalon822ff2b2017-08-01 06:30:28 -0700671TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
672 rtc::ScopedFakeClock clock;
673 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200674 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700675
676 constexpr bool remb_candidate = false;
677
678 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700679
680 constexpr uint32_t bitrate_estimate = 456;
681 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200682 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700683 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
684 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
685
686 // Test tear-down
687 packet_router.RemoveSendRtpModule(&module);
688}
689
690TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
691 rtc::ScopedFakeClock clock;
692 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200693 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700694
695 constexpr bool remb_candidate = true;
696
697 packet_router.AddSendRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700698
699 constexpr uint32_t bitrate_estimate = 456;
700 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200701 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700702 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
703 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
704
705 // Test tear-down
706 packet_router.RemoveSendRtpModule(&module);
707}
708
709TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
710 rtc::ScopedFakeClock clock;
711 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200712 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700713
714 constexpr bool remb_candidate = false;
715
716 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700717
718 constexpr uint32_t bitrate_estimate = 456;
719 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200720 EXPECT_CALL(module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700721 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
722 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
723
724 // Test tear-down
725 packet_router.RemoveReceiveRtpModule(&module);
726}
727
728TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
729 rtc::ScopedFakeClock clock;
730 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200731 NiceMock<MockRtpRtcp> module;
eladalon822ff2b2017-08-01 06:30:28 -0700732
733 constexpr bool remb_candidate = true;
734
735 packet_router.AddReceiveRtpModule(&module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700736
737 constexpr uint32_t bitrate_estimate = 456;
738 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200739 EXPECT_CALL(module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700740 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
741 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
742
743 // Test tear-down
744 packet_router.RemoveReceiveRtpModule(&module);
745}
746
747TEST(PacketRouterRembTest,
748 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
749 rtc::ScopedFakeClock clock;
750 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200751 NiceMock<MockRtpRtcp> send_module;
752 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700753
754 constexpr bool remb_candidate = true;
755
756 // Send module added - activated.
757 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700758
759 // Receive module added - the send module remains the active one.
760 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700761
762 constexpr uint32_t bitrate_estimate = 456;
763 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200764 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
765 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700766
767 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
768 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
769
770 // Test tear-down
771 packet_router.RemoveReceiveRtpModule(&receive_module);
772 packet_router.RemoveSendRtpModule(&send_module);
773}
774
775TEST(PacketRouterRembTest,
776 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
777 rtc::ScopedFakeClock clock;
778 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200779 NiceMock<MockRtpRtcp> send_module;
780 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700781
782 constexpr bool remb_candidate = true;
783
784 // Receive module added - activated.
785 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700786
787 // Send module added - replaces receive module as active.
788 packet_router.AddSendRtpModule(&send_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700789
790 constexpr uint32_t bitrate_estimate = 456;
791 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200792 EXPECT_CALL(send_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
793 EXPECT_CALL(receive_module, SetRemb(_, _)).Times(0);
eladalon822ff2b2017-08-01 06:30:28 -0700794
795 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
796 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
797
798 // Test tear-down
799 packet_router.RemoveReceiveRtpModule(&receive_module);
800 packet_router.RemoveSendRtpModule(&send_module);
801}
802
803TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
804 rtc::ScopedFakeClock clock;
805 PacketRouter packet_router;
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200806 NiceMock<MockRtpRtcp> send_module;
807 NiceMock<MockRtpRtcp> receive_module;
eladalon822ff2b2017-08-01 06:30:28 -0700808
809 constexpr bool remb_candidate = true;
810
811 // Send module active, receive module inactive.
812 packet_router.AddSendRtpModule(&send_module, remb_candidate);
813 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
eladalon822ff2b2017-08-01 06:30:28 -0700814
815 // Send module removed - receive module becomes active.
816 packet_router.RemoveSendRtpModule(&send_module);
eladalon822ff2b2017-08-01 06:30:28 -0700817 constexpr uint32_t bitrate_estimate = 456;
818 const std::vector<uint32_t> ssrcs = {1234};
Danil Chapovalov51e21aa2017-10-10 17:46:26 +0200819 EXPECT_CALL(send_module, SetRemb(_, _)).Times(0);
820 EXPECT_CALL(receive_module, SetRemb(bitrate_estimate, ssrcs)).Times(1);
eladalon822ff2b2017-08-01 06:30:28 -0700821
822 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
823 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
824
825 // Test tear-down
826 packet_router.RemoveReceiveRtpModule(&receive_module);
827}
828
Stefan Holmere5904162015-03-26 11:11:06 +0100829} // namespace webrtc