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* parsed) { |
åsapersson
2016/01/21 16:04:35
perhaps parsed->fir
danilchap
2016/01/21 16:48:12
Done, fir is nicer.
| |
41 RtcpCommonHeader header; | |
42 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); | |
43 EXPECT_THAT(header.BlockSize(), Eq(length)); | |
44 return parsed->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 |