blob: c33f25ce930064c84ecb824c4f44472757f16e3d [file] [log] [blame]
Stefan Holmerca55fa12015-03-26 10:11:061/*
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>
kwiberg79588322016-03-17 16:17:4312#include <memory>
Stefan Holmerca55fa12015-03-26 10:11:0613
Henrik Kjellander273352e2015-11-16 10:12:2414#include "webrtc/modules/pacing/packet_router.h"
Henrik Kjellander36a14b52015-11-04 07:31:5215#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
Stefan Holmerca55fa12015-03-26 10:11:0616#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
stefan3dad57b2016-02-01 12:39:5517#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
Edward Lemur76de83e2017-07-06 17:44:3418#include "webrtc/rtc_base/checks.h"
19#include "webrtc/rtc_base/fakeclock.h"
kwiberg36a24792016-10-01 05:29:4320#include "webrtc/test/gmock.h"
21#include "webrtc/test/gtest.h"
Stefan Holmerca55fa12015-03-26 10:11:0622
Stefan Holmerca55fa12015-03-26 10:11:0623namespace webrtc {
24
eladalona207a3a2017-08-01 13:30:2825// 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
eladalond85e2fc2017-08-01 16:36:1930namespace {
danilchap4b4a3c52017-08-10 13:03:5731
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
eladalond85e2fc2017-08-01 16:36:1943constexpr int kProbeMinProbes = 5;
44constexpr int kProbeMinBytes = 1000;
45
eladalona207a3a2017-08-01 13:30:2846class MockRtpRtcpWithRembTracking : public MockRtpRtcp {
47 public:
48 MockRtpRtcpWithRembTracking() {
49 ON_CALL(*this, SetREMBStatus(_)).WillByDefault(SaveArg<0>(&remb_));
50 ON_CALL(*this, REMB()).WillByDefault(ReturnPointee(&remb_));
51 }
52
53 private:
54 bool remb_ = false;
55};
eladalond85e2fc2017-08-01 16:36:1956} // namespace
eladalona207a3a2017-08-01 13:30:2857
eladalon2d1672c2017-08-02 13:29:0058TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPacket) {
59 PacketRouter packet_router;
60
61 constexpr uint16_t ssrc = 1234;
62 constexpr uint16_t sequence_number = 17;
63 constexpr uint64_t timestamp = 7890;
64 constexpr bool retransmission = false;
65 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
66
67 // TODO(eladalon): TimeToSendPacket() returning true when nothing was
68 // sent, because no modules were registered, is sub-optimal.
69 // https://bugs.chromium.org/p/webrtc/issues/detail?id=8052
70 EXPECT_TRUE(packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
71 retransmission, paced_info));
72}
73
74TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
75 PacketRouter packet_router;
76
77 constexpr size_t bytes = 300;
78 const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
79
80 EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
81}
82
83TEST(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
84 PacketRouter packet_router;
85
86 const std::vector<uint32_t> ssrcs = {1, 2, 3};
87 constexpr uint32_t bitrate_bps = 10000;
88
89 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
90}
91
92TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
93 PacketRouter packet_router;
94
95 const std::vector<uint32_t> ssrcs = {1, 2, 3};
96 constexpr uint32_t bitrate_bps = 10000;
97
98 EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
99}
100
101TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
102 PacketRouter packet_router;
103
104 rtcp::TransportFeedback feedback;
105
106 EXPECT_FALSE(packet_router.SendTransportFeedback(&feedback));
107}
108
eladalond85e2fc2017-08-01 16:36:19109TEST(PacketRouterTest, TimeToSendPacket) {
110 PacketRouter packet_router;
eladalonabb239e2017-07-10 10:33:00111 NiceMock<MockRtpRtcp> rtp_1;
112 NiceMock<MockRtpRtcp> rtp_2;
eladalond85e2fc2017-08-01 16:36:19113
114 packet_router.AddSendRtpModule(&rtp_1, false);
115 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmerca55fa12015-03-26 10:11:06116
117 const uint16_t kSsrc1 = 1234;
118 uint16_t sequence_number = 17;
119 uint64_t timestamp = 7890;
120 bool retransmission = false;
121
122 // Send on the first module by letting rtp_1 be sending with correct ssrc.
123 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
124 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
philipele8e23932017-02-17 11:59:43125 EXPECT_CALL(rtp_1, TimeToSendPacket(
126 kSsrc1, sequence_number, timestamp, retransmission,
127 Field(&PacedPacketInfo::probe_cluster_id, 1)))
Stefan Holmerca55fa12015-03-26 10:11:06128 .Times(1)
129 .WillOnce(Return(true));
philipel49e9dd62016-06-01 13:31:17130 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalond85e2fc2017-08-01 16:36:19131 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipele8e23932017-02-17 11:59:43132 kSsrc1, sequence_number, timestamp, retransmission,
133 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06134
135 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
136 ++sequence_number;
137 timestamp += 30;
138 retransmission = true;
139 const uint16_t kSsrc2 = 4567;
140 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
141 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
142 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipel49e9dd62016-06-01 13:31:17143 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipele8e23932017-02-17 11:59:43144 EXPECT_CALL(rtp_2, TimeToSendPacket(
145 kSsrc2, sequence_number, timestamp, retransmission,
146 Field(&PacedPacketInfo::probe_cluster_id, 2)))
Stefan Holmerca55fa12015-03-26 10:11:06147 .Times(1)
148 .WillOnce(Return(true));
eladalond85e2fc2017-08-01 16:36:19149 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipele8e23932017-02-17 11:59:43150 kSsrc2, sequence_number, timestamp, retransmission,
151 PacedPacketInfo(2, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06152
153 // No module is sending, hence no packet should be sent.
154 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipel49e9dd62016-06-01 13:31:17155 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
Stefan Holmerca55fa12015-03-26 10:11:06156 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipel49e9dd62016-06-01 13:31:17157 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalond85e2fc2017-08-01 16:36:19158 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipele8e23932017-02-17 11:59:43159 kSsrc1, sequence_number, timestamp, retransmission,
160 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06161
162 // Add a packet with incorrect ssrc and test it's dropped in the router.
163 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
164 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
165 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
166 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipel49e9dd62016-06-01 13:31:17167 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
168 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalond85e2fc2017-08-01 16:36:19169 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipele8e23932017-02-17 11:59:43170 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
171 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06172
eladalond85e2fc2017-08-01 16:36:19173 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmerca55fa12015-03-26 10:11:06174
175 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
176 // it is dropped as expected by not expecting any calls to rtp_1.
177 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
178 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipel49e9dd62016-06-01 13:31:17179 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalond85e2fc2017-08-01 16:36:19180 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipele8e23932017-02-17 11:59:43181 kSsrc1, sequence_number, timestamp, retransmission,
182 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
183 kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06184
eladalond85e2fc2017-08-01 16:36:19185 packet_router.RemoveSendRtpModule(&rtp_2);
Stefan Holmerca55fa12015-03-26 10:11:06186}
187
eladalond85e2fc2017-08-01 16:36:19188TEST(PacketRouterTest, TimeToSendPadding) {
189 PacketRouter packet_router;
190
sprang374a5702015-08-03 11:38:41191 const uint16_t kSsrc1 = 1234;
192 const uint16_t kSsrc2 = 4567;
193
eladalonabb239e2017-07-10 10:33:00194 NiceMock<MockRtpRtcp> rtp_1;
stefana7eb4942017-01-27 15:12:16195 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
sprang374a5702015-08-03 11:38:41196 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
eladalonabb239e2017-07-10 10:33:00197 NiceMock<MockRtpRtcp> rtp_2;
stefana7eb4942017-01-27 15:12:16198 // rtp_2 will be prioritized for padding.
199 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
sprang374a5702015-08-03 11:38:41200 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
eladalond85e2fc2017-08-01 16:36:19201 packet_router.AddSendRtpModule(&rtp_1, false);
202 packet_router.AddSendRtpModule(&rtp_2, false);
Stefan Holmerca55fa12015-03-26 10:11:06203
sprang374a5702015-08-03 11:38:41204 // Default configuration, sending padding on all modules sending media,
stefana7eb4942017-01-27 15:12:16205 // ordered by priority (based on rtx mode).
Stefan Holmerca55fa12015-03-26 10:11:06206 const size_t requested_padding_bytes = 1000;
207 const size_t sent_padding_bytes = 890;
stefana7eb4942017-01-27 15:12:16208 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefanf77959b2017-02-03 16:13:57209 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipele8e23932017-02-17 11:59:43210 EXPECT_CALL(rtp_2,
211 TimeToSendPadding(requested_padding_bytes,
212 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmerca55fa12015-03-26 10:11:06213 .Times(1)
214 .WillOnce(Return(sent_padding_bytes));
stefana7eb4942017-01-27 15:12:16215 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefanf77959b2017-02-03 16:13:57216 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipele8e23932017-02-17 11:59:43217 EXPECT_CALL(rtp_1,
218 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
219 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang374a5702015-08-03 11:38:41220 .Times(1)
221 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
222 EXPECT_EQ(requested_padding_bytes,
eladalond85e2fc2017-08-01 16:36:19223 packet_router.TimeToSendPadding(
philipele8e23932017-02-17 11:59:43224 requested_padding_bytes,
225 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06226
stefana7eb4942017-01-27 15:12:16227 // Let only the lower priority module be sending and verify the padding
228 // request is routed there.
229 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
230 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
231 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefanf77959b2017-02-03 16:13:57232 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
stefana7eb4942017-01-27 15:12:16233 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmerca55fa12015-03-26 10:11:06234 .Times(1)
235 .WillOnce(Return(sent_padding_bytes));
236 EXPECT_EQ(sent_padding_bytes,
eladalond85e2fc2017-08-01 16:36:19237 packet_router.TimeToSendPadding(
philipele8e23932017-02-17 11:59:43238 requested_padding_bytes,
239 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
240 kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06241
242 // No sending module at all.
243 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipel49e9dd62016-06-01 13:31:17244 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Stefan Holmerca55fa12015-03-26 10:11:06245 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipel49e9dd62016-06-01 13:31:17246 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
philipele8e23932017-02-17 11:59:43247 EXPECT_EQ(0u,
eladalond85e2fc2017-08-01 16:36:19248 packet_router.TimeToSendPadding(
philipele8e23932017-02-17 11:59:43249 requested_padding_bytes,
250 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
251 kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06252
stefanf77959b2017-02-03 16:13:57253 // Only one module has BWE extensions.
254 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
255 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
256 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
257 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
258 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
259 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
260 .Times(1)
261 .WillOnce(Return(sent_padding_bytes));
262 EXPECT_EQ(sent_padding_bytes,
eladalond85e2fc2017-08-01 16:36:19263 packet_router.TimeToSendPadding(
philipele8e23932017-02-17 11:59:43264 requested_padding_bytes,
265 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
266 kProbeMinBytes)));
stefanf77959b2017-02-03 16:13:57267
eladalond85e2fc2017-08-01 16:36:19268 packet_router.RemoveSendRtpModule(&rtp_1);
Stefan Holmerca55fa12015-03-26 10:11:06269
270 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
271 // to send by not expecting any calls. Instead verify rtp_2 is called.
272 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefanf77959b2017-02-03 16:13:57273 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipel49e9dd62016-06-01 13:31:17274 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
philipele8e23932017-02-17 11:59:43275 EXPECT_EQ(0u,
eladalond85e2fc2017-08-01 16:36:19276 packet_router.TimeToSendPadding(
philipele8e23932017-02-17 11:59:43277 requested_padding_bytes,
278 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
279 kProbeMinBytes)));
Stefan Holmerca55fa12015-03-26 10:11:06280
eladalond85e2fc2017-08-01 16:36:19281 packet_router.RemoveSendRtpModule(&rtp_2);
Peter Boströma1b258f2016-02-25 15:56:48282}
283
eladalond85e2fc2017-08-01 16:36:19284TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
285 PacketRouter packet_router;
eladalonabb239e2017-07-10 10:33:00286 NiceMock<MockRtpRtcp> rtp;
eladalond85e2fc2017-08-01 16:36:19287 packet_router.AddSendRtpModule(&rtp, false);
Peter Boströma1b258f2016-02-25 15:56:48288 static const uint16_t kSsrc = 1234;
289 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
290 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
291
292 // Verify that TimeToSendPacket does not end up in a receiver.
philipel49e9dd62016-06-01 13:31:17293 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
eladalond85e2fc2017-08-01 16:36:19294 EXPECT_TRUE(packet_router.TimeToSendPacket(
philipele8e23932017-02-17 11:59:43295 kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
296 kProbeMinBytes, kProbeMinBytes)));
Peter Boströma1b258f2016-02-25 15:56:48297 // Verify that TimeToSendPadding does not end up in a receiver.
philipel49e9dd62016-06-01 13:31:17298 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
philipele8e23932017-02-17 11:59:43299 EXPECT_EQ(0u,
eladalond85e2fc2017-08-01 16:36:19300 packet_router.TimeToSendPadding(
philipele8e23932017-02-17 11:59:43301 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
302 kProbeMinBytes, kProbeMinBytes)));
Peter Boströma1b258f2016-02-25 15:56:48303
eladalond85e2fc2017-08-01 16:36:19304 packet_router.RemoveSendRtpModule(&rtp);
Stefan Holmerca55fa12015-03-26 10:11:06305}
sprang374a5702015-08-03 11:38:41306
eladalond85e2fc2017-08-01 16:36:19307TEST(PacketRouterTest, AllocateSequenceNumbers) {
308 PacketRouter packet_router;
309
sprang374a5702015-08-03 11:38:41310 const uint16_t kStartSeq = 0xFFF0;
311 const size_t kNumPackets = 32;
312
eladalond85e2fc2017-08-01 16:36:19313 packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
sprang374a5702015-08-03 11:38:41314
315 for (size_t i = 0; i < kNumPackets; ++i) {
eladalond85e2fc2017-08-01 16:36:19316 uint16_t seq = packet_router.AllocateSequenceNumber();
sprang374a5702015-08-03 11:38:41317 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
318 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
319 }
320}
stefan3dad57b2016-02-01 12:39:55321
eladalond85e2fc2017-08-01 16:36:19322TEST(PacketRouterTest, SendTransportFeedback) {
323 PacketRouter packet_router;
eladalonabb239e2017-07-10 10:33:00324 NiceMock<MockRtpRtcp> rtp_1;
325 NiceMock<MockRtpRtcp> rtp_2;
eladalond85e2fc2017-08-01 16:36:19326
327 packet_router.AddSendRtpModule(&rtp_1, false);
328 packet_router.AddReceiveRtpModule(&rtp_2, false);
stefan3dad57b2016-02-01 12:39:55329
330 rtcp::TransportFeedback feedback;
nisse7e3c9202017-04-19 06:38:35331 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalond85e2fc2017-08-01 16:36:19332 packet_router.SendTransportFeedback(&feedback);
333 packet_router.RemoveSendRtpModule(&rtp_1);
nisse7e3c9202017-04-19 06:38:35334 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
eladalond85e2fc2017-08-01 16:36:19335 packet_router.SendTransportFeedback(&feedback);
336 packet_router.RemoveReceiveRtpModule(&rtp_2);
stefan3dad57b2016-02-01 12:39:55337}
nisse7e3c9202017-04-19 06:38:35338
eladalona207a3a2017-08-01 13:30:28339#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalond85e2fc2017-08-01 16:36:19340TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
341 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28342 NiceMock<MockRtpRtcp> module;
343
344 constexpr bool remb_candidate = false; // Value irrelevant.
eladalond85e2fc2017-08-01 16:36:19345 packet_router.AddSendRtpModule(&module, remb_candidate);
346 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
eladalona207a3a2017-08-01 13:30:28347
348 // Test tear-down
eladalond85e2fc2017-08-01 16:36:19349 packet_router.RemoveSendRtpModule(&module);
eladalona207a3a2017-08-01 13:30:28350}
351
eladalond85e2fc2017-08-01 16:36:19352TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
353 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28354 NiceMock<MockRtpRtcp> module;
355
356 constexpr bool remb_candidate = false; // Value irrelevant.
eladalond85e2fc2017-08-01 16:36:19357 packet_router.AddReceiveRtpModule(&module, remb_candidate);
358 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
eladalona207a3a2017-08-01 13:30:28359
360 // Test tear-down
eladalond85e2fc2017-08-01 16:36:19361 packet_router.RemoveReceiveRtpModule(&module);
eladalona207a3a2017-08-01 13:30:28362}
363
eladalond85e2fc2017-08-01 16:36:19364TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
365 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28366 NiceMock<MockRtpRtcp> module;
367
eladalond85e2fc2017-08-01 16:36:19368 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
eladalona207a3a2017-08-01 13:30:28369}
370
eladalond85e2fc2017-08-01 16:36:19371TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
372 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28373 NiceMock<MockRtpRtcp> module;
374
eladalond85e2fc2017-08-01 16:36:19375 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
eladalona207a3a2017-08-01 13:30:28376}
377#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
378
379// TODO(eladalon): Remove this test; it should be covered by:
380// 1. SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst
381// 2. SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst
382// 3. LowerEstimateToSendRemb
383// (Not removing in this CL to prove it doesn't break this test.)
nisse7e3c9202017-04-19 06:38:35384TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) {
385 rtc::ScopedFakeClock clock;
eladalona207a3a2017-08-01 13:30:28386 NiceMock<MockRtpRtcpWithRembTracking> rtp_recv;
387 NiceMock<MockRtpRtcpWithRembTracking> rtp_send;
nisse7e3c9202017-04-19 06:38:35388 PacketRouter packet_router;
389
eladalona207a3a2017-08-01 13:30:28390 packet_router.AddReceiveRtpModule(&rtp_recv, true);
391 ASSERT_TRUE(rtp_recv.REMB());
nisse7e3c9202017-04-19 06:38:35392
393 const uint32_t bitrate_estimate = 456;
394 const std::vector<uint32_t> ssrcs = {1234};
395
nisse7e3c9202017-04-19 06:38:35396 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
397
398 // Call OnReceiveBitrateChanged twice to get a first estimate.
399 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
400 EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
401 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
402
403 // Add a send module, which should be preferred over the receive module.
eladalona207a3a2017-08-01 13:30:28404 packet_router.AddSendRtpModule(&rtp_send, true);
405 EXPECT_FALSE(rtp_recv.REMB());
406 EXPECT_TRUE(rtp_send.REMB());
nisse7e3c9202017-04-19 06:38:35407
408 // Lower bitrate to send another REMB packet.
409 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
410 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
411
nisse7e3c9202017-04-19 06:38:35412 packet_router.RemoveSendRtpModule(&rtp_send);
eladalona207a3a2017-08-01 13:30:28413 EXPECT_TRUE(rtp_recv.REMB());
414 EXPECT_FALSE(rtp_send.REMB());
415
nisse7e3c9202017-04-19 06:38:35416 packet_router.RemoveReceiveRtpModule(&rtp_recv);
417}
418
419TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
420 rtc::ScopedFakeClock clock;
eladalona207a3a2017-08-01 13:30:28421 NiceMock<MockRtpRtcpWithRembTracking> rtp;
nisse7e3c9202017-04-19 06:38:35422 PacketRouter packet_router;
423
eladalona207a3a2017-08-01 13:30:28424 packet_router.AddSendRtpModule(&rtp, true);
425 EXPECT_TRUE(rtp.REMB());
nisse7e3c9202017-04-19 06:38:35426
427 uint32_t bitrate_estimate = 456;
428 const std::vector<uint32_t> ssrcs = {1234};
429
nisse7e3c9202017-04-19 06:38:35430 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
431
432 // Call OnReceiveBitrateChanged twice to get a first estimate.
433 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
434 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
435 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
436
437 // Lower the estimate with more than 3% to trigger a call to SetREMBData right
438 // away.
439 bitrate_estimate = bitrate_estimate - 100;
440 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
441 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
442
nisse7e3c9202017-04-19 06:38:35443 packet_router.RemoveSendRtpModule(&rtp);
eladalona207a3a2017-08-01 13:30:28444 EXPECT_FALSE(rtp.REMB());
nisse7e3c9202017-04-19 06:38:35445}
446
447TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
448 rtc::ScopedFakeClock clock;
eladalonabb239e2017-07-10 10:33:00449 NiceMock<MockRtpRtcp> rtp;
nisse7e3c9202017-04-19 06:38:35450 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28451 packet_router.AddSendRtpModule(&rtp, true);
nisse7e3c9202017-04-19 06:38:35452
453 uint32_t bitrate_estimate[] = {456, 789};
454 std::vector<uint32_t> ssrcs = {1234, 5678};
455
456 ON_CALL(rtp, REMB()).WillByDefault(Return(true));
457 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
458
459 // Call OnReceiveBitrateChanged twice to get a first estimate.
460 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[0], ssrcs)).Times(1);
461 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
462 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
463
464 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
465
466 // Lower the estimate to trigger a callback.
467 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[1], ssrcs)).Times(1);
468 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
469
470 packet_router.RemoveSendRtpModule(&rtp);
471}
472
473TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
474 rtc::ScopedFakeClock clock;
eladalonabb239e2017-07-10 10:33:00475 NiceMock<MockRtpRtcp> rtp;
nisse7e3c9202017-04-19 06:38:35476 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28477 packet_router.AddSendRtpModule(&rtp, true);
nisse7e3c9202017-04-19 06:38:35478
479 uint32_t bitrate_estimate = 456;
480 std::vector<uint32_t> ssrcs = {1234, 5678};
481
482 ON_CALL(rtp, REMB()).WillByDefault(Return(true));
483 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
484
485 // Call OnReceiveBitrateChanged twice to get a first estimate.
486 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
487 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
488 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
489
490 // Increased estimate shouldn't trigger a callback right away.
491 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
492 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
493
494 // Decreasing the estimate less than 3% shouldn't trigger a new callback.
495 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
496 int lower_estimate = bitrate_estimate * 98 / 100;
497 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
498
499 packet_router.RemoveSendRtpModule(&rtp);
500}
501
502TEST(PacketRouterRembTest, ChangeSendRtpModule) {
503 rtc::ScopedFakeClock clock;
eladalonabb239e2017-07-10 10:33:00504 NiceMock<MockRtpRtcp> rtp_send;
505 NiceMock<MockRtpRtcp> rtp_recv;
nisse7e3c9202017-04-19 06:38:35506 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28507 packet_router.AddSendRtpModule(&rtp_send, true);
508 packet_router.AddReceiveRtpModule(&rtp_recv, true);
nisse7e3c9202017-04-19 06:38:35509
510 uint32_t bitrate_estimate = 456;
511 std::vector<uint32_t> ssrcs = {1234, 5678};
512
513 ON_CALL(rtp_send, REMB()).WillByDefault(Return(true));
514 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
515
516 // Call OnReceiveBitrateChanged twice to get a first estimate.
517 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
518 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
519 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
520
521 // Decrease estimate to trigger a REMB.
522 bitrate_estimate = bitrate_estimate - 100;
523 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
524 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
525
526 // Remove the sending module -> should get remb on the second module.
527 packet_router.RemoveSendRtpModule(&rtp_send);
528
529 ON_CALL(rtp_send, REMB()).WillByDefault(Return(false));
530 ON_CALL(rtp_recv, REMB()).WillByDefault(Return(true));
531
532 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
533
534 bitrate_estimate = bitrate_estimate - 100;
535 EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
536 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
537
538 packet_router.RemoveReceiveRtpModule(&rtp_recv);
539}
540
541TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
542 rtc::ScopedFakeClock clock;
eladalonabb239e2017-07-10 10:33:00543 NiceMock<MockRtpRtcp> rtp;
nisse7e3c9202017-04-19 06:38:35544 PacketRouter packet_router;
eladalona207a3a2017-08-01 13:30:28545 packet_router.AddSendRtpModule(&rtp, true);
nisse7e3c9202017-04-19 06:38:35546
547 uint32_t bitrate_estimate = 456;
548 const std::vector<uint32_t> ssrcs = {1234};
549
550 ON_CALL(rtp, REMB()).WillByDefault(Return(true));
551 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
552
553 // Call OnReceiveBitrateChanged twice to get a first estimate.
554 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
555 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(1);
556 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
557
558 // Lower the estimate, should trigger a call to SetREMBData right away.
559 bitrate_estimate = bitrate_estimate - 100;
560 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
561 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
562
563 // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
564 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
565 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
566 packet_router.RemoveSendRtpModule(&rtp);
567}
568
danilchap4b4a3c52017-08-10 13:03:57569TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetREMBData) {
570 rtc::ScopedFakeClock clock;
571 PacketRouter packet_router;
572 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
573 NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
574 constexpr bool remb_candidate = true;
575 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
576 ASSERT_TRUE(remb_sender.REMB());
577
578 const uint32_t cap_bitrate = 100000;
579 EXPECT_CALL(remb_sender, SetREMBData(Le(cap_bitrate), _)).Times(AtLeast(1));
580 EXPECT_CALL(remb_sender, SetREMBData(Gt(cap_bitrate), _)).Times(0);
581
582 const std::vector<uint32_t> ssrcs = {1234};
583 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
584 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
585 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
586 packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
587
588 // Test tear-down.
589 packet_router.RemoveSendRtpModule(&remb_sender);
590}
591
592TEST(PacketRouterRembTest,
593 SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
594 rtc::ScopedFakeClock clock;
595 PacketRouter packet_router;
596 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
597 NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
598 constexpr bool remb_candidate = true;
599 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
600 ASSERT_TRUE(remb_sender.REMB());
601
602 const uint32_t measured_bitrate_bps = 150000;
603 const uint32_t cap_bitrate_bps = measured_bitrate_bps - 5000;
604 const std::vector<uint32_t> ssrcs = {1234};
605 EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
606 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
607
608 EXPECT_CALL(remb_sender, SetREMBData(cap_bitrate_bps, _));
609 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
610
611 // Test tear-down.
612 packet_router.RemoveSendRtpModule(&remb_sender);
613}
614
615TEST(PacketRouterRembTest,
616 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
617 rtc::ScopedFakeClock clock;
618 PacketRouter packet_router;
619 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
620 NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
621 constexpr bool remb_candidate = true;
622 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
623 ASSERT_TRUE(remb_sender.REMB());
624
625 const uint32_t measured_bitrate_bps = 150000;
626 const uint32_t cap_bitrate_bps = measured_bitrate_bps;
627 const std::vector<uint32_t> ssrcs = {1234};
628 EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
629 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
630
631 EXPECT_CALL(remb_sender, SetREMBData(_, _)).Times(0);
632 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
633
634 // Test tear-down.
635 packet_router.RemoveSendRtpModule(&remb_sender);
636}
637
638TEST(PacketRouterRembTest,
639 SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
640 rtc::ScopedFakeClock clock;
641 PacketRouter packet_router;
642 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
643 NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
644 constexpr bool remb_candidate = true;
645 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
646 ASSERT_TRUE(remb_sender.REMB());
647
648 const uint32_t measured_bitrate_bps = 150000;
649 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
650 const std::vector<uint32_t> ssrcs = {1234};
651 EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
652 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
653
654 EXPECT_CALL(remb_sender, SetREMBData(_, _)).Times(0);
655 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
656
657 // Test tear-down.
658 packet_router.RemoveSendRtpModule(&remb_sender);
659}
660
661TEST(PacketRouterRembTest,
662 SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
663 rtc::ScopedFakeClock clock;
664 PacketRouter packet_router;
665 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
666 NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
667 constexpr bool remb_candidate = true;
668 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
669 ASSERT_TRUE(remb_sender.REMB());
670
671 const uint32_t measured_bitrate_bps = 150000;
672 const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
673 const std::vector<uint32_t> ssrcs = {1234};
674 EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
675 packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
676 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
677
678 EXPECT_CALL(remb_sender, SetREMBData(cap_bitrate_bps, _));
679 packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
680
681 // Test tear-down.
682 packet_router.RemoveSendRtpModule(&remb_sender);
683}
684
685TEST(PacketRouterRembTest,
686 SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
687 rtc::ScopedFakeClock clock;
688 PacketRouter packet_router;
689 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
690 NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
691 constexpr bool remb_candidate = true;
692 packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
693 ASSERT_TRUE(remb_sender.REMB());
694
695 // Set cap.
696 EXPECT_CALL(remb_sender, SetREMBData(100000, _)).Times(1);
697 packet_router.SetMaxDesiredReceiveBitrate(100000);
698 // Increase cap.
699 EXPECT_CALL(remb_sender, SetREMBData(200000, _)).Times(1);
700 packet_router.SetMaxDesiredReceiveBitrate(200000);
701 // Decrease cap.
702 EXPECT_CALL(remb_sender, SetREMBData(150000, _)).Times(1);
703 packet_router.SetMaxDesiredReceiveBitrate(150000);
704
705 // Test tear-down.
706 packet_router.RemoveSendRtpModule(&remb_sender);
707}
708
nisse7e3c9202017-04-19 06:38:35709// Only register receiving modules and make sure we fallback to trigger a REMB
710// packet on this one.
711TEST(PacketRouterRembTest, NoSendingRtpModule) {
712 rtc::ScopedFakeClock clock;
eladalonabb239e2017-07-10 10:33:00713 NiceMock<MockRtpRtcp> rtp;
nisse7e3c9202017-04-19 06:38:35714 PacketRouter packet_router;
715
716 EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1);
eladalona207a3a2017-08-01 13:30:28717 packet_router.AddReceiveRtpModule(&rtp, true);
nisse7e3c9202017-04-19 06:38:35718
719 uint32_t bitrate_estimate = 456;
720 const std::vector<uint32_t> ssrcs = {1234};
721
722 ON_CALL(rtp, REMB()).WillByDefault(Return(true));
723 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
724
725 // Call OnReceiveBitrateChanged twice to get a first estimate.
726 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
727 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
728 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
729
730 // Lower the estimate to trigger a new packet REMB packet.
731 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
732 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
733
734 EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1);
735 packet_router.RemoveReceiveRtpModule(&rtp);
736}
737
eladalona207a3a2017-08-01 13:30:28738TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
739 rtc::ScopedFakeClock clock;
740 PacketRouter packet_router;
741 NiceMock<MockRtpRtcpWithRembTracking> module;
742
743 constexpr bool remb_candidate = false;
744
745 packet_router.AddSendRtpModule(&module, remb_candidate);
746 EXPECT_FALSE(module.REMB());
747
748 constexpr uint32_t bitrate_estimate = 456;
749 const std::vector<uint32_t> ssrcs = {1234};
750 EXPECT_CALL(module, SetREMBData(_, _)).Times(0);
751 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
752 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
753
754 // Test tear-down
755 packet_router.RemoveSendRtpModule(&module);
756}
757
758TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
759 rtc::ScopedFakeClock clock;
760 PacketRouter packet_router;
761 NiceMock<MockRtpRtcpWithRembTracking> module;
762
763 constexpr bool remb_candidate = true;
764
765 packet_router.AddSendRtpModule(&module, remb_candidate);
766 EXPECT_TRUE(module.REMB());
767
768 constexpr uint32_t bitrate_estimate = 456;
769 const std::vector<uint32_t> ssrcs = {1234};
770 EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
771 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
772 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
773
774 // Test tear-down
775 packet_router.RemoveSendRtpModule(&module);
776}
777
778TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
779 rtc::ScopedFakeClock clock;
780 PacketRouter packet_router;
781 NiceMock<MockRtpRtcpWithRembTracking> module;
782
783 constexpr bool remb_candidate = false;
784
785 packet_router.AddReceiveRtpModule(&module, remb_candidate);
786 ASSERT_FALSE(module.REMB());
787
788 constexpr uint32_t bitrate_estimate = 456;
789 const std::vector<uint32_t> ssrcs = {1234};
790 EXPECT_CALL(module, SetREMBData(_, _)).Times(0);
791 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
792 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
793
794 // Test tear-down
795 packet_router.RemoveReceiveRtpModule(&module);
796}
797
798TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
799 rtc::ScopedFakeClock clock;
800 PacketRouter packet_router;
801 NiceMock<MockRtpRtcpWithRembTracking> module;
802
803 constexpr bool remb_candidate = true;
804
805 packet_router.AddReceiveRtpModule(&module, remb_candidate);
806 EXPECT_TRUE(module.REMB());
807
808 constexpr uint32_t bitrate_estimate = 456;
809 const std::vector<uint32_t> ssrcs = {1234};
810 EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
811 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
812 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
813
814 // Test tear-down
815 packet_router.RemoveReceiveRtpModule(&module);
816}
817
818TEST(PacketRouterRembTest,
819 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
820 rtc::ScopedFakeClock clock;
821 PacketRouter packet_router;
822 NiceMock<MockRtpRtcpWithRembTracking> send_module;
823 NiceMock<MockRtpRtcpWithRembTracking> receive_module;
824
825 constexpr bool remb_candidate = true;
826
827 // Send module added - activated.
828 packet_router.AddSendRtpModule(&send_module, remb_candidate);
829 ASSERT_TRUE(send_module.REMB());
830
831 // Receive module added - the send module remains the active one.
832 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
833 EXPECT_TRUE(send_module.REMB());
834 EXPECT_FALSE(receive_module.REMB());
835
836 constexpr uint32_t bitrate_estimate = 456;
837 const std::vector<uint32_t> ssrcs = {1234};
838 EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
839 EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0);
840
841 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
842 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
843
844 // Test tear-down
845 packet_router.RemoveReceiveRtpModule(&receive_module);
846 packet_router.RemoveSendRtpModule(&send_module);
847}
848
849TEST(PacketRouterRembTest,
850 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
851 rtc::ScopedFakeClock clock;
852 PacketRouter packet_router;
853 NiceMock<MockRtpRtcpWithRembTracking> send_module;
854 NiceMock<MockRtpRtcpWithRembTracking> receive_module;
855
856 constexpr bool remb_candidate = true;
857
858 // Receive module added - activated.
859 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
860 ASSERT_TRUE(receive_module.REMB());
861
862 // Send module added - replaces receive module as active.
863 packet_router.AddSendRtpModule(&send_module, remb_candidate);
864 EXPECT_FALSE(receive_module.REMB());
865 EXPECT_TRUE(send_module.REMB());
866
867 constexpr uint32_t bitrate_estimate = 456;
868 const std::vector<uint32_t> ssrcs = {1234};
869 EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
870 EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0);
871
872 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
873 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
874
875 // Test tear-down
876 packet_router.RemoveReceiveRtpModule(&receive_module);
877 packet_router.RemoveSendRtpModule(&send_module);
878}
879
880TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
881 rtc::ScopedFakeClock clock;
882 PacketRouter packet_router;
883 NiceMock<MockRtpRtcpWithRembTracking> send_module;
884 NiceMock<MockRtpRtcpWithRembTracking> receive_module;
885
886 constexpr bool remb_candidate = true;
887
888 // Send module active, receive module inactive.
889 packet_router.AddSendRtpModule(&send_module, remb_candidate);
890 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
891 ASSERT_TRUE(send_module.REMB());
892 ASSERT_FALSE(receive_module.REMB());
893
894 // Send module removed - receive module becomes active.
895 packet_router.RemoveSendRtpModule(&send_module);
896 EXPECT_FALSE(send_module.REMB());
897 EXPECT_TRUE(receive_module.REMB());
898 constexpr uint32_t bitrate_estimate = 456;
899 const std::vector<uint32_t> ssrcs = {1234};
900 EXPECT_CALL(send_module, SetREMBData(_, _)).Times(0);
901 EXPECT_CALL(receive_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
902
903 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
904 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
905
906 // Test tear-down
907 packet_router.RemoveReceiveRtpModule(&receive_module);
908}
909
Stefan Holmerca55fa12015-03-26 10:11:06910} // namespace webrtc