Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(857)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc

Issue 1639253007: Validates sending RTCP before RTP. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 const size_t payload_size, 214 const size_t payload_size,
215 const WebRtcRTPHeader* rtp_header) override { 215 const WebRtcRTPHeader* rtp_header) override {
216 return 0; 216 return 0;
217 } 217 }
218 test::RtcpPacketParser parser_; 218 test::RtcpPacketParser parser_;
219 }; 219 };
220 220
221 namespace { 221 namespace {
222 static const uint32_t kSenderSsrc = 0x11111111; 222 static const uint32_t kSenderSsrc = 0x11111111;
223 static const uint32_t kRemoteSsrc = 0x22222222; 223 static const uint32_t kRemoteSsrc = 0x22222222;
224 static const uint32_t kStartRtpTimestamp = 0x34567;
225 static const uint32_t kRtpTimestamp = 0x45678;
224 } 226 }
225 227
226 class RtcpSenderTest : public ::testing::Test { 228 class RtcpSenderTest : public ::testing::Test {
227 protected: 229 protected:
228 RtcpSenderTest() 230 RtcpSenderTest()
229 : clock_(1335900000), 231 : clock_(1335900000),
230 receive_statistics_(ReceiveStatistics::Create(&clock_)) { 232 receive_statistics_(ReceiveStatistics::Create(&clock_)) {
231 RtpRtcp::Configuration configuration; 233 RtpRtcp::Configuration configuration;
232 configuration.audio = false; 234 configuration.audio = false;
233 configuration.clock = &clock_; 235 configuration.clock = &clock_;
234 configuration.outgoing_transport = &test_transport_; 236 configuration.outgoing_transport = &test_transport_;
235 237
236 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration)); 238 rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration));
237 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), 239 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
238 nullptr, nullptr, &test_transport_)); 240 nullptr, nullptr, &test_transport_));
239 rtcp_sender_->SetSSRC(kSenderSsrc); 241 rtcp_sender_->SetSSRC(kSenderSsrc);
240 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); 242 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
243 rtcp_sender_->SetStartTimestamp(kStartRtpTimestamp);
244 rtcp_sender_->SetLastRtpTime(kRtpTimestamp, clock_.TimeInMilliseconds());
241 } 245 }
242 246
243 void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) { 247 void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) {
244 RTPHeader header; 248 RTPHeader header;
245 header.ssrc = remote_ssrc; 249 header.ssrc = remote_ssrc;
246 header.sequenceNumber = seq_num; 250 header.sequenceNumber = seq_num;
247 header.timestamp = 12345; 251 header.timestamp = 12345;
248 header.headerLength = 12; 252 header.headerLength = 12;
249 size_t kPacketLength = 100; 253 size_t kPacketLength = 100;
250 receive_statistics_->IncomingPacket(header, kPacketLength, false); 254 receive_statistics_->IncomingPacket(header, kPacketLength, false);
(...skipping 27 matching lines...) Expand all
278 TEST_F(RtcpSenderTest, NoPacketSentIfOff) { 282 TEST_F(RtcpSenderTest, NoPacketSentIfOff) {
279 rtcp_sender_->SetRTCPStatus(RtcpMode::kOff); 283 rtcp_sender_->SetRTCPStatus(RtcpMode::kOff);
280 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); 284 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr));
281 } 285 }
282 286
283 TEST_F(RtcpSenderTest, SendSr) { 287 TEST_F(RtcpSenderTest, SendSr) {
284 const uint32_t kPacketCount = 0x12345; 288 const uint32_t kPacketCount = 0x12345;
285 const uint32_t kOctetCount = 0x23456; 289 const uint32_t kOctetCount = 0x23456;
286 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); 290 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
287 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState(); 291 RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
292 rtcp_sender_->SetSendingStatus(feedback_state, true);
288 feedback_state.packets_sent = kPacketCount; 293 feedback_state.packets_sent = kPacketCount;
289 feedback_state.media_bytes_sent = kOctetCount; 294 feedback_state.media_bytes_sent = kOctetCount;
290 uint32_t ntp_secs; 295 uint32_t ntp_secs;
291 uint32_t ntp_frac; 296 uint32_t ntp_frac;
292 clock_.CurrentNtp(ntp_secs, ntp_frac); 297 clock_.CurrentNtp(ntp_secs, ntp_frac);
293 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr)); 298 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
294 EXPECT_EQ(1, parser()->sender_report()->num_packets()); 299 EXPECT_EQ(1, parser()->sender_report()->num_packets());
295 EXPECT_EQ(kSenderSsrc, parser()->sender_report()->Ssrc()); 300 EXPECT_EQ(kSenderSsrc, parser()->sender_report()->Ssrc());
296 EXPECT_EQ(ntp_secs, parser()->sender_report()->NtpSec()); 301 EXPECT_EQ(ntp_secs, parser()->sender_report()->NtpSec());
297 EXPECT_EQ(ntp_frac, parser()->sender_report()->NtpFrac()); 302 EXPECT_EQ(ntp_frac, parser()->sender_report()->NtpFrac());
298 EXPECT_EQ(kPacketCount, parser()->sender_report()->PacketCount()); 303 EXPECT_EQ(kPacketCount, parser()->sender_report()->PacketCount());
299 EXPECT_EQ(kOctetCount, parser()->sender_report()->OctetCount()); 304 EXPECT_EQ(kOctetCount, parser()->sender_report()->OctetCount());
305 EXPECT_EQ(kStartRtpTimestamp + kRtpTimestamp,
306 parser()->sender_report()->RtpTimestamp());
300 EXPECT_EQ(0, parser()->report_block()->num_packets()); 307 EXPECT_EQ(0, parser()->report_block()->num_packets());
301 } 308 }
302 309
310 TEST_F(RtcpSenderTest, DoNotSendSrBeforeRtp) {
311 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
312 nullptr, nullptr, &test_transport_));
313 rtcp_sender_->SetSSRC(kSenderSsrc);
314 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
315 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
316 rtcp_sender_->SetSendingStatus(feedback_state(), true);
317
318 // Sender Report shouldn't be send not as Sr, nor as Report.
stefan-webrtc 2016/07/20 09:13:31 Sender Report shouldn't be sent as an SR nor as a
danilchap 2016/07/20 10:09:49 Done.
319 rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr);
320 EXPECT_EQ(0, parser()->sender_report()->num_packets());
321 rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport);
322 EXPECT_EQ(0, parser()->sender_report()->num_packets());
323 // Other packets (e.g. Pli) are allowed, even if useless.
324 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli));
325 EXPECT_EQ(1, parser()->pli()->num_packets());
326 }
327
328 TEST_F(RtcpSenderTest, DoNotSendCompundBeforeRtp) {
329 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
330 nullptr, nullptr, &test_transport_));
331 rtcp_sender_->SetSSRC(kSenderSsrc);
332 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
333 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
334 rtcp_sender_->SetSendingStatus(feedback_state(), true);
335
336 // In compound mode no packets are allowed (e.g. Pli) because compound mode
337 // should start with Sender Report.
338 EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli));
339 EXPECT_EQ(0, parser()->pli()->num_packets());
340 }
341
303 TEST_F(RtcpSenderTest, SendRr) { 342 TEST_F(RtcpSenderTest, SendRr) {
304 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); 343 rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
305 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr)); 344 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr));
306 EXPECT_EQ(1, parser()->receiver_report()->num_packets()); 345 EXPECT_EQ(1, parser()->receiver_report()->num_packets());
307 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->Ssrc()); 346 EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->Ssrc());
308 EXPECT_EQ(0, parser()->report_block()->num_packets()); 347 EXPECT_EQ(0, parser()->report_block()->num_packets());
309 } 348 }
310 349
311 TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) { 350 TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) {
312 const uint16_t kSeqNum = 11111; 351 const uint16_t kSeqNum = 11111;
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport)); 720 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
682 EXPECT_EQ(2, parser()->tmmbr()->num_packets()); 721 EXPECT_EQ(2, parser()->tmmbr()->num_packets());
683 EXPECT_EQ(2, parser()->tmmbr_item()->num_packets()); 722 EXPECT_EQ(2, parser()->tmmbr_item()->num_packets());
684 723
685 rtcp_sender_->SetTMMBRStatus(false); 724 rtcp_sender_->SetTMMBRStatus(false);
686 EXPECT_FALSE(rtcp_sender_->TMMBR()); 725 EXPECT_FALSE(rtcp_sender_->TMMBR());
687 } 726 }
688 727
689 TEST_F(RtcpSenderTest, SendTmmbn) { 728 TEST_F(RtcpSenderTest, SendTmmbn) {
690 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); 729 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
730 rtcp_sender_->SetSendingStatus(feedback_state(), true);
691 std::vector<rtcp::TmmbItem> bounding_set; 731 std::vector<rtcp::TmmbItem> bounding_set;
692 const uint32_t kBitrateKbps = 32768; 732 const uint32_t kBitrateKbps = 32768;
693 const uint32_t kPacketOh = 40; 733 const uint32_t kPacketOh = 40;
694 const uint32_t kSourceSsrc = 12345; 734 const uint32_t kSourceSsrc = 12345;
695 const rtcp::TmmbItem tmmbn(kSourceSsrc, kBitrateKbps * 1000, kPacketOh); 735 const rtcp::TmmbItem tmmbn(kSourceSsrc, kBitrateKbps * 1000, kPacketOh);
696 bounding_set.push_back(tmmbn); 736 bounding_set.push_back(tmmbn);
697 rtcp_sender_->SetTMMBN(&bounding_set); 737 rtcp_sender_->SetTMMBN(&bounding_set);
698 738
699 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); 739 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr));
700 EXPECT_EQ(1, parser()->sender_report()->num_packets()); 740 EXPECT_EQ(1, parser()->sender_report()->num_packets());
701 EXPECT_EQ(1, parser()->tmmbn()->num_packets()); 741 EXPECT_EQ(1, parser()->tmmbn()->num_packets());
702 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc()); 742 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc());
703 EXPECT_EQ(1, parser()->tmmbn_items()->num_packets()); 743 EXPECT_EQ(1, parser()->tmmbn_items()->num_packets());
704 EXPECT_EQ(kBitrateKbps, parser()->tmmbn_items()->BitrateKbps(0)); 744 EXPECT_EQ(kBitrateKbps, parser()->tmmbn_items()->BitrateKbps(0));
705 EXPECT_EQ(kPacketOh, parser()->tmmbn_items()->Overhead(0)); 745 EXPECT_EQ(kPacketOh, parser()->tmmbn_items()->Overhead(0));
706 EXPECT_EQ(kSourceSsrc, parser()->tmmbn_items()->Ssrc(0)); 746 EXPECT_EQ(kSourceSsrc, parser()->tmmbn_items()->Ssrc(0));
707 } 747 }
708 748
709 // This test is written to verify actual behaviour. It does not seem 749 // This test is written to verify actual behaviour. It does not seem
710 // to make much sense to send an empty TMMBN, since there is no place 750 // to make much sense to send an empty TMMBN, since there is no place
711 // to put an actual limit here. It's just information that no limit 751 // to put an actual limit here. It's just information that no limit
712 // is set, which is kind of the starting assumption. 752 // is set, which is kind of the starting assumption.
713 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one 753 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one
714 // situation where this caused confusion. 754 // situation where this caused confusion.
715 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) { 755 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) {
716 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); 756 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
757 rtcp_sender_->SetSendingStatus(feedback_state(), true);
717 std::vector<rtcp::TmmbItem> bounding_set; 758 std::vector<rtcp::TmmbItem> bounding_set;
718 rtcp_sender_->SetTMMBN(&bounding_set); 759 rtcp_sender_->SetTMMBN(&bounding_set);
719 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr)); 760 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr));
720 EXPECT_EQ(1, parser()->sender_report()->num_packets()); 761 EXPECT_EQ(1, parser()->sender_report()->num_packets());
721 EXPECT_EQ(1, parser()->tmmbn()->num_packets()); 762 EXPECT_EQ(1, parser()->tmmbn()->num_packets());
722 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc()); 763 EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->Ssrc());
723 EXPECT_EQ(0, parser()->tmmbn_items()->num_packets()); 764 EXPECT_EQ(0, parser()->tmmbn_items()->num_packets());
724 } 765 }
725 766
726 TEST_F(RtcpSenderTest, SendCompoundPliRemb) { 767 TEST_F(RtcpSenderTest, SendCompoundPliRemb) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 } 802 }
762 803
763 return true; 804 return true;
764 })); 805 }));
765 806
766 // Re-configure rtcp_sender_ with mock_transport_ 807 // Re-configure rtcp_sender_ with mock_transport_
767 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(), 808 rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
768 nullptr, nullptr, &mock_transport)); 809 nullptr, nullptr, &mock_transport));
769 rtcp_sender_->SetSSRC(kSenderSsrc); 810 rtcp_sender_->SetSSRC(kSenderSsrc);
770 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc); 811 rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
812 rtcp_sender_->SetStartTimestamp(kStartRtpTimestamp);
813 rtcp_sender_->SetLastRtpTime(kRtpTimestamp, clock_.TimeInMilliseconds());
771 814
772 // Set up XR VoIP metric to be included with BYE 815 // Set up XR VoIP metric to be included with BYE
773 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); 816 rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
774 RTCPVoIPMetric metric; 817 RTCPVoIPMetric metric;
775 EXPECT_EQ(0, rtcp_sender_->SetRTCPVoIPMetrics(&metric)); 818 EXPECT_EQ(0, rtcp_sender_->SetRTCPVoIPMetrics(&metric));
776 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpBye)); 819 EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpBye));
777 } 820 }
778 821
779 } // namespace webrtc 822 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698