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