1 /* 2 * Copyright (c) 2012 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 12 /* 13 * This file includes unit tests for the RTCPReceiver. 14 */ 15 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gtest/include/gtest/gtest.h" 17 18 // Note: This file has no directory. Lint warning must be ignored. 19 #include "webrtc/common_types.h" 20 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_observer.h" 21 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h" 25 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h" 26 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 27 28 namespace webrtc { 29 30 namespace { // Anonymous namespace; hide utility functions and classes. 31 32 // This test transport verifies that no functions get called. 33 class TestTransport : public Transport, 34 public NullRtpData { 35 public: 36 explicit TestTransport() 37 : rtcp_receiver_(NULL) { 38 } 39 void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) { 40 rtcp_receiver_ = rtcp_receiver; 41 } 42 virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) { 43 ADD_FAILURE(); // FAIL() gives a compile error. 44 return -1; 45 } 46 47 // Injects an RTCP packet into the receiver. 48 virtual int SendRTCPPacket(int /* ch */, const void *packet, int packet_len) { 49 ADD_FAILURE(); 50 return 0; 51 } 52 53 virtual int OnReceivedPayloadData(const uint8_t* payloadData, 54 const uint16_t payloadSize, 55 const WebRtcRTPHeader* rtpHeader) { 56 ADD_FAILURE(); 57 return 0; 58 } 59 RTCPReceiver* rtcp_receiver_; 60 }; 61 62 class RtcpReceiverTest : public ::testing::Test { 63 protected: 64 static const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000; 65 66 RtcpReceiverTest() 67 : over_use_detector_options_(), 68 system_clock_(1335900000), 69 remote_bitrate_observer_(), 70 remote_bitrate_estimator_( 71 RemoteBitrateEstimatorFactory().Create( 72 &remote_bitrate_observer_, 73 &system_clock_, 74 kMimdControl, 75 kRemoteBitrateEstimatorMinBitrateBps)) { 76 test_transport_ = new TestTransport(); 77 78 RtpRtcp::Configuration configuration; 79 configuration.id = 0; 80 configuration.audio = false; 81 configuration.clock = &system_clock_; 82 configuration.outgoing_transport = test_transport_; 83 configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get(); 84 rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration); 85 rtcp_receiver_ = new RTCPReceiver(0, &system_clock_, rtp_rtcp_impl_); 86 test_transport_->SetRTCPReceiver(rtcp_receiver_); 87 } 88 ~RtcpReceiverTest() { 89 delete rtcp_receiver_; 90 delete rtp_rtcp_impl_; 91 delete test_transport_; 92 } 93 94 // Injects an RTCP packet into the receiver. 95 // Returns 0 for OK, non-0 for failure. 96 int InjectRtcpPacket(const uint8_t* packet, 97 uint16_t packet_len) { 98 RTCPUtility::RTCPParserV2 rtcpParser(packet, 99 packet_len, 100 true); // Allow non-compound RTCP 101 102 RTCPHelp::RTCPPacketInformation rtcpPacketInformation; 103 EXPECT_EQ(0, rtcp_receiver_->IncomingRTCPPacket(rtcpPacketInformation, 104 &rtcpParser)); 105 rtcp_receiver_->TriggerCallbacksFromRTCPPacket(rtcpPacketInformation); 106 // The NACK list is on purpose not copied below as it isn't needed by the 107 // test. 108 rtcp_packet_info_.rtcpPacketTypeFlags = 109 rtcpPacketInformation.rtcpPacketTypeFlags; 110 rtcp_packet_info_.remoteSSRC = rtcpPacketInformation.remoteSSRC; 111 rtcp_packet_info_.applicationSubType = 112 rtcpPacketInformation.applicationSubType; 113 rtcp_packet_info_.applicationName = rtcpPacketInformation.applicationName; 114 rtcp_packet_info_.applicationLength = 115 rtcpPacketInformation.applicationLength; 116 rtcp_packet_info_.report_blocks = rtcpPacketInformation.report_blocks; 117 rtcp_packet_info_.rtt = rtcpPacketInformation.rtt; 118 rtcp_packet_info_.interArrivalJitter = 119 rtcpPacketInformation.interArrivalJitter; 120 rtcp_packet_info_.sliPictureId = rtcpPacketInformation.sliPictureId; 121 rtcp_packet_info_.rpsiPictureId = rtcpPacketInformation.rpsiPictureId; 122 rtcp_packet_info_.receiverEstimatedMaxBitrate = 123 rtcpPacketInformation.receiverEstimatedMaxBitrate; 124 rtcp_packet_info_.ntp_secs = rtcpPacketInformation.ntp_secs; 125 rtcp_packet_info_.ntp_frac = rtcpPacketInformation.ntp_frac; 126 rtcp_packet_info_.rtp_timestamp = rtcpPacketInformation.rtp_timestamp; 127 rtcp_packet_info_.xr_dlrr_item = rtcpPacketInformation.xr_dlrr_item; 128 if (rtcpPacketInformation.VoIPMetric) { 129 rtcp_packet_info_.AddVoIPMetric(rtcpPacketInformation.VoIPMetric); 130 } 131 return 0; 132 } 133 134 OverUseDetectorOptions over_use_detector_options_; 135 SimulatedClock system_clock_; 136 ModuleRtpRtcpImpl* rtp_rtcp_impl_; 137 RTCPReceiver* rtcp_receiver_; 138 TestTransport* test_transport_; 139 RTCPHelp::RTCPPacketInformation rtcp_packet_info_; 140 MockRemoteBitrateObserver remote_bitrate_observer_; 141 scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_; 142 }; 143 144 145 TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) { 146 const uint8_t bad_packet[] = {0, 0, 0, 0}; 147 EXPECT_EQ(0, InjectRtcpPacket(bad_packet, sizeof(bad_packet))); 148 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 149 } 150 151 TEST_F(RtcpReceiverTest, InjectSrPacket) { 152 const uint32_t kSenderSsrc = 0x10203; 153 rtcp::SenderReport sr; 154 sr.From(kSenderSsrc); 155 rtcp::RawPacket p = sr.Build(); 156 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 157 // The parser will note the remote SSRC on a SR from other than his 158 // expected peer, but will not flag that he's gotten a packet. 159 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 160 EXPECT_EQ(0U, 161 kRtcpSr & rtcp_packet_info_.rtcpPacketTypeFlags); 162 } 163 164 TEST_F(RtcpReceiverTest, InjectSrPacketFromExpectedPeer) { 165 const uint32_t kSenderSsrc = 0x10203; 166 rtcp_receiver_->SetRemoteSSRC(kSenderSsrc); 167 rtcp::SenderReport sr; 168 sr.From(kSenderSsrc); 169 rtcp::RawPacket p = sr.Build(); 170 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 171 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 172 EXPECT_EQ(kRtcpSr, rtcp_packet_info_.rtcpPacketTypeFlags); 173 } 174 175 TEST_F(RtcpReceiverTest, InjectRrPacket) { 176 const uint32_t kSenderSsrc = 0x10203; 177 rtcp::ReceiverReport rr; 178 rr.From(kSenderSsrc); 179 rtcp::RawPacket p = rr.Build(); 180 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 181 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 182 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 183 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 184 } 185 186 TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { 187 const uint32_t kSenderSsrc = 0x10203; 188 const uint32_t kSourceSsrc = 0x123456; 189 std::set<uint32_t> ssrcs; 190 ssrcs.insert(kSourceSsrc); 191 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 192 193 rtcp::ReportBlock rb; 194 rb.To(kSourceSsrc + 1); 195 rtcp::ReceiverReport rr; 196 rr.From(kSenderSsrc); 197 rr.WithReportBlock(&rb); 198 rtcp::RawPacket p = rr.Build(); 199 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 200 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 201 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 202 ASSERT_EQ(0u, rtcp_packet_info_.report_blocks.size()); 203 } 204 205 TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { 206 const uint32_t kSenderSsrc = 0x10203; 207 const uint32_t kSourceSsrc = 0x123456; 208 std::set<uint32_t> ssrcs; 209 ssrcs.insert(kSourceSsrc); 210 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 211 212 rtcp::ReportBlock rb; 213 rb.To(kSourceSsrc); 214 rtcp::ReceiverReport rr; 215 rr.From(kSenderSsrc); 216 rr.WithReportBlock(&rb); 217 rtcp::RawPacket p = rr.Build(); 218 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 219 EXPECT_EQ(kSenderSsrc, rtcp_packet_info_.remoteSSRC); 220 EXPECT_EQ(kRtcpRr, rtcp_packet_info_.rtcpPacketTypeFlags); 221 ASSERT_EQ(1u, rtcp_packet_info_.report_blocks.size()); 222 } 223 224 TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { 225 const uint32_t kSenderSsrc = 0x10203; 226 const uint32_t kSourceSsrcs[] = {0x40506, 0x50607}; 227 const uint16_t kSequenceNumbers[] = {10, 12423}; 228 const int kNumSsrcs = sizeof(kSourceSsrcs) / sizeof(kSourceSsrcs[0]); 229 230 std::set<uint32_t> ssrcs(kSourceSsrcs, kSourceSsrcs + kNumSsrcs); 231 rtcp_receiver_->SetSsrcs(kSourceSsrcs[0], ssrcs); 232 233 rtcp::ReportBlock rb1; 234 rb1.To(kSourceSsrcs[0]); 235 rb1.WithExtHighestSeqNum(kSequenceNumbers[0]); 236 rb1.WithFractionLost(10); 237 rb1.WithCumulativeLost(5); 238 239 rtcp::ReportBlock rb2; 240 rb2.To(kSourceSsrcs[1]); 241 rb2.WithExtHighestSeqNum(kSequenceNumbers[1]); 242 243 rtcp::ReceiverReport rr1; 244 rr1.From(kSenderSsrc); 245 rr1.WithReportBlock(&rb1); 246 rr1.WithReportBlock(&rb2); 247 248 rtcp::RawPacket p1 = rr1.Build(); 249 EXPECT_EQ(0, InjectRtcpPacket(p1.buffer(), p1.buffer_length())); 250 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 251 EXPECT_EQ(10, rtcp_packet_info_.report_blocks.front().fractionLost); 252 EXPECT_EQ(0, rtcp_packet_info_.report_blocks.back().fractionLost); 253 254 rtcp::ReportBlock rb3; 255 rb3.To(kSourceSsrcs[0]); 256 rb3.WithExtHighestSeqNum(kSequenceNumbers[0]); 257 258 rtcp::ReportBlock rb4; 259 rb4.To(kSourceSsrcs[1]); 260 rb4.WithExtHighestSeqNum(kSequenceNumbers[1]); 261 rb4.WithFractionLost(20); 262 rb4.WithCumulativeLost(10); 263 264 rtcp::ReceiverReport rr2; 265 rr2.From(kSenderSsrc); 266 rr2.WithReportBlock(&rb3); 267 rr2.WithReportBlock(&rb4); 268 269 rtcp::RawPacket p2 = rr2.Build(); 270 EXPECT_EQ(0, InjectRtcpPacket(p2.buffer(), p2.buffer_length())); 271 ASSERT_EQ(2u, rtcp_packet_info_.report_blocks.size()); 272 EXPECT_EQ(0, rtcp_packet_info_.report_blocks.front().fractionLost); 273 EXPECT_EQ(20, rtcp_packet_info_.report_blocks.back().fractionLost); 274 } 275 276 TEST_F(RtcpReceiverTest, InjectIjWithNoItem) { 277 rtcp::Ij ij; 278 rtcp::RawPacket p = ij.Build(); 279 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 280 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 281 } 282 283 TEST_F(RtcpReceiverTest, InjectIjWithOneItem) { 284 rtcp::Ij ij; 285 ij.WithJitterItem(0x11111111); 286 287 rtcp::RawPacket p = ij.Build(); 288 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 289 EXPECT_EQ(kRtcpTransmissionTimeOffset, rtcp_packet_info_.rtcpPacketTypeFlags); 290 EXPECT_EQ(0x11111111U, rtcp_packet_info_.interArrivalJitter); 291 } 292 293 TEST_F(RtcpReceiverTest, InjectAppWithNoData) { 294 rtcp::App app; 295 app.WithSubType(30); 296 uint32_t name = 'n' << 24; 297 name += 'a' << 16; 298 name += 'm' << 8; 299 name += 'e'; 300 app.WithName(name); 301 302 rtcp::RawPacket p = app.Build(); 303 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 304 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags); 305 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType); 306 EXPECT_EQ(name, rtcp_packet_info_.applicationName); 307 EXPECT_EQ(0, rtcp_packet_info_.applicationLength); 308 } 309 310 TEST_F(RtcpReceiverTest, InjectAppWithData) { 311 rtcp::App app; 312 app.WithSubType(30); 313 uint32_t name = 'n' << 24; 314 name += 'a' << 16; 315 name += 'm' << 8; 316 name += 'e'; 317 app.WithName(name); 318 const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'}; 319 const size_t kDataLength = sizeof(kData) / sizeof(kData[0]); 320 app.WithData((const uint8_t*)kData, kDataLength); 321 322 rtcp::RawPacket p = app.Build(); 323 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 324 EXPECT_EQ(kRtcpApp, rtcp_packet_info_.rtcpPacketTypeFlags); 325 EXPECT_EQ(30, rtcp_packet_info_.applicationSubType); 326 EXPECT_EQ(name, rtcp_packet_info_.applicationName); 327 EXPECT_EQ(kDataLength, rtcp_packet_info_.applicationLength); 328 } 329 330 TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) { 331 const uint32_t kSenderSsrc = 0x123456; 332 rtcp::Sdes sdes; 333 sdes.WithCName(kSenderSsrc, "alice@host"); 334 335 rtcp::RawPacket p = sdes.Build(); 336 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 337 char cName[RTCP_CNAME_SIZE]; 338 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 339 EXPECT_EQ(0, strncmp(cName, "alice@host", RTCP_CNAME_SIZE)); 340 } 341 342 TEST_F(RtcpReceiverTest, InjectByePacket) { 343 const uint32_t kSenderSsrc = 0x123456; 344 rtcp::Sdes sdes; 345 sdes.WithCName(kSenderSsrc, "alice@host"); 346 347 rtcp::RawPacket p = sdes.Build(); 348 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 349 char cName[RTCP_CNAME_SIZE]; 350 EXPECT_EQ(0, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 351 352 // Verify that BYE removes the CNAME. 353 rtcp::Bye bye; 354 bye.From(kSenderSsrc); 355 rtcp::RawPacket p2 = bye.Build(); 356 EXPECT_EQ(0, InjectRtcpPacket(p2.buffer(), p2.buffer_length())); 357 EXPECT_EQ(-1, rtcp_receiver_->CNAME(kSenderSsrc, cName)); 358 } 359 360 TEST_F(RtcpReceiverTest, InjectPliPacket) { 361 const uint32_t kSourceSsrc = 0x123456; 362 std::set<uint32_t> ssrcs; 363 ssrcs.insert(kSourceSsrc); 364 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 365 366 rtcp::Pli pli; 367 pli.To(kSourceSsrc); 368 rtcp::RawPacket p = pli.Build(); 369 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 370 EXPECT_EQ(kRtcpPli, rtcp_packet_info_.rtcpPacketTypeFlags); 371 } 372 373 TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) { 374 const uint32_t kSourceSsrc = 0x123456; 375 std::set<uint32_t> ssrcs; 376 ssrcs.insert(kSourceSsrc); 377 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 378 379 rtcp::Pli pli; 380 pli.To(kSourceSsrc + 1); 381 rtcp::RawPacket p = pli.Build(); 382 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 383 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 384 } 385 386 TEST_F(RtcpReceiverTest, InjectFirPacket) { 387 const uint32_t kSourceSsrc = 0x123456; 388 std::set<uint32_t> ssrcs; 389 ssrcs.insert(kSourceSsrc); 390 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 391 392 rtcp::Fir fir; 393 fir.To(kSourceSsrc); 394 rtcp::RawPacket p = fir.Build(); 395 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 396 EXPECT_EQ(kRtcpFir, rtcp_packet_info_.rtcpPacketTypeFlags); 397 } 398 399 TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) { 400 const uint32_t kSourceSsrc = 0x123456; 401 std::set<uint32_t> ssrcs; 402 ssrcs.insert(kSourceSsrc); 403 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 404 405 rtcp::Fir fir; 406 fir.To(kSourceSsrc + 1); 407 rtcp::RawPacket p = fir.Build(); 408 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 409 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 410 } 411 412 TEST_F(RtcpReceiverTest, InjectSliPacket) { 413 rtcp::Sli sli; 414 sli.WithPictureId(40); 415 rtcp::RawPacket p = sli.Build(); 416 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 417 EXPECT_EQ(kRtcpSli, rtcp_packet_info_.rtcpPacketTypeFlags); 418 EXPECT_EQ(40, rtcp_packet_info_.sliPictureId); 419 } 420 421 TEST_F(RtcpReceiverTest, XrPacketWithZeroReportBlocksIgnored) { 422 rtcp::Xr xr; 423 xr.From(0x2345); 424 rtcp::RawPacket p = xr.Build(); 425 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 426 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 427 } 428 429 TEST_F(RtcpReceiverTest, InjectXrVoipPacket) { 430 const uint32_t kSourceSsrc = 0x123456; 431 std::set<uint32_t> ssrcs; 432 ssrcs.insert(kSourceSsrc); 433 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 434 435 const uint8_t kLossRate = 123; 436 rtcp::VoipMetric voip_metric; 437 voip_metric.To(kSourceSsrc); 438 voip_metric.LossRate(kLossRate); 439 rtcp::Xr xr; 440 xr.From(0x2345); 441 xr.WithVoipMetric(&voip_metric); 442 rtcp::RawPacket p = xr.Build(); 443 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 444 ASSERT_TRUE(rtcp_packet_info_.VoIPMetric != NULL); 445 EXPECT_EQ(kLossRate, rtcp_packet_info_.VoIPMetric->lossRate); 446 EXPECT_EQ(kRtcpXrVoipMetric, rtcp_packet_info_.rtcpPacketTypeFlags); 447 } 448 449 TEST_F(RtcpReceiverTest, XrVoipPacketNotToUsIgnored) { 450 const uint32_t kSourceSsrc = 0x123456; 451 std::set<uint32_t> ssrcs; 452 ssrcs.insert(kSourceSsrc); 453 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 454 455 rtcp::VoipMetric voip_metric; 456 voip_metric.To(kSourceSsrc + 1); 457 rtcp::Xr xr; 458 xr.From(0x2345); 459 xr.WithVoipMetric(&voip_metric); 460 rtcp::RawPacket p = xr.Build(); 461 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 462 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 463 } 464 465 TEST_F(RtcpReceiverTest, InjectXrReceiverReferenceTimePacket) { 466 rtcp::Rrtr rrtr; 467 rrtr.WithNtpSec(0x10203); 468 rrtr.WithNtpFrac(0x40506); 469 rtcp::Xr xr; 470 xr.From(0x2345); 471 xr.WithRrtr(&rrtr); 472 473 rtcp::RawPacket p = xr.Build(); 474 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 475 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 476 rtcp_packet_info_.rtcpPacketTypeFlags); 477 } 478 479 TEST_F(RtcpReceiverTest, XrDlrrPacketNotToUsIgnored) { 480 const uint32_t kSourceSsrc = 0x123456; 481 std::set<uint32_t> ssrcs; 482 ssrcs.insert(kSourceSsrc); 483 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 484 485 rtcp::Dlrr dlrr; 486 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 487 rtcp::Xr xr; 488 xr.From(0x2345); 489 xr.WithDlrr(&dlrr); 490 rtcp::RawPacket p = xr.Build(); 491 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 492 EXPECT_EQ(0U, rtcp_packet_info_.rtcpPacketTypeFlags); 493 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 494 } 495 496 TEST_F(RtcpReceiverTest, InjectXrDlrrPacketWithSubBlock) { 497 const uint32_t kSourceSsrc = 0x123456; 498 std::set<uint32_t> ssrcs; 499 ssrcs.insert(kSourceSsrc); 500 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 501 502 rtcp::Dlrr dlrr; 503 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 504 rtcp::Xr xr; 505 xr.From(0x2345); 506 xr.WithDlrr(&dlrr); 507 rtcp::RawPacket p = xr.Build(); 508 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 509 // The parser should note the DLRR report block item, but not flag the packet 510 // since the RTT is not estimated. 511 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 512 } 513 514 TEST_F(RtcpReceiverTest, InjectXrDlrrPacketWithMultipleSubBlocks) { 515 const uint32_t kSourceSsrc = 0x123456; 516 std::set<uint32_t> ssrcs; 517 ssrcs.insert(kSourceSsrc); 518 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 519 520 rtcp::Dlrr dlrr; 521 dlrr.WithDlrrItem(kSourceSsrc + 1, 0x12345, 0x67890); 522 dlrr.WithDlrrItem(kSourceSsrc + 2, 0x12345, 0x67890); 523 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 524 rtcp::Xr xr; 525 xr.From(0x2345); 526 xr.WithDlrr(&dlrr); 527 rtcp::RawPacket p = xr.Build(); 528 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 529 // The parser should note the DLRR report block item, but not flag the packet 530 // since the RTT is not estimated. 531 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 532 } 533 534 TEST_F(RtcpReceiverTest, InjectXrPacketWithMultipleReportBlocks) { 535 const uint32_t kSourceSsrc = 0x123456; 536 std::set<uint32_t> ssrcs; 537 ssrcs.insert(kSourceSsrc); 538 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 539 540 rtcp::Rrtr rrtr; 541 rtcp::Dlrr dlrr; 542 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 543 rtcp::VoipMetric metric; 544 metric.To(kSourceSsrc); 545 rtcp::Xr xr; 546 xr.From(0x2345); 547 xr.WithRrtr(&rrtr); 548 xr.WithDlrr(&dlrr); 549 xr.WithVoipMetric(&metric); 550 rtcp::RawPacket p = xr.Build(); 551 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 552 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 553 kRtcpXrVoipMetric), 554 rtcp_packet_info_.rtcpPacketTypeFlags); 555 // The parser should note the DLRR report block item, but not flag the packet 556 // since the RTT is not estimated. 557 EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item); 558 } 559 560 TEST_F(RtcpReceiverTest, InjectXrPacketWithUnknownReportBlock) { 561 const uint32_t kSourceSsrc = 0x123456; 562 std::set<uint32_t> ssrcs; 563 ssrcs.insert(kSourceSsrc); 564 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 565 std::vector<uint32_t> remote_ssrcs; 566 remote_ssrcs.push_back(kSourceSsrc); 567 568 rtcp::Rrtr rrtr; 569 rtcp::Dlrr dlrr; 570 dlrr.WithDlrrItem(kSourceSsrc, 0x12345, 0x67890); 571 rtcp::VoipMetric metric; 572 metric.To(kSourceSsrc); 573 rtcp::Xr xr; 574 xr.From(0x2345); 575 xr.WithRrtr(&rrtr); 576 xr.WithDlrr(&dlrr); 577 xr.WithVoipMetric(&metric); 578 rtcp::RawPacket p = xr.Build(); 579 // Modify the DLRR block to have an unsupported block type, from 5 to 6. 580 uint8_t* buffer = const_cast<uint8_t*>(p.buffer()); 581 EXPECT_EQ(5, buffer[20]); 582 buffer[20] = 6; 583 584 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 585 EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime + 586 kRtcpXrVoipMetric), 587 rtcp_packet_info_.rtcpPacketTypeFlags); 588 EXPECT_FALSE(rtcp_packet_info_.xr_dlrr_item); 589 } 590 591 TEST(RtcpUtilityTest, MidNtp) { 592 const uint32_t kNtpSec = 0x12345678; 593 const uint32_t kNtpFrac = 0x23456789; 594 const uint32_t kNtpMid = 0x56782345; 595 EXPECT_EQ(kNtpMid, RTCPUtility::MidNtp(kNtpSec, kNtpFrac)); 596 } 597 598 TEST_F(RtcpReceiverTest, TestXrRrRttInitiallyFalse) { 599 uint16_t rtt_ms; 600 EXPECT_FALSE(rtcp_receiver_->GetAndResetXrRrRtt(&rtt_ms)); 601 } 602 603 TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) { 604 RtcpReceiveTimeInfo info; 605 EXPECT_FALSE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 606 } 607 608 TEST_F(RtcpReceiverTest, GetLastReceivedXrReferenceTimeInfo) { 609 const uint32_t kSenderSsrc = 0x123456; 610 const uint32_t kNtpSec = 0x10203; 611 const uint32_t kNtpFrac = 0x40506; 612 const uint32_t kNtpMid = RTCPUtility::MidNtp(kNtpSec, kNtpFrac); 613 614 rtcp::Rrtr rrtr; 615 rrtr.WithNtpSec(kNtpSec); 616 rrtr.WithNtpFrac(kNtpFrac); 617 rtcp::Xr xr; 618 xr.From(kSenderSsrc); 619 xr.WithRrtr(&rrtr); 620 rtcp::RawPacket p = xr.Build(); 621 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 622 EXPECT_EQ(kRtcpXrReceiverReferenceTime, 623 rtcp_packet_info_.rtcpPacketTypeFlags); 624 625 RtcpReceiveTimeInfo info; 626 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 627 EXPECT_EQ(kSenderSsrc, info.sourceSSRC); 628 EXPECT_EQ(kNtpMid, info.lastRR); 629 EXPECT_EQ(0U, info.delaySinceLastRR); 630 631 system_clock_.AdvanceTimeMilliseconds(1000); 632 EXPECT_TRUE(rtcp_receiver_->LastReceivedXrReferenceTimeInfo(&info)); 633 EXPECT_EQ(65536U, info.delaySinceLastRR); 634 } 635 636 TEST_F(RtcpReceiverTest, ReceiveReportTimeout) { 637 const uint32_t kSenderSsrc = 0x10203; 638 const uint32_t kSourceSsrc = 0x40506; 639 const int64_t kRtcpIntervalMs = 1000; 640 641 std::set<uint32_t> ssrcs; 642 ssrcs.insert(kSourceSsrc); 643 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 644 645 const uint16_t kSequenceNumber = 1234; 646 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 647 648 // No RR received, shouldn't trigger a timeout. 649 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 650 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 651 652 // Add a RR and advance the clock just enough to not trigger a timeout. 653 rtcp::ReportBlock rb1; 654 rb1.To(kSourceSsrc); 655 rb1.WithExtHighestSeqNum(kSequenceNumber); 656 rtcp::ReceiverReport rr1; 657 rr1.From(kSenderSsrc); 658 rr1.WithReportBlock(&rb1); 659 rtcp::RawPacket p1 = rr1.Build(); 660 EXPECT_EQ(0, InjectRtcpPacket(p1.buffer(), p1.buffer_length())); 661 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1); 662 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 663 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 664 665 // Add a RR with the same extended max as the previous RR to trigger a 666 // sequence number timeout, but not a RR timeout. 667 EXPECT_EQ(0, InjectRtcpPacket(p1.buffer(), p1.buffer_length())); 668 system_clock_.AdvanceTimeMilliseconds(2); 669 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 670 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 671 672 // Advance clock enough to trigger an RR timeout too. 673 system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs); 674 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 675 676 // We should only get one timeout even though we still haven't received a new 677 // RR. 678 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 679 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 680 681 // Add a new RR with increase sequence number to reset timers. 682 rtcp::ReportBlock rb2; 683 rb2.To(kSourceSsrc); 684 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 685 rtcp::ReceiverReport rr2; 686 rr2.From(kSenderSsrc); 687 rr2.WithReportBlock(&rb2); 688 rtcp::RawPacket p2 = rr2.Build(); 689 EXPECT_EQ(0, InjectRtcpPacket(p2.buffer(), p2.buffer_length())); 690 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 691 EXPECT_FALSE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 692 693 // Verify we can get a timeout again once we've received new RR. 694 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 695 EXPECT_EQ(0, InjectRtcpPacket(p2.buffer(), p2.buffer_length())); 696 system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1); 697 EXPECT_FALSE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 698 EXPECT_TRUE(rtcp_receiver_->RtcpRrSequenceNumberTimeout(kRtcpIntervalMs)); 699 system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs); 700 EXPECT_TRUE(rtcp_receiver_->RtcpRrTimeout(kRtcpIntervalMs)); 701 } 702 703 TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { 704 // This call is expected to fail because no data has arrived. 705 EXPECT_EQ(-1, rtcp_receiver_->TMMBRReceived(0, 0, NULL)); 706 } 707 708 TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) { 709 const uint32_t kMediaFlowSsrc = 0x2040608; 710 const uint32_t kSenderSsrc = 0x10203; 711 std::set<uint32_t> ssrcs; 712 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. 713 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 714 715 rtcp::Tmmbr tmmbr; 716 tmmbr.From(kSenderSsrc); 717 tmmbr.To(kMediaFlowSsrc); 718 tmmbr.WithBitrateKbps(30); 719 720 rtcp::SenderReport sr; 721 sr.From(kSenderSsrc); 722 sr.Append(&tmmbr); 723 rtcp::RawPacket p = sr.Build(); 724 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 725 726 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(0, 0, NULL)); 727 TMMBRSet candidate_set; 728 candidate_set.VerifyAndAllocateSet(1); 729 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(1, 0, &candidate_set)); 730 EXPECT_LT(0U, candidate_set.Tmmbr(0)); 731 EXPECT_EQ(kSenderSsrc, candidate_set.Ssrc(0)); 732 } 733 734 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { 735 const uint32_t kMediaFlowSsrc = 0x2040608; 736 const uint32_t kSenderSsrc = 0x10203; 737 738 rtcp::Tmmbr tmmbr; 739 tmmbr.From(kSenderSsrc); 740 tmmbr.To(kMediaFlowSsrc + 1); // This SSRC is not what we are sending. 741 tmmbr.WithBitrateKbps(30); 742 743 rtcp::SenderReport sr; 744 sr.From(kSenderSsrc); 745 sr.Append(&tmmbr); 746 rtcp::RawPacket p = sr.Build(); 747 748 std::set<uint32_t> ssrcs; 749 ssrcs.insert(kMediaFlowSsrc); 750 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 751 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 752 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, NULL)); 753 } 754 755 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { 756 const uint32_t kMediaFlowSsrc = 0x2040608; 757 const uint32_t kSenderSsrc = 0x10203; 758 std::set<uint32_t> ssrcs; 759 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. 760 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 761 762 rtcp::Tmmbr tmmbr; 763 tmmbr.From(kSenderSsrc); 764 tmmbr.To(kMediaFlowSsrc); 765 tmmbr.WithBitrateKbps(0); 766 767 rtcp::SenderReport sr; 768 sr.From(kSenderSsrc); 769 sr.Append(&tmmbr); 770 rtcp::RawPacket p = sr.Build(); 771 772 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 773 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, NULL)); 774 } 775 776 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { 777 const uint32_t kMediaFlowSsrc = 0x2040608; 778 const uint32_t kSenderSsrc = 0x10203; 779 std::set<uint32_t> ssrcs; 780 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. 781 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); 782 783 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. 784 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. 785 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { 786 rtcp::Tmmbr tmmbr; 787 tmmbr.From(ssrc); 788 tmmbr.To(kMediaFlowSsrc); 789 tmmbr.WithBitrateKbps(30); 790 791 rtcp::SenderReport sr; 792 sr.From(ssrc); 793 sr.Append(&tmmbr); 794 rtcp::RawPacket p = sr.Build(); 795 EXPECT_EQ(0, InjectRtcpPacket(p.buffer(), p.buffer_length())); 796 // 5 seconds between each packet. 797 system_clock_.AdvanceTimeMilliseconds(5000); 798 } 799 // It is now starttime + 15. 800 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(0, 0, NULL)); 801 TMMBRSet candidate_set; 802 candidate_set.VerifyAndAllocateSet(3); 803 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(3, 0, &candidate_set)); 804 EXPECT_LT(0U, candidate_set.Tmmbr(0)); 805 // We expect the timeout to be 25 seconds. Advance the clock by 12 806 // seconds, timing out the first packet. 807 system_clock_.AdvanceTimeMilliseconds(12000); 808 // Odd behaviour: Just counting them does not trigger the timeout. 809 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(0, 0, NULL)); 810 EXPECT_EQ(2, rtcp_receiver_->TMMBRReceived(3, 0, &candidate_set)); 811 EXPECT_EQ(kSenderSsrc + 1, candidate_set.Ssrc(0)); 812 } 813 814 TEST_F(RtcpReceiverTest, Callbacks) { 815 class RtcpCallbackImpl : public RtcpStatisticsCallback { 816 public: 817 RtcpCallbackImpl() : RtcpStatisticsCallback(), ssrc_(0) {} 818 virtual ~RtcpCallbackImpl() {} 819 820 virtual void StatisticsUpdated(const RtcpStatistics& statistics, 821 uint32_t ssrc) { 822 stats_ = statistics; 823 ssrc_ = ssrc; 824 } 825 826 bool Matches(uint32_t ssrc, uint32_t extended_max, uint8_t fraction_loss, 827 uint32_t cumulative_loss, uint32_t jitter) { 828 return ssrc_ == ssrc && 829 stats_.fraction_lost == fraction_loss && 830 stats_.cumulative_lost == cumulative_loss && 831 stats_.extended_max_sequence_number == extended_max && 832 stats_.jitter == jitter; 833 } 834 835 RtcpStatistics stats_; 836 uint32_t ssrc_; 837 } callback; 838 839 rtcp_receiver_->RegisterRtcpStatisticsCallback(&callback); 840 841 const uint32_t kSenderSsrc = 0x10203; 842 const uint32_t kSourceSsrc = 0x123456; 843 const uint8_t kFractionLoss = 3; 844 const uint32_t kCumulativeLoss = 7; 845 const uint32_t kJitter = 9; 846 const uint16_t kSequenceNumber = 1234; 847 848 std::set<uint32_t> ssrcs; 849 ssrcs.insert(kSourceSsrc); 850 rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs); 851 852 // First packet, all numbers should just propagate. 853 rtcp::ReportBlock rb1; 854 rb1.To(kSourceSsrc); 855 rb1.WithExtHighestSeqNum(kSequenceNumber); 856 rb1.WithFractionLost(kFractionLoss); 857 rb1.WithCumulativeLost(kCumulativeLoss); 858 rb1.WithJitter(kJitter); 859 860 rtcp::ReceiverReport rr1; 861 rr1.From(kSenderSsrc); 862 rr1.WithReportBlock(&rb1); 863 rtcp::RawPacket p1 = rr1.Build(); 864 EXPECT_EQ(0, InjectRtcpPacket(p1.buffer(), p1.buffer_length())); 865 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 866 kCumulativeLoss, kJitter)); 867 868 rtcp_receiver_->RegisterRtcpStatisticsCallback(NULL); 869 870 // Add arbitrary numbers, callback should not be called (retain old values). 871 rtcp::ReportBlock rb2; 872 rb2.To(kSourceSsrc); 873 rb2.WithExtHighestSeqNum(kSequenceNumber + 1); 874 rb2.WithFractionLost(42); 875 rb2.WithCumulativeLost(137); 876 rb2.WithJitter(4711); 877 878 rtcp::ReceiverReport rr2; 879 rr2.From(kSenderSsrc); 880 rr2.WithReportBlock(&rb2); 881 rtcp::RawPacket p2 = rr2.Build(); 882 EXPECT_EQ(0, InjectRtcpPacket(p2.buffer(), p2.buffer_length())); 883 EXPECT_TRUE(callback.Matches(kSourceSsrc, kSequenceNumber, kFractionLoss, 884 kCumulativeLoss, kJitter)); 885 } 886 887 } // Anonymous namespace 888 889 } // namespace webrtc 890