OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <list> | 11 #include <list> |
12 #include <memory> | 12 #include <memory> |
13 | 13 |
14 #include "webrtc/modules/pacing/packet_router.h" | 14 #include "webrtc/modules/pacing/packet_router.h" |
15 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 15 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
16 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" | 16 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" |
17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
18 #include "webrtc/rtc_base/checks.h" | 18 #include "webrtc/rtc_base/checks.h" |
19 #include "webrtc/rtc_base/fakeclock.h" | 19 #include "webrtc/rtc_base/fakeclock.h" |
20 #include "webrtc/test/gmock.h" | 20 #include "webrtc/test/gmock.h" |
21 #include "webrtc/test/gtest.h" | 21 #include "webrtc/test/gtest.h" |
22 | 22 |
23 using ::testing::_; | 23 using ::testing::_; |
24 using ::testing::AnyNumber; | 24 using ::testing::AnyNumber; |
25 using ::testing::Field; | 25 using ::testing::Field; |
26 using ::testing::NiceMock; | 26 using ::testing::NiceMock; |
27 using ::testing::Return; | 27 using ::testing::Return; |
28 using ::testing::ReturnPointee; | |
29 using ::testing::SaveArg; | |
28 | 30 |
29 namespace webrtc { | 31 namespace webrtc { |
30 | 32 |
33 // TODO(eladalon): Restructure and/or replace the existing monolithic tests | |
34 // (only some of the test are monolithic) according to the new | |
35 // guidelines - small tests for one thing at a time. | |
36 // (I'm not removing any tests during CL, so as to demonstrate no regressions.) | |
37 | |
38 class MockRtpRtcpWithRembTracking : public MockRtpRtcp { | |
39 public: | |
40 MockRtpRtcpWithRembTracking() { | |
41 ON_CALL(*this, SetREMBStatus(_)).WillByDefault(SaveArg<0>(&remb_)); | |
42 ON_CALL(*this, REMB()).WillByDefault(ReturnPointee(&remb_)); | |
43 } | |
44 | |
45 private: | |
46 bool remb_ = false; | |
47 }; | |
48 | |
31 class PacketRouterTest : public ::testing::Test { | 49 class PacketRouterTest : public ::testing::Test { |
32 public: | 50 public: |
33 PacketRouterTest() : packet_router_(new PacketRouter()) {} | 51 PacketRouterTest() : packet_router_(new PacketRouter()) {} |
34 protected: | 52 protected: |
35 static const int kProbeMinProbes = 5; | 53 static constexpr int kProbeMinProbes = 5; |
36 static const int kProbeMinBytes = 1000; | 54 static constexpr int kProbeMinBytes = 1000; |
37 const std::unique_ptr<PacketRouter> packet_router_; | 55 const std::unique_ptr<PacketRouter> packet_router_; |
38 }; | 56 }; |
39 | 57 |
40 TEST_F(PacketRouterTest, TimeToSendPacket) { | 58 TEST_F(PacketRouterTest, TimeToSendPacket) { |
41 NiceMock<MockRtpRtcp> rtp_1; | 59 NiceMock<MockRtpRtcp> rtp_1; |
42 NiceMock<MockRtpRtcp> rtp_2; | 60 NiceMock<MockRtpRtcp> rtp_2; |
43 packet_router_->AddSendRtpModule(&rtp_1); | 61 packet_router_->AddSendRtpModule(&rtp_1, false); |
44 packet_router_->AddSendRtpModule(&rtp_2); | 62 packet_router_->AddSendRtpModule(&rtp_2, false); |
45 | 63 |
46 const uint16_t kSsrc1 = 1234; | 64 const uint16_t kSsrc1 = 1234; |
47 uint16_t sequence_number = 17; | 65 uint16_t sequence_number = 17; |
48 uint64_t timestamp = 7890; | 66 uint64_t timestamp = 7890; |
49 bool retransmission = false; | 67 bool retransmission = false; |
50 | 68 |
51 // Send on the first module by letting rtp_1 be sending with correct ssrc. | 69 // Send on the first module by letting rtp_1 be sending with correct ssrc. |
52 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); | 70 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true)); |
53 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1)); | 71 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1)); |
54 EXPECT_CALL(rtp_1, TimeToSendPacket( | 72 EXPECT_CALL(rtp_1, TimeToSendPacket( |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
118 const uint16_t kSsrc1 = 1234; | 136 const uint16_t kSsrc1 = 1234; |
119 const uint16_t kSsrc2 = 4567; | 137 const uint16_t kSsrc2 = 4567; |
120 | 138 |
121 NiceMock<MockRtpRtcp> rtp_1; | 139 NiceMock<MockRtpRtcp> rtp_1; |
122 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff)); | 140 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff)); |
123 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1)); | 141 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1)); |
124 NiceMock<MockRtpRtcp> rtp_2; | 142 NiceMock<MockRtpRtcp> rtp_2; |
125 // rtp_2 will be prioritized for padding. | 143 // rtp_2 will be prioritized for padding. |
126 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads)); | 144 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads)); |
127 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2)); | 145 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2)); |
128 packet_router_->AddSendRtpModule(&rtp_1); | 146 packet_router_->AddSendRtpModule(&rtp_1, false); |
129 packet_router_->AddSendRtpModule(&rtp_2); | 147 packet_router_->AddSendRtpModule(&rtp_2, false); |
130 | 148 |
131 // Default configuration, sending padding on all modules sending media, | 149 // Default configuration, sending padding on all modules sending media, |
132 // ordered by priority (based on rtx mode). | 150 // ordered by priority (based on rtx mode). |
133 const size_t requested_padding_bytes = 1000; | 151 const size_t requested_padding_bytes = 1000; |
134 const size_t sent_padding_bytes = 890; | 152 const size_t sent_padding_bytes = 890; |
135 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); | 153 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true)); |
136 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true)); | 154 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true)); |
137 EXPECT_CALL(rtp_2, | 155 EXPECT_CALL(rtp_2, |
138 TimeToSendPadding(requested_padding_bytes, | 156 TimeToSendPadding(requested_padding_bytes, |
139 Field(&PacedPacketInfo::probe_cluster_id, 111))) | 157 Field(&PacedPacketInfo::probe_cluster_id, 111))) |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
203 packet_router_->TimeToSendPadding( | 221 packet_router_->TimeToSendPadding( |
204 requested_padding_bytes, | 222 requested_padding_bytes, |
205 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes, | 223 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes, |
206 kProbeMinBytes))); | 224 kProbeMinBytes))); |
207 | 225 |
208 packet_router_->RemoveSendRtpModule(&rtp_2); | 226 packet_router_->RemoveSendRtpModule(&rtp_2); |
209 } | 227 } |
210 | 228 |
211 TEST_F(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) { | 229 TEST_F(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) { |
212 NiceMock<MockRtpRtcp> rtp; | 230 NiceMock<MockRtpRtcp> rtp; |
213 packet_router_->AddSendRtpModule(&rtp); | 231 packet_router_->AddSendRtpModule(&rtp, false); |
214 static const uint16_t kSsrc = 1234; | 232 static const uint16_t kSsrc = 1234; |
215 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc)); | 233 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc)); |
216 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false)); | 234 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false)); |
217 | 235 |
218 // Verify that TimeToSendPacket does not end up in a receiver. | 236 // Verify that TimeToSendPacket does not end up in a receiver. |
219 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0); | 237 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0); |
220 EXPECT_TRUE(packet_router_->TimeToSendPacket( | 238 EXPECT_TRUE(packet_router_->TimeToSendPacket( |
221 kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe, | 239 kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe, |
222 kProbeMinBytes, kProbeMinBytes))); | 240 kProbeMinBytes, kProbeMinBytes))); |
223 // Verify that TimeToSendPadding does not end up in a receiver. | 241 // Verify that TimeToSendPadding does not end up in a receiver. |
(...skipping 15 matching lines...) Expand all Loading... | |
239 for (size_t i = 0; i < kNumPackets; ++i) { | 257 for (size_t i = 0; i < kNumPackets; ++i) { |
240 uint16_t seq = packet_router_->AllocateSequenceNumber(); | 258 uint16_t seq = packet_router_->AllocateSequenceNumber(); |
241 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i; | 259 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i; |
242 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq); | 260 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq); |
243 } | 261 } |
244 } | 262 } |
245 | 263 |
246 TEST_F(PacketRouterTest, SendTransportFeedback) { | 264 TEST_F(PacketRouterTest, SendTransportFeedback) { |
247 NiceMock<MockRtpRtcp> rtp_1; | 265 NiceMock<MockRtpRtcp> rtp_1; |
248 NiceMock<MockRtpRtcp> rtp_2; | 266 NiceMock<MockRtpRtcp> rtp_2; |
249 packet_router_->AddSendRtpModule(&rtp_1); | 267 packet_router_->AddSendRtpModule(&rtp_1, false); |
250 packet_router_->AddReceiveRtpModule(&rtp_2); | 268 packet_router_->AddReceiveRtpModule(&rtp_2, false); |
251 | 269 |
252 rtcp::TransportFeedback feedback; | 270 rtcp::TransportFeedback feedback; |
253 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true)); | 271 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true)); |
254 packet_router_->SendTransportFeedback(&feedback); | 272 packet_router_->SendTransportFeedback(&feedback); |
255 packet_router_->RemoveSendRtpModule(&rtp_1); | 273 packet_router_->RemoveSendRtpModule(&rtp_1); |
256 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true)); | 274 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true)); |
257 packet_router_->SendTransportFeedback(&feedback); | 275 packet_router_->SendTransportFeedback(&feedback); |
258 packet_router_->RemoveReceiveRtpModule(&rtp_2); | 276 packet_router_->RemoveReceiveRtpModule(&rtp_2); |
259 } | 277 } |
260 | 278 |
279 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | |
280 TEST_F(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) { | |
281 PacketRouter packet_router; | |
282 | |
283 NiceMock<MockRtpRtcp> module; | |
284 | |
285 constexpr bool remb_candidate = false; // Value irrelevant. | |
286 packet_router.AddSendRtpModule(&module, remb_candidate); | |
287 EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), ""); | |
288 | |
289 // Test tear-down | |
290 packet_router.RemoveSendRtpModule(&module); | |
danilchap
2017/07/31 13:18:04
may be use packet_router_
or do not use fixture, e
eladalon
2017/07/31 14:08:26
Let's land as-is, and I'll push a CL on top of thi
eladalon
2017/07/31 14:10:21
(I've changed in some places, but I didn't think i
| |
291 } | |
292 | |
293 TEST_F(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) { | |
294 PacketRouter packet_router; | |
295 | |
296 NiceMock<MockRtpRtcp> module; | |
297 | |
298 constexpr bool remb_candidate = false; // Value irrelevant. | |
299 packet_router.AddReceiveRtpModule(&module, remb_candidate); | |
300 EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), ""); | |
301 | |
302 // Test tear-down | |
303 packet_router.RemoveReceiveRtpModule(&module); | |
304 } | |
305 | |
306 TEST_F(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) { | |
307 PacketRouter packet_router; | |
308 | |
309 NiceMock<MockRtpRtcp> module; | |
310 | |
311 EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), ""); | |
312 } | |
313 | |
314 TEST_F(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) { | |
315 PacketRouter packet_router; | |
316 | |
317 NiceMock<MockRtpRtcp> module; | |
318 | |
319 EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), ""); | |
320 } | |
321 #endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | |
322 | |
323 // TODO(eladalon): Remove this test; it should be covered by: | |
324 // 1. SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst | |
325 // 2. SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst | |
326 // 3. LowerEstimateToSendRemb | |
327 // (Not removing in this CL to prove it doesn't break this test.) | |
261 TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) { | 328 TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) { |
262 rtc::ScopedFakeClock clock; | 329 rtc::ScopedFakeClock clock; |
263 NiceMock<MockRtpRtcp> rtp_recv; | 330 NiceMock<MockRtpRtcpWithRembTracking> rtp_recv; |
264 NiceMock<MockRtpRtcp> rtp_send; | 331 NiceMock<MockRtpRtcpWithRembTracking> rtp_send; |
265 PacketRouter packet_router; | 332 PacketRouter packet_router; |
266 | 333 |
267 EXPECT_CALL(rtp_recv, SetREMBStatus(true)).Times(1); | 334 packet_router.AddReceiveRtpModule(&rtp_recv, true); |
268 packet_router.AddReceiveRtpModule(&rtp_recv); | 335 ASSERT_TRUE(rtp_recv.REMB()); |
269 | 336 |
270 const uint32_t bitrate_estimate = 456; | 337 const uint32_t bitrate_estimate = 456; |
271 const std::vector<uint32_t> ssrcs = {1234}; | 338 const std::vector<uint32_t> ssrcs = {1234}; |
272 | 339 |
273 ON_CALL(rtp_recv, REMB()).WillByDefault(Return(true)); | |
274 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 340 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
275 | 341 |
276 // Call OnReceiveBitrateChanged twice to get a first estimate. | 342 // Call OnReceiveBitrateChanged twice to get a first estimate. |
277 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 343 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
278 EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 344 EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
279 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 345 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
280 | 346 |
281 // Add a send module, which should be preferred over the receive module. | 347 // Add a send module, which should be preferred over the receive module. |
282 EXPECT_CALL(rtp_recv, SetREMBStatus(false)).Times(1); | 348 packet_router.AddSendRtpModule(&rtp_send, true); |
283 EXPECT_CALL(rtp_send, SetREMBStatus(true)).Times(1); | 349 EXPECT_FALSE(rtp_recv.REMB()); |
284 packet_router.AddSendRtpModule(&rtp_send); | 350 EXPECT_TRUE(rtp_send.REMB()); |
285 ON_CALL(rtp_recv, REMB()).WillByDefault(Return(false)); | |
286 ON_CALL(rtp_send, REMB()).WillByDefault(Return(true)); | |
287 | 351 |
288 // Lower bitrate to send another REMB packet. | 352 // Lower bitrate to send another REMB packet. |
289 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1); | 353 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1); |
290 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100); | 354 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100); |
291 | 355 |
292 EXPECT_CALL(rtp_send, SetREMBStatus(false)).Times(1); | |
293 EXPECT_CALL(rtp_recv, SetREMBStatus(true)).Times(1); | |
294 packet_router.RemoveSendRtpModule(&rtp_send); | 356 packet_router.RemoveSendRtpModule(&rtp_send); |
295 EXPECT_CALL(rtp_recv, SetREMBStatus(false)).Times(1); | 357 EXPECT_TRUE(rtp_recv.REMB()); |
358 EXPECT_FALSE(rtp_send.REMB()); | |
359 | |
296 packet_router.RemoveReceiveRtpModule(&rtp_recv); | 360 packet_router.RemoveReceiveRtpModule(&rtp_recv); |
297 } | 361 } |
298 | 362 |
299 TEST(PacketRouterRembTest, LowerEstimateToSendRemb) { | 363 TEST(PacketRouterRembTest, LowerEstimateToSendRemb) { |
300 rtc::ScopedFakeClock clock; | 364 rtc::ScopedFakeClock clock; |
301 NiceMock<MockRtpRtcp> rtp; | 365 NiceMock<MockRtpRtcpWithRembTracking> rtp; |
302 PacketRouter packet_router; | 366 PacketRouter packet_router; |
303 | 367 |
304 EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1); | 368 packet_router.AddSendRtpModule(&rtp, true); |
305 packet_router.AddSendRtpModule(&rtp); | 369 EXPECT_TRUE(rtp.REMB()); |
306 | 370 |
307 uint32_t bitrate_estimate = 456; | 371 uint32_t bitrate_estimate = 456; |
308 const std::vector<uint32_t> ssrcs = {1234}; | 372 const std::vector<uint32_t> ssrcs = {1234}; |
309 | 373 |
310 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); | |
311 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 374 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
312 | 375 |
313 // Call OnReceiveBitrateChanged twice to get a first estimate. | 376 // Call OnReceiveBitrateChanged twice to get a first estimate. |
314 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 377 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
315 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 378 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
316 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 379 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
317 | 380 |
318 // Lower the estimate with more than 3% to trigger a call to SetREMBData right | 381 // Lower the estimate with more than 3% to trigger a call to SetREMBData right |
319 // away. | 382 // away. |
320 bitrate_estimate = bitrate_estimate - 100; | 383 bitrate_estimate = bitrate_estimate - 100; |
321 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 384 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
322 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 385 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
323 | 386 |
324 EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1); | |
325 packet_router.RemoveSendRtpModule(&rtp); | 387 packet_router.RemoveSendRtpModule(&rtp); |
388 EXPECT_FALSE(rtp.REMB()); | |
326 } | 389 } |
327 | 390 |
328 TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) { | 391 TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) { |
329 rtc::ScopedFakeClock clock; | 392 rtc::ScopedFakeClock clock; |
330 NiceMock<MockRtpRtcp> rtp; | 393 NiceMock<MockRtpRtcp> rtp; |
331 PacketRouter packet_router; | 394 PacketRouter packet_router; |
332 packet_router.AddSendRtpModule(&rtp); | 395 packet_router.AddSendRtpModule(&rtp, true); |
333 | 396 |
334 uint32_t bitrate_estimate[] = {456, 789}; | 397 uint32_t bitrate_estimate[] = {456, 789}; |
335 std::vector<uint32_t> ssrcs = {1234, 5678}; | 398 std::vector<uint32_t> ssrcs = {1234, 5678}; |
336 | 399 |
337 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); | 400 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); |
338 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]); | 401 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]); |
339 | 402 |
340 // Call OnReceiveBitrateChanged twice to get a first estimate. | 403 // Call OnReceiveBitrateChanged twice to get a first estimate. |
341 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[0], ssrcs)).Times(1); | 404 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[0], ssrcs)).Times(1); |
342 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 405 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
343 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]); | 406 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]); |
344 | 407 |
345 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100); | 408 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100); |
346 | 409 |
347 // Lower the estimate to trigger a callback. | 410 // Lower the estimate to trigger a callback. |
348 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[1], ssrcs)).Times(1); | 411 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[1], ssrcs)).Times(1); |
349 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]); | 412 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]); |
350 | 413 |
351 packet_router.RemoveSendRtpModule(&rtp); | 414 packet_router.RemoveSendRtpModule(&rtp); |
352 } | 415 } |
353 | 416 |
354 TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) { | 417 TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) { |
355 rtc::ScopedFakeClock clock; | 418 rtc::ScopedFakeClock clock; |
356 NiceMock<MockRtpRtcp> rtp; | 419 NiceMock<MockRtpRtcp> rtp; |
357 PacketRouter packet_router; | 420 PacketRouter packet_router; |
358 packet_router.AddSendRtpModule(&rtp); | 421 packet_router.AddSendRtpModule(&rtp, true); |
359 | 422 |
360 uint32_t bitrate_estimate = 456; | 423 uint32_t bitrate_estimate = 456; |
361 std::vector<uint32_t> ssrcs = {1234, 5678}; | 424 std::vector<uint32_t> ssrcs = {1234, 5678}; |
362 | 425 |
363 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); | 426 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); |
364 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 427 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
365 | 428 |
366 // Call OnReceiveBitrateChanged twice to get a first estimate. | 429 // Call OnReceiveBitrateChanged twice to get a first estimate. |
367 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 430 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
368 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 431 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
369 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 432 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
370 | 433 |
371 // Increased estimate shouldn't trigger a callback right away. | 434 // Increased estimate shouldn't trigger a callback right away. |
372 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0); | 435 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0); |
373 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1); | 436 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1); |
374 | 437 |
375 // Decreasing the estimate less than 3% shouldn't trigger a new callback. | 438 // Decreasing the estimate less than 3% shouldn't trigger a new callback. |
376 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0); | 439 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0); |
377 int lower_estimate = bitrate_estimate * 98 / 100; | 440 int lower_estimate = bitrate_estimate * 98 / 100; |
378 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate); | 441 packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate); |
379 | 442 |
380 packet_router.RemoveSendRtpModule(&rtp); | 443 packet_router.RemoveSendRtpModule(&rtp); |
381 } | 444 } |
382 | 445 |
383 TEST(PacketRouterRembTest, ChangeSendRtpModule) { | 446 TEST(PacketRouterRembTest, ChangeSendRtpModule) { |
384 rtc::ScopedFakeClock clock; | 447 rtc::ScopedFakeClock clock; |
385 NiceMock<MockRtpRtcp> rtp_send; | 448 NiceMock<MockRtpRtcp> rtp_send; |
386 NiceMock<MockRtpRtcp> rtp_recv; | 449 NiceMock<MockRtpRtcp> rtp_recv; |
387 PacketRouter packet_router; | 450 PacketRouter packet_router; |
388 packet_router.AddSendRtpModule(&rtp_send); | 451 packet_router.AddSendRtpModule(&rtp_send, true); |
389 packet_router.AddReceiveRtpModule(&rtp_recv); | 452 packet_router.AddReceiveRtpModule(&rtp_recv, true); |
390 | 453 |
391 uint32_t bitrate_estimate = 456; | 454 uint32_t bitrate_estimate = 456; |
392 std::vector<uint32_t> ssrcs = {1234, 5678}; | 455 std::vector<uint32_t> ssrcs = {1234, 5678}; |
393 | 456 |
394 ON_CALL(rtp_send, REMB()).WillByDefault(Return(true)); | 457 ON_CALL(rtp_send, REMB()).WillByDefault(Return(true)); |
395 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 458 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
396 | 459 |
397 // Call OnReceiveBitrateChanged twice to get a first estimate. | 460 // Call OnReceiveBitrateChanged twice to get a first estimate. |
398 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 461 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
399 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 462 EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
(...skipping 16 matching lines...) Expand all Loading... | |
416 EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 479 EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
417 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 480 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
418 | 481 |
419 packet_router.RemoveReceiveRtpModule(&rtp_recv); | 482 packet_router.RemoveReceiveRtpModule(&rtp_recv); |
420 } | 483 } |
421 | 484 |
422 TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) { | 485 TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) { |
423 rtc::ScopedFakeClock clock; | 486 rtc::ScopedFakeClock clock; |
424 NiceMock<MockRtpRtcp> rtp; | 487 NiceMock<MockRtpRtcp> rtp; |
425 PacketRouter packet_router; | 488 PacketRouter packet_router; |
426 packet_router.AddSendRtpModule(&rtp); | 489 packet_router.AddSendRtpModule(&rtp, true); |
427 | 490 |
428 uint32_t bitrate_estimate = 456; | 491 uint32_t bitrate_estimate = 456; |
429 const std::vector<uint32_t> ssrcs = {1234}; | 492 const std::vector<uint32_t> ssrcs = {1234}; |
430 | 493 |
431 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); | 494 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); |
432 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 495 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
433 | 496 |
434 // Call OnReceiveBitrateChanged twice to get a first estimate. | 497 // Call OnReceiveBitrateChanged twice to get a first estimate. |
435 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 498 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
436 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(1); | 499 EXPECT_CALL(rtp, SetREMBData(_, _)).Times(1); |
(...skipping 11 matching lines...) Expand all Loading... | |
448 } | 511 } |
449 | 512 |
450 // Only register receiving modules and make sure we fallback to trigger a REMB | 513 // Only register receiving modules and make sure we fallback to trigger a REMB |
451 // packet on this one. | 514 // packet on this one. |
452 TEST(PacketRouterRembTest, NoSendingRtpModule) { | 515 TEST(PacketRouterRembTest, NoSendingRtpModule) { |
453 rtc::ScopedFakeClock clock; | 516 rtc::ScopedFakeClock clock; |
454 NiceMock<MockRtpRtcp> rtp; | 517 NiceMock<MockRtpRtcp> rtp; |
455 PacketRouter packet_router; | 518 PacketRouter packet_router; |
456 | 519 |
457 EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1); | 520 EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1); |
458 packet_router.AddReceiveRtpModule(&rtp); | 521 packet_router.AddReceiveRtpModule(&rtp, true); |
459 | 522 |
460 uint32_t bitrate_estimate = 456; | 523 uint32_t bitrate_estimate = 456; |
461 const std::vector<uint32_t> ssrcs = {1234}; | 524 const std::vector<uint32_t> ssrcs = {1234}; |
462 | 525 |
463 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); | 526 ON_CALL(rtp, REMB()).WillByDefault(Return(true)); |
464 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 527 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
465 | 528 |
466 // Call OnReceiveBitrateChanged twice to get a first estimate. | 529 // Call OnReceiveBitrateChanged twice to get a first estimate. |
467 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | 530 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); |
468 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | 531 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1); |
469 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | 532 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); |
470 | 533 |
471 // Lower the estimate to trigger a new packet REMB packet. | 534 // Lower the estimate to trigger a new packet REMB packet. |
472 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1); | 535 EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1); |
473 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100); | 536 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100); |
474 | 537 |
475 EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1); | 538 EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1); |
476 packet_router.RemoveReceiveRtpModule(&rtp); | 539 packet_router.RemoveReceiveRtpModule(&rtp); |
477 } | 540 } |
478 | 541 |
542 TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) { | |
543 rtc::ScopedFakeClock clock; | |
544 PacketRouter packet_router; | |
545 NiceMock<MockRtpRtcpWithRembTracking> module; | |
546 | |
547 constexpr bool remb_candidate = false; | |
548 | |
549 packet_router.AddSendRtpModule(&module, remb_candidate); | |
550 EXPECT_FALSE(module.REMB()); | |
551 | |
552 constexpr uint32_t bitrate_estimate = 456; | |
553 const std::vector<uint32_t> ssrcs = {1234}; | |
554 EXPECT_CALL(module, SetREMBData(_, _)).Times(0); | |
555 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
556 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
557 | |
558 // Test tear-down | |
559 packet_router.RemoveSendRtpModule(&module); | |
560 } | |
561 | |
562 TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) { | |
563 rtc::ScopedFakeClock clock; | |
564 PacketRouter packet_router; | |
565 NiceMock<MockRtpRtcpWithRembTracking> module; | |
566 | |
567 constexpr bool remb_candidate = true; | |
568 | |
569 packet_router.AddSendRtpModule(&module, remb_candidate); | |
570 EXPECT_TRUE(module.REMB()); | |
571 | |
572 constexpr uint32_t bitrate_estimate = 456; | |
573 const std::vector<uint32_t> ssrcs = {1234}; | |
574 EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | |
575 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
576 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
577 | |
578 // Test tear-down | |
579 packet_router.RemoveSendRtpModule(&module); | |
580 } | |
581 | |
582 TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) { | |
583 rtc::ScopedFakeClock clock; | |
584 PacketRouter packet_router; | |
585 NiceMock<MockRtpRtcpWithRembTracking> module; | |
586 | |
587 constexpr bool remb_candidate = false; | |
588 | |
589 packet_router.AddReceiveRtpModule(&module, remb_candidate); | |
590 ASSERT_FALSE(module.REMB()); | |
591 | |
592 constexpr uint32_t bitrate_estimate = 456; | |
593 const std::vector<uint32_t> ssrcs = {1234}; | |
594 EXPECT_CALL(module, SetREMBData(_, _)).Times(0); | |
595 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
596 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
597 | |
598 // Test tear-down | |
599 packet_router.RemoveReceiveRtpModule(&module); | |
600 } | |
601 | |
602 TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) { | |
603 rtc::ScopedFakeClock clock; | |
604 PacketRouter packet_router; | |
605 NiceMock<MockRtpRtcpWithRembTracking> module; | |
606 | |
607 constexpr bool remb_candidate = true; | |
608 | |
609 packet_router.AddReceiveRtpModule(&module, remb_candidate); | |
610 EXPECT_TRUE(module.REMB()); | |
611 | |
612 constexpr uint32_t bitrate_estimate = 456; | |
613 const std::vector<uint32_t> ssrcs = {1234}; | |
614 EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | |
615 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
616 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
617 | |
618 // Test tear-down | |
619 packet_router.RemoveReceiveRtpModule(&module); | |
620 } | |
621 | |
622 TEST(PacketRouterRembTest, | |
623 SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) { | |
624 rtc::ScopedFakeClock clock; | |
625 PacketRouter packet_router; | |
626 NiceMock<MockRtpRtcpWithRembTracking> send_module; | |
627 NiceMock<MockRtpRtcpWithRembTracking> receive_module; | |
628 | |
629 constexpr bool remb_candidate = true; | |
630 | |
631 // Send module added - activated. | |
632 packet_router.AddSendRtpModule(&send_module, remb_candidate); | |
633 ASSERT_TRUE(send_module.REMB()); | |
634 | |
635 // Receive module added - the send module remains the active one. | |
636 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate); | |
637 EXPECT_TRUE(send_module.REMB()); | |
638 EXPECT_FALSE(receive_module.REMB()); | |
639 | |
640 constexpr uint32_t bitrate_estimate = 456; | |
641 const std::vector<uint32_t> ssrcs = {1234}; | |
642 EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | |
643 EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0); | |
644 | |
645 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
646 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
647 | |
648 // Test tear-down | |
649 packet_router.RemoveReceiveRtpModule(&receive_module); | |
650 packet_router.RemoveSendRtpModule(&send_module); | |
651 } | |
652 | |
653 TEST(PacketRouterRembTest, | |
654 SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) { | |
655 rtc::ScopedFakeClock clock; | |
656 PacketRouter packet_router; | |
657 NiceMock<MockRtpRtcpWithRembTracking> send_module; | |
658 NiceMock<MockRtpRtcpWithRembTracking> receive_module; | |
659 | |
660 constexpr bool remb_candidate = true; | |
661 | |
662 // Receive module added - activated. | |
663 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate); | |
664 ASSERT_TRUE(receive_module.REMB()); | |
665 | |
666 // Send module added - replaces receive module as active. | |
667 packet_router.AddSendRtpModule(&send_module, remb_candidate); | |
668 EXPECT_FALSE(receive_module.REMB()); | |
669 EXPECT_TRUE(send_module.REMB()); | |
670 | |
671 constexpr uint32_t bitrate_estimate = 456; | |
672 const std::vector<uint32_t> ssrcs = {1234}; | |
673 EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | |
674 EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0); | |
675 | |
676 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
677 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
678 | |
679 // Test tear-down | |
680 packet_router.RemoveReceiveRtpModule(&receive_module); | |
681 packet_router.RemoveSendRtpModule(&send_module); | |
682 } | |
683 | |
684 TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) { | |
685 rtc::ScopedFakeClock clock; | |
686 PacketRouter packet_router; | |
687 NiceMock<MockRtpRtcpWithRembTracking> send_module; | |
688 NiceMock<MockRtpRtcpWithRembTracking> receive_module; | |
689 | |
690 constexpr bool remb_candidate = true; | |
691 | |
692 // Send module active, receive module inactive. | |
693 packet_router.AddSendRtpModule(&send_module, remb_candidate); | |
694 packet_router.AddReceiveRtpModule(&receive_module, remb_candidate); | |
695 ASSERT_TRUE(send_module.REMB()); | |
696 ASSERT_FALSE(receive_module.REMB()); | |
697 | |
698 // Send module removed - receive module becomes active. | |
699 packet_router.RemoveSendRtpModule(&send_module); | |
700 EXPECT_FALSE(send_module.REMB()); | |
701 EXPECT_TRUE(receive_module.REMB()); | |
702 constexpr uint32_t bitrate_estimate = 456; | |
703 const std::vector<uint32_t> ssrcs = {1234}; | |
704 EXPECT_CALL(send_module, SetREMBData(_, _)).Times(0); | |
705 EXPECT_CALL(receive_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1); | |
706 | |
707 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000)); | |
708 packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate); | |
709 | |
710 // Test tear-down | |
711 packet_router.RemoveReceiveRtpModule(&receive_module); | |
712 } | |
713 | |
479 } // namespace webrtc | 714 } // namespace webrtc |
OLD | NEW |