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