Home | History | Annotate | Download | only in rtcp_packet
      1 /*
      2  *  Copyright (c) 2016 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 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
     12 
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
     15 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
     16 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
     17 #include "webrtc/test/rtcp_packet_parser.h"
     18 
     19 using webrtc::rtcp::Bye;
     20 using webrtc::rtcp::CompoundPacket;
     21 using webrtc::rtcp::Fir;
     22 using webrtc::rtcp::RawPacket;
     23 using webrtc::rtcp::ReceiverReport;
     24 using webrtc::rtcp::ReportBlock;
     25 using webrtc::rtcp::SenderReport;
     26 using webrtc::test::RtcpPacketParser;
     27 
     28 namespace webrtc {
     29 
     30 const uint32_t kSenderSsrc = 0x12345678;
     31 
     32 TEST(RtcpCompoundPacketTest, AppendPacket) {
     33   Fir fir;
     34   ReportBlock rb;
     35   ReceiverReport rr;
     36   rr.From(kSenderSsrc);
     37   EXPECT_TRUE(rr.WithReportBlock(rb));
     38   rr.Append(&fir);
     39 
     40   rtc::scoped_ptr<RawPacket> packet(rr.Build());
     41   RtcpPacketParser parser;
     42   parser.Parse(packet->Buffer(), packet->Length());
     43   EXPECT_EQ(1, parser.receiver_report()->num_packets());
     44   EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
     45   EXPECT_EQ(1, parser.report_block()->num_packets());
     46   EXPECT_EQ(1, parser.fir()->num_packets());
     47 }
     48 
     49 TEST(RtcpCompoundPacketTest, AppendPacketOnEmpty) {
     50   CompoundPacket empty;
     51   ReceiverReport rr;
     52   rr.From(kSenderSsrc);
     53   empty.Append(&rr);
     54 
     55   rtc::scoped_ptr<RawPacket> packet(empty.Build());
     56   RtcpPacketParser parser;
     57   parser.Parse(packet->Buffer(), packet->Length());
     58   EXPECT_EQ(1, parser.receiver_report()->num_packets());
     59   EXPECT_EQ(0, parser.report_block()->num_packets());
     60 }
     61 
     62 TEST(RtcpCompoundPacketTest, AppendPacketWithOwnAppendedPacket) {
     63   Fir fir;
     64   Bye bye;
     65   ReportBlock rb;
     66 
     67   ReceiverReport rr;
     68   EXPECT_TRUE(rr.WithReportBlock(rb));
     69   rr.Append(&fir);
     70 
     71   SenderReport sr;
     72   sr.Append(&bye);
     73   sr.Append(&rr);
     74 
     75   rtc::scoped_ptr<RawPacket> packet(sr.Build());
     76   RtcpPacketParser parser;
     77   parser.Parse(packet->Buffer(), packet->Length());
     78   EXPECT_EQ(1, parser.sender_report()->num_packets());
     79   EXPECT_EQ(1, parser.receiver_report()->num_packets());
     80   EXPECT_EQ(1, parser.report_block()->num_packets());
     81   EXPECT_EQ(1, parser.bye()->num_packets());
     82   EXPECT_EQ(1, parser.fir()->num_packets());
     83 }
     84 
     85 TEST(RtcpCompoundPacketTest, BuildWithInputBuffer) {
     86   Fir fir;
     87   ReportBlock rb;
     88   ReceiverReport rr;
     89   rr.From(kSenderSsrc);
     90   EXPECT_TRUE(rr.WithReportBlock(rb));
     91   rr.Append(&fir);
     92 
     93   const size_t kRrLength = 8;
     94   const size_t kReportBlockLength = 24;
     95   const size_t kFirLength = 20;
     96 
     97   class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
     98    public:
     99     void OnPacketReady(uint8_t* data, size_t length) override {
    100       RtcpPacketParser parser;
    101       parser.Parse(data, length);
    102       EXPECT_EQ(1, parser.receiver_report()->num_packets());
    103       EXPECT_EQ(1, parser.report_block()->num_packets());
    104       EXPECT_EQ(1, parser.fir()->num_packets());
    105       ++packets_created_;
    106     }
    107 
    108     int packets_created_ = 0;
    109   } verifier;
    110   const size_t kBufferSize = kRrLength + kReportBlockLength + kFirLength;
    111   uint8_t buffer[kBufferSize];
    112   EXPECT_TRUE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier));
    113   EXPECT_EQ(1, verifier.packets_created_);
    114 }
    115 
    116 TEST(RtcpCompoundPacketTest, BuildWithTooSmallBuffer_FragmentedSend) {
    117   Fir fir;
    118   ReportBlock rb;
    119   ReceiverReport rr;
    120   rr.From(kSenderSsrc);
    121   EXPECT_TRUE(rr.WithReportBlock(rb));
    122   rr.Append(&fir);
    123 
    124   const size_t kRrLength = 8;
    125   const size_t kReportBlockLength = 24;
    126 
    127   class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
    128    public:
    129     void OnPacketReady(uint8_t* data, size_t length) override {
    130       RtcpPacketParser parser;
    131       parser.Parse(data, length);
    132       switch (packets_created_++) {
    133         case 0:
    134           EXPECT_EQ(1, parser.receiver_report()->num_packets());
    135           EXPECT_EQ(1, parser.report_block()->num_packets());
    136           EXPECT_EQ(0, parser.fir()->num_packets());
    137           break;
    138         case 1:
    139           EXPECT_EQ(0, parser.receiver_report()->num_packets());
    140           EXPECT_EQ(0, parser.report_block()->num_packets());
    141           EXPECT_EQ(1, parser.fir()->num_packets());
    142           break;
    143         default:
    144           ADD_FAILURE() << "OnPacketReady not expected to be called "
    145                         << packets_created_ << " times.";
    146       }
    147     }
    148 
    149     int packets_created_ = 0;
    150   } verifier;
    151   const size_t kBufferSize = kRrLength + kReportBlockLength;
    152   uint8_t buffer[kBufferSize];
    153   EXPECT_TRUE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier));
    154   EXPECT_EQ(2, verifier.packets_created_);
    155 }
    156 
    157 }  // namespace webrtc
    158