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/rpsi.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.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/base/checks.h" | 15 #include "webrtc/test/rtcp_packet_parser.h" |
16 | 16 |
17 using testing::ElementsAreArray; | 17 using testing::ElementsAreArray; |
18 using testing::make_tuple; | 18 using testing::make_tuple; |
19 using webrtc::rtcp::Rpsi; | 19 using webrtc::rtcp::Rpsi; |
20 using webrtc::RTCPUtility::RtcpCommonHeader; | |
21 using webrtc::RTCPUtility::RtcpParseCommonHeader; | |
22 | 20 |
23 namespace webrtc { | 21 namespace webrtc { |
24 namespace { | 22 namespace { |
25 const uint32_t kSenderSsrc = 0x12345678; | 23 const uint32_t kSenderSsrc = 0x12345678; |
26 const uint32_t kRemoteSsrc = 0x23456789; | 24 const uint32_t kRemoteSsrc = 0x23456789; |
27 // 10000|01 100001|0 1000011 (7 bits = 1 byte in native string). | 25 // 10000|01 100001|0 1000011 (7 bits = 1 byte in native string). |
28 const uint64_t kPictureId = 0x106143; | 26 const uint64_t kPictureId = 0x106143; |
29 const uint8_t kPayloadType = 100; | 27 const uint8_t kPayloadType = 100; |
30 // Manually created Rpsi packet matching constants above. | 28 // Manually created Rpsi packet matching constants above. |
31 const uint8_t kPacket[] = {0x83, 206, 0x00, 0x04, | 29 const uint8_t kPacket[] = {0x83, 206, 0x00, 0x04, |
32 0x12, 0x34, 0x56, 0x78, | 30 0x12, 0x34, 0x56, 0x78, |
33 0x23, 0x45, 0x67, 0x89, | 31 0x23, 0x45, 0x67, 0x89, |
34 24, 100, 0xc1, 0xc2, | 32 24, 100, 0xc1, 0xc2, |
35 0x43, 0, 0, 0}; | 33 0x43, 0, 0, 0}; |
36 | |
37 bool ParseRpsi(const uint8_t* buffer, size_t length, Rpsi* rpsi) { | |
38 RtcpCommonHeader header; | |
39 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); | |
40 EXPECT_EQ(length, header.BlockSize()); | |
41 return rpsi->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes); | |
42 } | |
43 // Testing function when test only interested if parse is successful. | |
44 bool ParseRpsi(const uint8_t* buffer, size_t length) { | |
45 Rpsi rpsi; | |
46 return ParseRpsi(buffer, length, &rpsi); | |
47 } | |
48 } // namespace | 34 } // namespace |
49 | 35 |
50 TEST(RtcpPacketRpsiTest, Parse) { | 36 TEST(RtcpPacketRpsiTest, Parse) { |
51 Rpsi mutable_parsed; | 37 Rpsi mutable_parsed; |
52 EXPECT_TRUE(ParseRpsi(kPacket, sizeof(kPacket), &mutable_parsed)); | 38 EXPECT_TRUE(test::ParseSinglePacket(kPacket, &mutable_parsed)); |
53 const Rpsi& parsed = mutable_parsed; // Read values from constant object. | 39 const Rpsi& parsed = mutable_parsed; // Read values from constant object. |
54 | 40 |
55 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | 41 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
56 EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc()); | 42 EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc()); |
57 EXPECT_EQ(kPayloadType, parsed.payload_type()); | 43 EXPECT_EQ(kPayloadType, parsed.payload_type()); |
58 EXPECT_EQ(kPictureId, parsed.picture_id()); | 44 EXPECT_EQ(kPictureId, parsed.picture_id()); |
59 } | 45 } |
60 | 46 |
61 TEST(RtcpPacketRpsiTest, Create) { | 47 TEST(RtcpPacketRpsiTest, Create) { |
62 Rpsi rpsi; | 48 Rpsi rpsi; |
63 rpsi.From(kSenderSsrc); | 49 rpsi.From(kSenderSsrc); |
64 rpsi.To(kRemoteSsrc); | 50 rpsi.To(kRemoteSsrc); |
65 rpsi.WithPayloadType(kPayloadType); | 51 rpsi.WithPayloadType(kPayloadType); |
66 rpsi.WithPictureId(kPictureId); | 52 rpsi.WithPictureId(kPictureId); |
67 | 53 |
68 rtc::Buffer packet = rpsi.Build(); | 54 rtc::Buffer packet = rpsi.Build(); |
69 | 55 |
70 EXPECT_THAT(make_tuple(packet.data(), packet.size()), | 56 EXPECT_THAT(make_tuple(packet.data(), packet.size()), |
71 ElementsAreArray(kPacket)); | 57 ElementsAreArray(kPacket)); |
72 } | 58 } |
73 | 59 |
74 TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { | 60 TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { |
75 Rpsi rpsi; | 61 Rpsi rpsi; |
76 rpsi.From(kSenderSsrc); | 62 rpsi.From(kSenderSsrc); |
77 rpsi.To(kRemoteSsrc); | 63 rpsi.To(kRemoteSsrc); |
78 | 64 |
79 rtc::Buffer packet = rpsi.Build(); | 65 rtc::Buffer packet = rpsi.Build(); |
80 packet.data()[3]--; // Reduce size field by one word (4 bytes). | 66 packet[3]--; // Reduce size field by one word (4 bytes). |
| 67 packet.SetSize(packet.size() - 4); |
81 | 68 |
82 EXPECT_FALSE(ParseRpsi(packet.data(), packet.size() - 4)); | 69 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); |
83 } | 70 } |
84 | 71 |
85 TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { | 72 TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { |
86 Rpsi rpsi; | 73 Rpsi rpsi; |
87 rpsi.From(kSenderSsrc); | 74 rpsi.From(kSenderSsrc); |
88 rpsi.To(kRemoteSsrc); | 75 rpsi.To(kRemoteSsrc); |
89 rpsi.WithPictureId(kPictureId); | 76 rpsi.WithPictureId(kPictureId); |
90 rtc::Buffer packet = rpsi.Build(); | 77 rtc::Buffer packet = rpsi.Build(); |
91 uint8_t* padding_bits = packet.data() + 12; | 78 uint8_t* padding_bits = packet.data() + 12; |
92 uint8_t saved_padding_bits = *padding_bits; | 79 uint8_t saved_padding_bits = *padding_bits; |
93 ASSERT_TRUE(ParseRpsi(packet.data(), packet.size())); | 80 ASSERT_TRUE(test::ParseSinglePacket(packet, &rpsi)); |
94 | 81 |
95 for (uint8_t i = 1; i < 8; ++i) { | 82 for (uint8_t i = 1; i < 8; ++i) { |
96 *padding_bits = saved_padding_bits + i; | 83 *padding_bits = saved_padding_bits + i; |
97 EXPECT_FALSE(ParseRpsi(packet.data(), packet.size())); | 84 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); |
98 } | 85 } |
99 } | 86 } |
100 | 87 |
101 TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { | 88 TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { |
102 Rpsi rpsi; | 89 Rpsi rpsi; |
103 rpsi.From(kSenderSsrc); | 90 rpsi.From(kSenderSsrc); |
104 rpsi.To(kRemoteSsrc); | 91 rpsi.To(kRemoteSsrc); |
105 rpsi.WithPictureId(1); // Small picture id that occupy just 1 byte. | 92 rpsi.WithPictureId(1); // Small picture id that occupy just 1 byte. |
106 rtc::Buffer packet = rpsi.Build(); | 93 rtc::Buffer packet = rpsi.Build(); |
107 uint8_t* padding_bits = packet.data() + 12; | 94 uint8_t* padding_bits = packet.data() + 12; |
108 ASSERT_TRUE(ParseRpsi(packet.data(), packet.size())); | 95 ASSERT_TRUE(test::ParseSinglePacket(packet, &rpsi)); |
109 | 96 |
110 *padding_bits += 8; | 97 *padding_bits += 8; |
111 EXPECT_FALSE(ParseRpsi(packet.data(), packet.size())); | 98 EXPECT_FALSE(test::ParseSinglePacket(packet, &rpsi)); |
112 } | 99 } |
113 | 100 |
114 // For raw rpsi packet extract how many bytes are used to store picture_id. | 101 // For raw rpsi packet extract how many bytes are used to store picture_id. |
115 size_t UsedBytes(const rtc::Buffer& packet) { // Works for small packets only. | 102 size_t UsedBytes(const rtc::Buffer& packet) { // Works for small packets only. |
116 RTC_CHECK_EQ(packet.data()[2], 0); // Assume packet is small. | 103 RTC_CHECK_EQ(packet.data()[2], 0); // Assume packet is small. |
117 size_t total_rpsi_payload_bytes = 4 * (packet.data()[3] - 2) - 2; | 104 size_t total_rpsi_payload_bytes = 4 * (packet.data()[3] - 2) - 2; |
118 uint8_t padding_bits = packet.data()[12]; | 105 uint8_t padding_bits = packet.data()[12]; |
119 RTC_CHECK_EQ(padding_bits % 8, 0); | 106 RTC_CHECK_EQ(padding_bits % 8, 0); |
120 return total_rpsi_payload_bytes - (padding_bits / 8); | 107 return total_rpsi_payload_bytes - (padding_bits / 8); |
121 } | 108 } |
122 | 109 |
123 TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { | 110 TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { |
124 Rpsi rpsi; | 111 Rpsi rpsi; |
125 // 1000001 (7 bits = 1 byte in native string). | 112 // 1000001 (7 bits = 1 byte in native string). |
126 const uint64_t kPictureId = 0x41; | 113 const uint64_t kPictureId = 0x41; |
127 const uint16_t kNumberOfValidBytes = 1; | 114 const uint16_t kNumberOfValidBytes = 1; |
128 rpsi.WithPictureId(kPictureId); | 115 rpsi.WithPictureId(kPictureId); |
129 | 116 |
130 rtc::Buffer packet = rpsi.Build(); | 117 rtc::Buffer packet = rpsi.Build(); |
131 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 118 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
132 | 119 |
133 Rpsi parsed; | 120 Rpsi parsed; |
134 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); | 121 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
135 EXPECT_EQ(kPictureId, parsed.picture_id()); | 122 EXPECT_EQ(kPictureId, parsed.picture_id()); |
136 } | 123 } |
137 | 124 |
138 TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { | 125 TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { |
139 Rpsi rpsi; | 126 Rpsi rpsi; |
140 // |1 0000001 (7 bits = 1 byte in native string). | 127 // |1 0000001 (7 bits = 1 byte in native string). |
141 const uint64_t kPictureId = 0x81; | 128 const uint64_t kPictureId = 0x81; |
142 const uint16_t kNumberOfValidBytes = 2; | 129 const uint16_t kNumberOfValidBytes = 2; |
143 rpsi.WithPictureId(kPictureId); | 130 rpsi.WithPictureId(kPictureId); |
144 | 131 |
145 rtc::Buffer packet = rpsi.Build(); | 132 rtc::Buffer packet = rpsi.Build(); |
146 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 133 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
147 | 134 |
148 Rpsi parsed; | 135 Rpsi parsed; |
149 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); | 136 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
150 EXPECT_EQ(kPictureId, parsed.picture_id()); | 137 EXPECT_EQ(kPictureId, parsed.picture_id()); |
151 } | 138 } |
152 | 139 |
153 TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { | 140 TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { |
154 Rpsi rpsi; | 141 Rpsi rpsi; |
155 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). | 142 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). |
156 const uint64_t kPictureId = 0x102040; | 143 const uint64_t kPictureId = 0x102040; |
157 const uint16_t kNumberOfValidBytes = 3; | 144 const uint16_t kNumberOfValidBytes = 3; |
158 rpsi.WithPictureId(kPictureId); | 145 rpsi.WithPictureId(kPictureId); |
159 | 146 |
160 rtc::Buffer packet = rpsi.Build(); | 147 rtc::Buffer packet = rpsi.Build(); |
161 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 148 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
162 | 149 |
163 Rpsi parsed; | 150 Rpsi parsed; |
164 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); | 151 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
165 EXPECT_EQ(kPictureId, parsed.picture_id()); | 152 EXPECT_EQ(kPictureId, parsed.picture_id()); |
166 } | 153 } |
167 | 154 |
168 TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { | 155 TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { |
169 Rpsi rpsi; | 156 Rpsi rpsi; |
170 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). | 157 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). |
171 const uint64_t kPictureId = 0x84161C2; | 158 const uint64_t kPictureId = 0x84161C2; |
172 const uint16_t kNumberOfValidBytes = 4; | 159 const uint16_t kNumberOfValidBytes = 4; |
173 rpsi.WithPictureId(kPictureId); | 160 rpsi.WithPictureId(kPictureId); |
174 | 161 |
175 rtc::Buffer packet = rpsi.Build(); | 162 rtc::Buffer packet = rpsi.Build(); |
176 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 163 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
177 | 164 |
178 Rpsi parsed; | 165 Rpsi parsed; |
179 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); | 166 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
180 EXPECT_EQ(kPictureId, parsed.picture_id()); | 167 EXPECT_EQ(kPictureId, parsed.picture_id()); |
181 } | 168 } |
182 | 169 |
183 TEST(RtcpPacketRpsiTest, WithMaxPictureId) { | 170 TEST(RtcpPacketRpsiTest, WithMaxPictureId) { |
184 Rpsi rpsi; | 171 Rpsi rpsi; |
185 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| | 172 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| |
186 // 11 111111|1 1111111 (7 bits = 1 byte in native string). | 173 // 11 111111|1 1111111 (7 bits = 1 byte in native string). |
187 const uint64_t kPictureId = 0xffffffffffffffff; | 174 const uint64_t kPictureId = 0xffffffffffffffff; |
188 const uint16_t kNumberOfValidBytes = 10; | 175 const uint16_t kNumberOfValidBytes = 10; |
189 rpsi.WithPictureId(kPictureId); | 176 rpsi.WithPictureId(kPictureId); |
190 | 177 |
191 rtc::Buffer packet = rpsi.Build(); | 178 rtc::Buffer packet = rpsi.Build(); |
192 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); | 179 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
193 | 180 |
194 Rpsi parsed; | 181 Rpsi parsed; |
195 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); | 182 EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed)); |
196 EXPECT_EQ(kPictureId, parsed.picture_id()); | 183 EXPECT_EQ(kPictureId, parsed.picture_id()); |
197 } | 184 } |
198 } // namespace webrtc | 185 } // namespace webrtc |
OLD | NEW |