OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 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 * This file includes unit tests for the RtcpPacket. | 10 * This file includes unit tests for the RtcpPacket. |
11 */ | 11 */ |
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 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" | 16 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" |
17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" | 17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" |
18 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" | 18 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" |
19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | 19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
20 #include "webrtc/test/rtcp_packet_parser.h" | 20 #include "webrtc/test/rtcp_packet_parser.h" |
21 | 21 |
22 using ::testing::ElementsAre; | 22 using ::testing::ElementsAre; |
23 | 23 |
24 using webrtc::rtcp::App; | 24 using webrtc::rtcp::App; |
25 using webrtc::rtcp::Bye; | 25 using webrtc::rtcp::Bye; |
26 using webrtc::rtcp::Dlrr; | 26 using webrtc::rtcp::Dlrr; |
27 using webrtc::rtcp::Empty; | 27 using webrtc::rtcp::Empty; |
28 using webrtc::rtcp::Fir; | 28 using webrtc::rtcp::Fir; |
29 using webrtc::rtcp::Nack; | |
30 using webrtc::rtcp::RawPacket; | 29 using webrtc::rtcp::RawPacket; |
31 using webrtc::rtcp::ReceiverReport; | 30 using webrtc::rtcp::ReceiverReport; |
32 using webrtc::rtcp::Remb; | 31 using webrtc::rtcp::Remb; |
33 using webrtc::rtcp::ReportBlock; | 32 using webrtc::rtcp::ReportBlock; |
34 using webrtc::rtcp::Rpsi; | 33 using webrtc::rtcp::Rpsi; |
35 using webrtc::rtcp::Rrtr; | 34 using webrtc::rtcp::Rrtr; |
36 using webrtc::rtcp::Sdes; | 35 using webrtc::rtcp::Sdes; |
37 using webrtc::rtcp::SenderReport; | 36 using webrtc::rtcp::SenderReport; |
38 using webrtc::rtcp::Sli; | 37 using webrtc::rtcp::Sli; |
39 using webrtc::rtcp::Tmmbn; | 38 using webrtc::rtcp::Tmmbn; |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 parser.Parse(packet->Buffer(), packet->Length()); | 235 parser.Parse(packet->Buffer(), packet->Length()); |
237 EXPECT_EQ(1, parser.sli()->num_packets()); | 236 EXPECT_EQ(1, parser.sli()->num_packets()); |
238 EXPECT_EQ(kSenderSsrc, parser.sli()->Ssrc()); | 237 EXPECT_EQ(kSenderSsrc, parser.sli()->Ssrc()); |
239 EXPECT_EQ(kRemoteSsrc, parser.sli()->MediaSsrc()); | 238 EXPECT_EQ(kRemoteSsrc, parser.sli()->MediaSsrc()); |
240 EXPECT_EQ(1, parser.sli_item()->num_packets()); | 239 EXPECT_EQ(1, parser.sli_item()->num_packets()); |
241 EXPECT_EQ(kFirstMb, parser.sli_item()->FirstMb()); | 240 EXPECT_EQ(kFirstMb, parser.sli_item()->FirstMb()); |
242 EXPECT_EQ(kNumberOfMb, parser.sli_item()->NumberOfMb()); | 241 EXPECT_EQ(kNumberOfMb, parser.sli_item()->NumberOfMb()); |
243 EXPECT_EQ(kPictureId, parser.sli_item()->PictureId()); | 242 EXPECT_EQ(kPictureId, parser.sli_item()->PictureId()); |
244 } | 243 } |
245 | 244 |
246 TEST(RtcpPacketTest, Nack) { | |
247 Nack nack; | |
248 const uint16_t kList[] = {0, 1, 3, 8, 16}; | |
249 const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]); | |
250 nack.From(kSenderSsrc); | |
251 nack.To(kRemoteSsrc); | |
252 nack.WithList(kList, kListLength); | |
253 rtc::scoped_ptr<RawPacket> packet(nack.Build()); | |
254 RtcpPacketParser parser; | |
255 parser.Parse(packet->Buffer(), packet->Length()); | |
256 EXPECT_EQ(1, parser.nack()->num_packets()); | |
257 EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc()); | |
258 EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc()); | |
259 EXPECT_EQ(1, parser.nack_item()->num_packets()); | |
260 std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list(); | |
261 EXPECT_EQ(kListLength, seqs.size()); | |
262 for (size_t i = 0; i < kListLength; ++i) { | |
263 EXPECT_EQ(kList[i], seqs[i]); | |
264 } | |
265 } | |
266 | |
267 TEST(RtcpPacketTest, NackWithWrap) { | |
268 Nack nack; | |
269 const uint16_t kList[] = {65500, 65516, 65534, 65535, 0, 1, 3, 20, 100}; | |
270 const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]); | |
271 nack.From(kSenderSsrc); | |
272 nack.To(kRemoteSsrc); | |
273 nack.WithList(kList, kListLength); | |
274 rtc::scoped_ptr<RawPacket> packet(nack.Build()); | |
275 RtcpPacketParser parser; | |
276 parser.Parse(packet->Buffer(), packet->Length()); | |
277 EXPECT_EQ(1, parser.nack()->num_packets()); | |
278 EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc()); | |
279 EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc()); | |
280 EXPECT_EQ(4, parser.nack_item()->num_packets()); | |
281 std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list(); | |
282 EXPECT_EQ(kListLength, seqs.size()); | |
283 for (size_t i = 0; i < kListLength; ++i) { | |
284 EXPECT_EQ(kList[i], seqs[i]); | |
285 } | |
286 } | |
287 | |
288 TEST(RtcpPacketTest, NackFragmented) { | |
289 Nack nack; | |
290 const uint16_t kList[] = {1, 100, 200, 300, 400}; | |
291 const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]); | |
292 nack.From(kSenderSsrc); | |
293 nack.To(kRemoteSsrc); | |
294 nack.WithList(kList, kListLength); | |
295 | |
296 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { | |
297 public: | |
298 void OnPacketReady(uint8_t* data, size_t length) override { | |
299 ++packets_created_; | |
300 RtcpPacketParser parser; | |
301 parser.Parse(data, length); | |
302 EXPECT_EQ(1, parser.nack()->num_packets()); | |
303 EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc()); | |
304 EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc()); | |
305 switch (packets_created_) { | |
306 case 1: | |
307 EXPECT_THAT(parser.nack_item()->last_nack_list(), | |
308 ElementsAre(1, 100, 200)); | |
309 break; | |
310 case 2: | |
311 EXPECT_THAT(parser.nack_item()->last_nack_list(), | |
312 ElementsAre(300, 400)); | |
313 break; | |
314 default: | |
315 ADD_FAILURE() << "Unexpected packet count: " << packets_created_; | |
316 } | |
317 } | |
318 int packets_created_ = 0; | |
319 } verifier; | |
320 const size_t kBufferSize = 12 + (3 * 4); // Fits common header + 3 nack items | |
321 uint8_t buffer[kBufferSize]; | |
322 EXPECT_TRUE(nack.BuildExternalBuffer(buffer, kBufferSize, &verifier)); | |
323 EXPECT_EQ(2, verifier.packets_created_); | |
324 } | |
325 | |
326 TEST(RtcpPacketTest, NackWithTooSmallBuffer) { | |
327 const uint16_t kList[] = {1}; | |
328 const size_t kMinNackBlockSize = 16; | |
329 Nack nack; | |
330 nack.From(kSenderSsrc); | |
331 nack.To(kRemoteSsrc); | |
332 nack.WithList(kList, 1); | |
333 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { | |
334 public: | |
335 void OnPacketReady(uint8_t* data, size_t length) override { | |
336 ADD_FAILURE() << "Buffer should be too small."; | |
337 } | |
338 } verifier; | |
339 uint8_t buffer[kMinNackBlockSize - 1]; | |
340 EXPECT_FALSE( | |
341 nack.BuildExternalBuffer(buffer, kMinNackBlockSize - 1, &verifier)); | |
342 } | |
343 | |
344 TEST(RtcpPacketTest, Rpsi) { | 245 TEST(RtcpPacketTest, Rpsi) { |
345 Rpsi rpsi; | 246 Rpsi rpsi; |
346 // 1000001 (7 bits = 1 byte in native string). | 247 // 1000001 (7 bits = 1 byte in native string). |
347 const uint64_t kPictureId = 0x41; | 248 const uint64_t kPictureId = 0x41; |
348 const uint16_t kNumberOfValidBytes = 1; | 249 const uint16_t kNumberOfValidBytes = 1; |
349 rpsi.WithPayloadType(100); | 250 rpsi.WithPayloadType(100); |
350 rpsi.WithPictureId(kPictureId); | 251 rpsi.WithPictureId(kPictureId); |
351 | 252 |
352 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); | 253 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); |
353 RtcpPacketParser parser; | 254 RtcpPacketParser parser; |
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | 809 EXPECT_TRUE(xr.WithDlrr(&dlrr)); |
909 EXPECT_FALSE(xr.WithDlrr(&dlrr)); | 810 EXPECT_FALSE(xr.WithDlrr(&dlrr)); |
910 | 811 |
911 VoipMetric voip_metric; | 812 VoipMetric voip_metric; |
912 for (int i = 0; i < kMaxBlocks; ++i) | 813 for (int i = 0; i < kMaxBlocks; ++i) |
913 EXPECT_TRUE(xr.WithVoipMetric(&voip_metric)); | 814 EXPECT_TRUE(xr.WithVoipMetric(&voip_metric)); |
914 EXPECT_FALSE(xr.WithVoipMetric(&voip_metric)); | 815 EXPECT_FALSE(xr.WithVoipMetric(&voip_metric)); |
915 } | 816 } |
916 | 817 |
917 } // namespace webrtc | 818 } // namespace webrtc |
OLD | NEW |