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 RTCPSender.
     14  */
     15 
     16 #include "testing/gmock/include/gmock/gmock.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 
     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/interface/rtp_header_parser.h"
     23 #include "webrtc/modules/rtp_rtcp/interface/rtp_payload_registry.h"
     24 #include "webrtc/modules/rtp_rtcp/interface/rtp_receiver.h"
     25 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
     26 #include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
     27 #include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h"
     28 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
     29 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
     30 
     31 namespace webrtc {
     32 
     33 TEST(NACKStringBuilderTest, TestCase1) {
     34   NACKStringBuilder builder;
     35   builder.PushNACK(5);
     36   builder.PushNACK(7);
     37   builder.PushNACK(9);
     38   builder.PushNACK(10);
     39   builder.PushNACK(11);
     40   builder.PushNACK(12);
     41   builder.PushNACK(15);
     42   builder.PushNACK(18);
     43   builder.PushNACK(19);
     44   EXPECT_EQ(std::string("5,7,9-12,15,18-19"), builder.GetResult());
     45 }
     46 
     47 TEST(NACKStringBuilderTest, TestCase2) {
     48   NACKStringBuilder builder;
     49   builder.PushNACK(5);
     50   builder.PushNACK(6);
     51   builder.PushNACK(7);
     52   builder.PushNACK(9);
     53   builder.PushNACK(10);
     54   builder.PushNACK(11);
     55   builder.PushNACK(12);
     56   builder.PushNACK(15);
     57   builder.PushNACK(18);
     58   builder.PushNACK(19);
     59   EXPECT_EQ(std::string("5-7,9-12,15,18-19"), builder.GetResult());
     60 }
     61 
     62 TEST(NACKStringBuilderTest, TestCase3) {
     63   NACKStringBuilder builder;
     64   builder.PushNACK(5);
     65   builder.PushNACK(7);
     66   builder.PushNACK(9);
     67   builder.PushNACK(10);
     68   builder.PushNACK(11);
     69   builder.PushNACK(12);
     70   builder.PushNACK(15);
     71   builder.PushNACK(18);
     72   builder.PushNACK(19);
     73   builder.PushNACK(21);
     74   EXPECT_EQ(std::string("5,7,9-12,15,18-19,21"), builder.GetResult());
     75 }
     76 
     77 TEST(NACKStringBuilderTest, TestCase4) {
     78   NACKStringBuilder builder;
     79   builder.PushNACK(5);
     80   builder.PushNACK(7);
     81   builder.PushNACK(8);
     82   builder.PushNACK(9);
     83   builder.PushNACK(10);
     84   builder.PushNACK(11);
     85   builder.PushNACK(12);
     86   builder.PushNACK(15);
     87   builder.PushNACK(18);
     88   builder.PushNACK(19);
     89   EXPECT_EQ(std::string("5,7-12,15,18-19"), builder.GetResult());
     90 }
     91 
     92 TEST(NACKStringBuilderTest, TestCase5) {
     93   NACKStringBuilder builder;
     94   builder.PushNACK(5);
     95   builder.PushNACK(7);
     96   builder.PushNACK(9);
     97   builder.PushNACK(10);
     98   builder.PushNACK(11);
     99   builder.PushNACK(12);
    100   builder.PushNACK(15);
    101   builder.PushNACK(16);
    102   builder.PushNACK(18);
    103   builder.PushNACK(19);
    104   EXPECT_EQ(std::string("5,7,9-12,15-16,18-19"), builder.GetResult());
    105 }
    106 
    107 TEST(NACKStringBuilderTest, TestCase6) {
    108   NACKStringBuilder builder;
    109   builder.PushNACK(5);
    110   builder.PushNACK(7);
    111   builder.PushNACK(9);
    112   builder.PushNACK(10);
    113   builder.PushNACK(11);
    114   builder.PushNACK(12);
    115   builder.PushNACK(15);
    116   builder.PushNACK(16);
    117   builder.PushNACK(17);
    118   builder.PushNACK(18);
    119   builder.PushNACK(19);
    120   EXPECT_EQ(std::string("5,7,9-12,15-19"), builder.GetResult());
    121 }
    122 
    123 TEST(NACKStringBuilderTest, TestCase7) {
    124   NACKStringBuilder builder;
    125   builder.PushNACK(5);
    126   builder.PushNACK(6);
    127   builder.PushNACK(7);
    128   builder.PushNACK(8);
    129   builder.PushNACK(11);
    130   builder.PushNACK(12);
    131   builder.PushNACK(13);
    132   builder.PushNACK(14);
    133   builder.PushNACK(15);
    134   EXPECT_EQ(std::string("5-8,11-15"), builder.GetResult());
    135 }
    136 
    137 TEST(NACKStringBuilderTest, TestCase8) {
    138   NACKStringBuilder builder;
    139   builder.PushNACK(5);
    140   builder.PushNACK(7);
    141   builder.PushNACK(9);
    142   builder.PushNACK(11);
    143   builder.PushNACK(15);
    144   builder.PushNACK(17);
    145   builder.PushNACK(19);
    146   EXPECT_EQ(std::string("5,7,9,11,15,17,19"), builder.GetResult());
    147 }
    148 
    149 TEST(NACKStringBuilderTest, TestCase9) {
    150   NACKStringBuilder builder;
    151   builder.PushNACK(5);
    152   builder.PushNACK(6);
    153   builder.PushNACK(7);
    154   builder.PushNACK(8);
    155   builder.PushNACK(9);
    156   builder.PushNACK(10);
    157   builder.PushNACK(11);
    158   builder.PushNACK(12);
    159   EXPECT_EQ(std::string("5-12"), builder.GetResult());
    160 }
    161 
    162 TEST(NACKStringBuilderTest, TestCase10) {
    163   NACKStringBuilder builder;
    164   builder.PushNACK(5);
    165   EXPECT_EQ(std::string("5"), builder.GetResult());
    166 }
    167 
    168 TEST(NACKStringBuilderTest, TestCase11) {
    169   NACKStringBuilder builder;
    170   EXPECT_EQ(std::string(""), builder.GetResult());
    171 }
    172 
    173 TEST(NACKStringBuilderTest, TestCase12) {
    174   NACKStringBuilder builder;
    175   builder.PushNACK(5);
    176   builder.PushNACK(6);
    177   EXPECT_EQ(std::string("5-6"), builder.GetResult());
    178 }
    179 
    180 TEST(NACKStringBuilderTest, TestCase13) {
    181   NACKStringBuilder builder;
    182   builder.PushNACK(5);
    183   builder.PushNACK(6);
    184   builder.PushNACK(9);
    185   EXPECT_EQ(std::string("5-6,9"), builder.GetResult());
    186 }
    187 
    188 void CreateRtpPacket(const bool marker_bit, const uint8_t payload,
    189     const uint16_t seq_num, const uint32_t timestamp,
    190     const uint32_t ssrc, uint8_t* array,
    191     uint16_t* cur_pos) {
    192   ASSERT_TRUE(payload <= 127);
    193   array[(*cur_pos)++] = 0x80;
    194   array[(*cur_pos)++] = payload | (marker_bit ? 0x80 : 0);
    195   array[(*cur_pos)++] = seq_num >> 8;
    196   array[(*cur_pos)++] = seq_num;
    197   array[(*cur_pos)++] = timestamp >> 24;
    198   array[(*cur_pos)++] = timestamp >> 16;
    199   array[(*cur_pos)++] = timestamp >> 8;
    200   array[(*cur_pos)++] = timestamp;
    201   array[(*cur_pos)++] = ssrc >> 24;
    202   array[(*cur_pos)++] = ssrc >> 16;
    203   array[(*cur_pos)++] = ssrc >> 8;
    204   array[(*cur_pos)++] = ssrc;
    205   // VP8 payload header
    206   array[(*cur_pos)++] = 0x90;  // X bit = 1
    207   array[(*cur_pos)++] = 0x20;  // T bit = 1
    208   array[(*cur_pos)++] = 0x00;  // TID = 0
    209   array[(*cur_pos)++] = 0x00;  // Key frame
    210   array[(*cur_pos)++] = 0x00;
    211   array[(*cur_pos)++] = 0x00;
    212   array[(*cur_pos)++] = 0x9d;
    213   array[(*cur_pos)++] = 0x01;
    214   array[(*cur_pos)++] = 0x2a;
    215   array[(*cur_pos)++] = 128;
    216   array[(*cur_pos)++] = 0;
    217   array[(*cur_pos)++] = 96;
    218   array[(*cur_pos)++] = 0;
    219 }
    220 
    221 class TestTransport : public Transport,
    222                       public NullRtpData {
    223  public:
    224   TestTransport()
    225       : rtcp_receiver_(NULL) {
    226   }
    227   void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) {
    228     rtcp_receiver_ = rtcp_receiver;
    229   }
    230   virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) {
    231     return -1;
    232   }
    233 
    234   virtual int SendRTCPPacket(int /*ch*/, const void *packet, int packet_len) {
    235     RTCPUtility::RTCPParserV2 rtcpParser((uint8_t*)packet,
    236                                          (int32_t)packet_len,
    237                                          true); // Allow non-compound RTCP
    238 
    239     EXPECT_TRUE(rtcpParser.IsValid());
    240     RTCPHelp::RTCPPacketInformation rtcpPacketInformation;
    241     EXPECT_EQ(0, rtcp_receiver_->IncomingRTCPPacket(rtcpPacketInformation,
    242                                                     &rtcpParser));
    243     rtcp_packet_info_.rtcpPacketTypeFlags =
    244         rtcpPacketInformation.rtcpPacketTypeFlags;
    245     rtcp_packet_info_.remoteSSRC = rtcpPacketInformation.remoteSSRC;
    246     rtcp_packet_info_.applicationSubType =
    247         rtcpPacketInformation.applicationSubType;
    248     rtcp_packet_info_.applicationName = rtcpPacketInformation.applicationName;
    249     rtcp_packet_info_.report_blocks = rtcpPacketInformation.report_blocks;
    250     rtcp_packet_info_.rtt = rtcpPacketInformation.rtt;
    251     rtcp_packet_info_.interArrivalJitter =
    252         rtcpPacketInformation.interArrivalJitter;
    253     rtcp_packet_info_.sliPictureId = rtcpPacketInformation.sliPictureId;
    254     rtcp_packet_info_.rpsiPictureId = rtcpPacketInformation.rpsiPictureId;
    255     rtcp_packet_info_.receiverEstimatedMaxBitrate =
    256         rtcpPacketInformation.receiverEstimatedMaxBitrate;
    257     rtcp_packet_info_.ntp_secs = rtcpPacketInformation.ntp_secs;
    258     rtcp_packet_info_.ntp_frac = rtcpPacketInformation.ntp_frac;
    259     rtcp_packet_info_.rtp_timestamp = rtcpPacketInformation.rtp_timestamp;
    260 
    261     return packet_len;
    262   }
    263 
    264   virtual int OnReceivedPayloadData(const uint8_t* payloadData,
    265                                     const uint16_t payloadSize,
    266                                     const WebRtcRTPHeader* rtpHeader) {
    267     return 0;
    268   }
    269   RTCPReceiver* rtcp_receiver_;
    270   RTCPHelp::RTCPPacketInformation rtcp_packet_info_;
    271 };
    272 
    273 class RtcpSenderTest : public ::testing::Test {
    274  protected:
    275   static const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000;
    276 
    277   RtcpSenderTest()
    278       : over_use_detector_options_(),
    279         clock_(1335900000),
    280         rtp_payload_registry_(new RTPPayloadRegistry(
    281             RTPPayloadStrategy::CreateStrategy(false))),
    282         remote_bitrate_observer_(),
    283         remote_bitrate_estimator_(
    284             RemoteBitrateEstimatorFactory().Create(
    285                 &remote_bitrate_observer_,
    286                 &clock_,
    287                 kMimdControl,
    288                 kRemoteBitrateEstimatorMinBitrateBps)),
    289         receive_statistics_(ReceiveStatistics::Create(&clock_)) {
    290     test_transport_ = new TestTransport();
    291 
    292     RtpRtcp::Configuration configuration;
    293     configuration.id = 0;
    294     configuration.audio = false;
    295     configuration.clock = &clock_;
    296     configuration.outgoing_transport = test_transport_;
    297     configuration.remote_bitrate_estimator = remote_bitrate_estimator_.get();
    298 
    299     rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
    300     rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver(
    301         0, &clock_, test_transport_, NULL, rtp_payload_registry_.get()));
    302     rtcp_sender_ =
    303         new RTCPSender(0, false, &clock_, receive_statistics_.get());
    304     rtcp_receiver_ = new RTCPReceiver(0, &clock_, rtp_rtcp_impl_);
    305     test_transport_->SetRTCPReceiver(rtcp_receiver_);
    306     // Initialize
    307     EXPECT_EQ(0, rtcp_sender_->Init());
    308     EXPECT_EQ(0, rtcp_sender_->RegisterSendTransport(test_transport_));
    309   }
    310   ~RtcpSenderTest() {
    311     delete rtcp_sender_;
    312     delete rtcp_receiver_;
    313     delete rtp_rtcp_impl_;
    314     delete test_transport_;
    315   }
    316 
    317   // Helper function: Incoming RTCP has a specific packet type.
    318   bool gotPacketType(RTCPPacketType packet_type) {
    319     return ((test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags) &
    320             packet_type) != 0U;
    321   }
    322 
    323   OverUseDetectorOptions over_use_detector_options_;
    324   SimulatedClock clock_;
    325   scoped_ptr<RTPPayloadRegistry> rtp_payload_registry_;
    326   scoped_ptr<RtpReceiver> rtp_receiver_;
    327   ModuleRtpRtcpImpl* rtp_rtcp_impl_;
    328   RTCPSender* rtcp_sender_;
    329   RTCPReceiver* rtcp_receiver_;
    330   TestTransport* test_transport_;
    331   MockRemoteBitrateObserver remote_bitrate_observer_;
    332   scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_;
    333   scoped_ptr<ReceiveStatistics> receive_statistics_;
    334 
    335   enum {kMaxPacketLength = 1500};
    336   uint8_t packet_[kMaxPacketLength];
    337 };
    338 
    339 TEST_F(RtcpSenderTest, RtcpOff) {
    340   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpOff));
    341   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    342   EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
    343 }
    344 
    345 TEST_F(RtcpSenderTest, IJStatus) {
    346   ASSERT_FALSE(rtcp_sender_->IJ());
    347   EXPECT_EQ(0, rtcp_sender_->SetIJStatus(true));
    348   ASSERT_TRUE(rtcp_sender_->IJ());
    349 }
    350 
    351 TEST_F(RtcpSenderTest, TestCompound) {
    352   const bool marker_bit = false;
    353   const uint8_t payload = 100;
    354   const uint16_t seq_num = 11111;
    355   const uint32_t timestamp = 1234567;
    356   const uint32_t ssrc = 0x11111111;
    357   uint16_t packet_length = 0;
    358   CreateRtpPacket(marker_bit, payload, seq_num, timestamp, ssrc, packet_,
    359       &packet_length);
    360   EXPECT_EQ(25, packet_length);
    361 
    362   VideoCodec codec_inst;
    363   strncpy(codec_inst.plName, "VP8", webrtc::kPayloadNameSize - 1);
    364   codec_inst.codecType = webrtc::kVideoCodecVP8;
    365   codec_inst.plType = payload;
    366   EXPECT_EQ(0, rtp_receiver_->RegisterReceivePayload(codec_inst.plName,
    367                                                      codec_inst.plType,
    368                                                      90000,
    369                                                      0,
    370                                                      codec_inst.maxBitrate));
    371 
    372   // Make sure RTP packet has been received.
    373   scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
    374   RTPHeader header;
    375   EXPECT_TRUE(parser->Parse(packet_, packet_length, &header));
    376   PayloadUnion payload_specific;
    377   EXPECT_TRUE(rtp_payload_registry_->GetPayloadSpecifics(header.payloadType,
    378                                                         &payload_specific));
    379   receive_statistics_->IncomingPacket(header, packet_length, false);
    380   EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(header, packet_, packet_length,
    381                                                payload_specific, true));
    382 
    383   EXPECT_EQ(0, rtcp_sender_->SetIJStatus(true));
    384   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    385   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    386   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRr));
    387 
    388   // Transmission time offset packet should be received.
    389   ASSERT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
    390       kRtcpTransmissionTimeOffset);
    391 }
    392 
    393 TEST_F(RtcpSenderTest, TestCompound_NoRtpReceived) {
    394   EXPECT_EQ(0, rtcp_sender_->SetIJStatus(true));
    395   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    396   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    397   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRr));
    398 
    399   // Transmission time offset packet should not be received.
    400   ASSERT_FALSE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
    401       kRtcpTransmissionTimeOffset);
    402 }
    403 
    404 TEST_F(RtcpSenderTest, TestXrReceiverReferenceTime) {
    405   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    406   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    407   EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false));
    408   rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
    409   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
    410 
    411   EXPECT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
    412       kRtcpXrReceiverReferenceTime);
    413 }
    414 
    415 TEST_F(RtcpSenderTest, TestNoXrReceiverReferenceTimeIfSending) {
    416   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    417   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    418   EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, true));
    419   rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
    420   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
    421 
    422   EXPECT_FALSE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
    423       kRtcpXrReceiverReferenceTime);
    424 }
    425 
    426 TEST_F(RtcpSenderTest, TestNoXrReceiverReferenceTimeIfNotEnabled) {
    427   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    428   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    429   EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false));
    430   rtcp_sender_->SendRtcpXrReceiverReferenceTime(false);
    431   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
    432 
    433   EXPECT_FALSE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
    434       kRtcpXrReceiverReferenceTime);
    435 }
    436 
    437 TEST_F(RtcpSenderTest, TestSendTimeOfXrRrReport) {
    438   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    439   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    440   EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state, false));
    441   rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
    442   uint32_t ntp_sec;
    443   uint32_t ntp_frac;
    444   clock_.CurrentNtp(ntp_sec, ntp_frac);
    445   uint32_t initial_mid_ntp = RTCPUtility::MidNtp(ntp_sec, ntp_frac);
    446 
    447   // No packet sent.
    448   int64_t time_ms;
    449   EXPECT_FALSE(rtcp_sender_->SendTimeOfXrRrReport(initial_mid_ntp, &time_ms));
    450 
    451   // Send XR RR packets.
    452   for (int i = 0; i <= RTCP_NUMBER_OF_SR; ++i) {
    453     EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
    454     EXPECT_TRUE(test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags &
    455         kRtcpXrReceiverReferenceTime);
    456 
    457     clock_.CurrentNtp(ntp_sec, ntp_frac);
    458     uint32_t mid_ntp = RTCPUtility::MidNtp(ntp_sec, ntp_frac);
    459     EXPECT_TRUE(rtcp_sender_->SendTimeOfXrRrReport(mid_ntp, &time_ms));
    460     EXPECT_EQ(clock_.CurrentNtpInMilliseconds(), time_ms);
    461     clock_.AdvanceTimeMilliseconds(1000);
    462   }
    463 
    464   // The first report should no longer be stored.
    465   EXPECT_FALSE(rtcp_sender_->SendTimeOfXrRrReport(initial_mid_ntp, &time_ms));
    466 }
    467 
    468 // This test is written to verify actual behaviour. It does not seem
    469 // to make much sense to send an empty TMMBN, since there is no place
    470 // to put an actual limit here. It's just information that no limit
    471 // is set, which is kind of the starting assumption.
    472 // See http://code.google.com/p/webrtc/issues/detail?id=468 for one
    473 // situation where this caused confusion.
    474 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) {
    475   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    476   TMMBRSet bounding_set;
    477   EXPECT_EQ(0, rtcp_sender_->SetTMMBN(&bounding_set, 3));
    478   ASSERT_EQ(0U, test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags);
    479   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    480   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state,kRtcpSr));
    481   // We now expect the packet to show up in the rtcp_packet_info_ of
    482   // test_transport_.
    483   ASSERT_NE(0U, test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags);
    484   EXPECT_TRUE(gotPacketType(kRtcpTmmbn));
    485   TMMBRSet* incoming_set = NULL;
    486   bool owner = false;
    487   // The BoundingSet function returns the number of members of the
    488   // bounding set, and touches the incoming set only if there's > 1.
    489   EXPECT_EQ(0, test_transport_->rtcp_receiver_->BoundingSet(owner,
    490       incoming_set));
    491 }
    492 
    493 TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndValid) {
    494   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
    495   TMMBRSet bounding_set;
    496   bounding_set.VerifyAndAllocateSet(1);
    497   const uint32_t kSourceSsrc = 12345;
    498   bounding_set.AddEntry(32768, 0, kSourceSsrc);
    499 
    500   EXPECT_EQ(0, rtcp_sender_->SetTMMBN(&bounding_set, 3));
    501   ASSERT_EQ(0U, test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags);
    502   RTCPSender::FeedbackState feedback_state(rtp_rtcp_impl_);
    503   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
    504   // We now expect the packet to show up in the rtcp_packet_info_ of
    505   // test_transport_.
    506   ASSERT_NE(0U, test_transport_->rtcp_packet_info_.rtcpPacketTypeFlags);
    507   EXPECT_TRUE(gotPacketType(kRtcpTmmbn));
    508   TMMBRSet incoming_set;
    509   bool owner = false;
    510   // We expect 1 member of the incoming set.
    511   EXPECT_EQ(1, test_transport_->rtcp_receiver_->BoundingSet(owner,
    512       &incoming_set));
    513   EXPECT_EQ(kSourceSsrc, incoming_set.Ssrc(0));
    514 }
    515 }  // namespace webrtc
    516