OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" |
12 | 12 |
13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "webrtc/test/rtcp_packet_parser.h" | |
16 | 15 |
| 16 using testing::AllOf; |
| 17 using testing::ElementsAre; |
| 18 using testing::ElementsAreArray; |
| 19 using testing::Eq; |
| 20 using testing::Field; |
| 21 using testing::make_tuple; |
17 using webrtc::rtcp::Fir; | 22 using webrtc::rtcp::Fir; |
18 using webrtc::rtcp::RawPacket; | 23 using webrtc::rtcp::RawPacket; |
19 using webrtc::test::RtcpPacketParser; | 24 using webrtc::RTCPUtility::RtcpCommonHeader; |
| 25 using webrtc::RTCPUtility::RtcpParseCommonHeader; |
20 | 26 |
21 namespace webrtc { | 27 namespace webrtc { |
| 28 namespace { |
22 | 29 |
23 const uint32_t kSenderSsrc = 0x12345678; | 30 const uint32_t kSenderSsrc = 0x12345678; |
24 const uint32_t kRemoteSsrc = 0x23456789; | 31 const uint32_t kRemoteSsrc = 0x23456789; |
| 32 const uint8_t kSeqNr = 13; |
| 33 // Manually created Fir packet matching constants above. |
| 34 const uint8_t kPacket[] = {0x84, 206, 0x00, 0x04, |
| 35 0x12, 0x34, 0x56, 0x78, |
| 36 0x00, 0x00, 0x00, 0x00, |
| 37 0x23, 0x45, 0x67, 0x89, |
| 38 0x0d, 0x00, 0x00, 0x00}; |
25 | 39 |
26 TEST(RtcpPacketFirTest, Fir) { | 40 bool ParseFir(const uint8_t* buffer, size_t length, Fir* fir) { |
| 41 RtcpCommonHeader header; |
| 42 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); |
| 43 EXPECT_THAT(header.BlockSize(), Eq(length)); |
| 44 return fir->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes); |
| 45 } |
| 46 |
| 47 TEST(RtcpPacketFirTest, Parse) { |
| 48 Fir mutable_parsed; |
| 49 EXPECT_TRUE(ParseFir(kPacket, sizeof(kPacket), &mutable_parsed)); |
| 50 const Fir& parsed = mutable_parsed; // Read values from constant object. |
| 51 |
| 52 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
| 53 EXPECT_THAT(parsed.requests(), |
| 54 ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)), |
| 55 Field(&Fir::Request::seq_nr, Eq(kSeqNr))))); |
| 56 } |
| 57 |
| 58 TEST(RtcpPacketFirTest, Create) { |
27 Fir fir; | 59 Fir fir; |
28 fir.From(kSenderSsrc); | 60 fir.From(kSenderSsrc); |
29 fir.To(kRemoteSsrc); | 61 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
30 fir.WithCommandSeqNum(123); | |
31 | 62 |
32 rtc::scoped_ptr<RawPacket> packet(fir.Build()); | 63 rtc::scoped_ptr<RawPacket> packet = fir.Build(); |
33 RtcpPacketParser parser; | 64 |
34 parser.Parse(packet->Buffer(), packet->Length()); | 65 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), |
35 EXPECT_EQ(1, parser.fir()->num_packets()); | 66 ElementsAreArray(kPacket)); |
36 EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc()); | |
37 EXPECT_EQ(1, parser.fir_item()->num_packets()); | |
38 EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc()); | |
39 EXPECT_EQ(123U, parser.fir_item()->SeqNum()); | |
40 } | 67 } |
41 | 68 |
| 69 TEST(RtcpPacketFirTest, TwoFciEntries) { |
| 70 Fir fir; |
| 71 fir.From(kSenderSsrc); |
| 72 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
| 73 fir.WithRequestTo(kRemoteSsrc + 1, kSeqNr + 1); |
| 74 |
| 75 rtc::scoped_ptr<RawPacket> packet = fir.Build(); |
| 76 Fir parsed; |
| 77 EXPECT_TRUE(ParseFir(packet->Buffer(), packet->Length(), &parsed)); |
| 78 |
| 79 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
| 80 EXPECT_THAT(parsed.requests(), |
| 81 ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)), |
| 82 Field(&Fir::Request::seq_nr, Eq(kSeqNr))), |
| 83 AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc + 1)), |
| 84 Field(&Fir::Request::seq_nr, Eq(kSeqNr + 1))))); |
| 85 } |
| 86 |
| 87 TEST(RtcpPacketFirTest, ParseFailsOnZeroFciEntries) { |
| 88 Fir fir; |
| 89 fir.From(kSenderSsrc); |
| 90 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
| 91 |
| 92 rtc::scoped_ptr<RawPacket> packet = fir.Build(); |
| 93 |
| 94 RtcpCommonHeader header; |
| 95 RtcpParseCommonHeader(packet->Buffer(), packet->Length(), &header); |
| 96 ASSERT_EQ(16u, header.payload_size_bytes); // Common: 8, 1xfci: 8. |
| 97 header.payload_size_bytes = 8; // Common: 8, 0xfcis. |
| 98 |
| 99 Fir parsed; |
| 100 EXPECT_FALSE(parsed.Parse( |
| 101 header, packet->Buffer() + RtcpCommonHeader::kHeaderSizeBytes)); |
| 102 } |
| 103 |
| 104 TEST(RtcpPacketFirTest, ParseFailsOnFractionalFciEntries) { |
| 105 Fir fir; |
| 106 fir.From(kSenderSsrc); |
| 107 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
| 108 fir.WithRequestTo(kRemoteSsrc + 1, kSeqNr + 1); |
| 109 |
| 110 rtc::scoped_ptr<RawPacket> packet = fir.Build(); |
| 111 |
| 112 RtcpCommonHeader header; |
| 113 RtcpParseCommonHeader(packet->Buffer(), packet->Length(), &header); |
| 114 ASSERT_EQ(24u, header.payload_size_bytes); // Common: 8, 2xfcis: 16. |
| 115 |
| 116 const uint8_t* payload = |
| 117 packet->Buffer() + RtcpCommonHeader::kHeaderSizeBytes; |
| 118 Fir good; |
| 119 EXPECT_TRUE(good.Parse(header, payload)); |
| 120 for (size_t i = 1; i < 8; ++i) { |
| 121 header.payload_size_bytes = 16 + i; |
| 122 Fir bad; |
| 123 EXPECT_FALSE(bad.Parse(header, payload)); |
| 124 } |
| 125 } |
| 126 } // namespace |
42 } // namespace webrtc | 127 } // namespace webrtc |
OLD | NEW |