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 | 15 |
16 using testing::AllOf; | 16 using testing::AllOf; |
17 using testing::ElementsAre; | 17 using testing::ElementsAre; |
18 using testing::ElementsAreArray; | 18 using testing::ElementsAreArray; |
19 using testing::Eq; | 19 using testing::Eq; |
20 using testing::Field; | 20 using testing::Field; |
21 using testing::make_tuple; | 21 using testing::make_tuple; |
22 using webrtc::rtcp::Fir; | 22 using webrtc::rtcp::Fir; |
23 using webrtc::rtcp::RawPacket; | |
24 using webrtc::RTCPUtility::RtcpCommonHeader; | 23 using webrtc::RTCPUtility::RtcpCommonHeader; |
25 using webrtc::RTCPUtility::RtcpParseCommonHeader; | 24 using webrtc::RTCPUtility::RtcpParseCommonHeader; |
26 | 25 |
27 namespace webrtc { | 26 namespace webrtc { |
28 namespace { | 27 namespace { |
29 | 28 |
30 const uint32_t kSenderSsrc = 0x12345678; | 29 const uint32_t kSenderSsrc = 0x12345678; |
31 const uint32_t kRemoteSsrc = 0x23456789; | 30 const uint32_t kRemoteSsrc = 0x23456789; |
32 const uint8_t kSeqNr = 13; | 31 const uint8_t kSeqNr = 13; |
33 // Manually created Fir packet matching constants above. | 32 // Manually created Fir packet matching constants above. |
(...skipping 19 matching lines...) Expand all Loading... |
53 EXPECT_THAT(parsed.requests(), | 52 EXPECT_THAT(parsed.requests(), |
54 ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)), | 53 ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)), |
55 Field(&Fir::Request::seq_nr, Eq(kSeqNr))))); | 54 Field(&Fir::Request::seq_nr, Eq(kSeqNr))))); |
56 } | 55 } |
57 | 56 |
58 TEST(RtcpPacketFirTest, Create) { | 57 TEST(RtcpPacketFirTest, Create) { |
59 Fir fir; | 58 Fir fir; |
60 fir.From(kSenderSsrc); | 59 fir.From(kSenderSsrc); |
61 fir.WithRequestTo(kRemoteSsrc, kSeqNr); | 60 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
62 | 61 |
63 rtc::scoped_ptr<RawPacket> packet = fir.Build(); | 62 rtc::Buffer packet = fir.Build(); |
64 | 63 |
65 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), | 64 EXPECT_THAT(make_tuple(packet.data(), packet.size()), |
66 ElementsAreArray(kPacket)); | 65 ElementsAreArray(kPacket)); |
67 } | 66 } |
68 | 67 |
69 TEST(RtcpPacketFirTest, TwoFciEntries) { | 68 TEST(RtcpPacketFirTest, TwoFciEntries) { |
70 Fir fir; | 69 Fir fir; |
71 fir.From(kSenderSsrc); | 70 fir.From(kSenderSsrc); |
72 fir.WithRequestTo(kRemoteSsrc, kSeqNr); | 71 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
73 fir.WithRequestTo(kRemoteSsrc + 1, kSeqNr + 1); | 72 fir.WithRequestTo(kRemoteSsrc + 1, kSeqNr + 1); |
74 | 73 |
75 rtc::scoped_ptr<RawPacket> packet = fir.Build(); | 74 rtc::Buffer packet = fir.Build(); |
76 Fir parsed; | 75 Fir parsed; |
77 EXPECT_TRUE(ParseFir(packet->Buffer(), packet->Length(), &parsed)); | 76 EXPECT_TRUE(ParseFir(packet.data(), packet.size(), &parsed)); |
78 | 77 |
79 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 78 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
80 EXPECT_THAT(parsed.requests(), | 79 EXPECT_THAT(parsed.requests(), |
81 ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)), | 80 ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)), |
82 Field(&Fir::Request::seq_nr, Eq(kSeqNr))), | 81 Field(&Fir::Request::seq_nr, Eq(kSeqNr))), |
83 AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc + 1)), | 82 AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc + 1)), |
84 Field(&Fir::Request::seq_nr, Eq(kSeqNr + 1))))); | 83 Field(&Fir::Request::seq_nr, Eq(kSeqNr + 1))))); |
85 } | 84 } |
86 | 85 |
87 TEST(RtcpPacketFirTest, ParseFailsOnZeroFciEntries) { | 86 TEST(RtcpPacketFirTest, ParseFailsOnZeroFciEntries) { |
88 Fir fir; | 87 Fir fir; |
89 fir.From(kSenderSsrc); | 88 fir.From(kSenderSsrc); |
90 fir.WithRequestTo(kRemoteSsrc, kSeqNr); | 89 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
91 | 90 |
92 rtc::scoped_ptr<RawPacket> packet = fir.Build(); | 91 rtc::Buffer packet = fir.Build(); |
93 | 92 |
94 RtcpCommonHeader header; | 93 RtcpCommonHeader header; |
95 RtcpParseCommonHeader(packet->Buffer(), packet->Length(), &header); | 94 RtcpParseCommonHeader(packet.data(), packet.size(), &header); |
96 ASSERT_EQ(16u, header.payload_size_bytes); // Common: 8, 1xfci: 8. | 95 ASSERT_EQ(16u, header.payload_size_bytes); // Common: 8, 1xfci: 8. |
97 header.payload_size_bytes = 8; // Common: 8, 0xfcis. | 96 header.payload_size_bytes = 8; // Common: 8, 0xfcis. |
98 | 97 |
99 Fir parsed; | 98 Fir parsed; |
100 EXPECT_FALSE(parsed.Parse( | 99 EXPECT_FALSE(parsed.Parse( |
101 header, packet->Buffer() + RtcpCommonHeader::kHeaderSizeBytes)); | 100 header, packet.data() + RtcpCommonHeader::kHeaderSizeBytes)); |
102 } | 101 } |
103 | 102 |
104 TEST(RtcpPacketFirTest, ParseFailsOnFractionalFciEntries) { | 103 TEST(RtcpPacketFirTest, ParseFailsOnFractionalFciEntries) { |
105 Fir fir; | 104 Fir fir; |
106 fir.From(kSenderSsrc); | 105 fir.From(kSenderSsrc); |
107 fir.WithRequestTo(kRemoteSsrc, kSeqNr); | 106 fir.WithRequestTo(kRemoteSsrc, kSeqNr); |
108 fir.WithRequestTo(kRemoteSsrc + 1, kSeqNr + 1); | 107 fir.WithRequestTo(kRemoteSsrc + 1, kSeqNr + 1); |
109 | 108 |
110 rtc::scoped_ptr<RawPacket> packet = fir.Build(); | 109 rtc::Buffer packet = fir.Build(); |
111 | 110 |
112 RtcpCommonHeader header; | 111 RtcpCommonHeader header; |
113 RtcpParseCommonHeader(packet->Buffer(), packet->Length(), &header); | 112 RtcpParseCommonHeader(packet.data(), packet.size(), &header); |
114 ASSERT_EQ(24u, header.payload_size_bytes); // Common: 8, 2xfcis: 16. | 113 ASSERT_EQ(24u, header.payload_size_bytes); // Common: 8, 2xfcis: 16. |
115 | 114 |
116 const uint8_t* payload = | 115 const uint8_t* payload = packet.data() + RtcpCommonHeader::kHeaderSizeBytes; |
117 packet->Buffer() + RtcpCommonHeader::kHeaderSizeBytes; | |
118 Fir good; | 116 Fir good; |
119 EXPECT_TRUE(good.Parse(header, payload)); | 117 EXPECT_TRUE(good.Parse(header, payload)); |
120 for (size_t i = 1; i < 8; ++i) { | 118 for (size_t i = 1; i < 8; ++i) { |
121 header.payload_size_bytes = 16 + i; | 119 header.payload_size_bytes = 16 + i; |
122 Fir bad; | 120 Fir bad; |
123 EXPECT_FALSE(bad.Parse(header, payload)); | 121 EXPECT_FALSE(bad.Parse(header, payload)); |
124 } | 122 } |
125 } | 123 } |
126 } // namespace | 124 } // namespace |
127 } // namespace webrtc | 125 } // namespace webrtc |
OLD | NEW |