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; | |
27 using webrtc::rtcp::RawPacket; | 26 using webrtc::rtcp::RawPacket; |
28 using webrtc::rtcp::ReceiverReport; | 27 using webrtc::rtcp::ReceiverReport; |
29 using webrtc::rtcp::ReportBlock; | 28 using webrtc::rtcp::ReportBlock; |
30 using webrtc::rtcp::Rpsi; | 29 using webrtc::rtcp::Rpsi; |
31 using webrtc::rtcp::Rrtr; | |
32 using webrtc::rtcp::Sdes; | 30 using webrtc::rtcp::Sdes; |
33 using webrtc::rtcp::SenderReport; | 31 using webrtc::rtcp::SenderReport; |
34 using webrtc::rtcp::VoipMetric; | |
35 using webrtc::rtcp::Xr; | |
36 using webrtc::test::RtcpPacketParser; | 32 using webrtc::test::RtcpPacketParser; |
37 | 33 |
38 namespace webrtc { | 34 namespace webrtc { |
39 | 35 |
40 const uint32_t kSenderSsrc = 0x12345678; | 36 const uint32_t kSenderSsrc = 0x12345678; |
41 const uint32_t kRemoteSsrc = 0x23456789; | 37 const uint32_t kRemoteSsrc = 0x23456789; |
42 | 38 |
43 TEST(RtcpPacketTest, Sr) { | 39 TEST(RtcpPacketTest, Sr) { |
44 SenderReport sr; | 40 SenderReport sr; |
45 sr.From(kSenderSsrc); | 41 sr.From(kSenderSsrc); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 // No packet. | 294 // No packet. |
299 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { | 295 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { |
300 void OnPacketReady(uint8_t* data, size_t length) override { | 296 void OnPacketReady(uint8_t* data, size_t length) override { |
301 ADD_FAILURE() << "Packet should not fit within max size."; | 297 ADD_FAILURE() << "Packet should not fit within max size."; |
302 } | 298 } |
303 } verifier; | 299 } verifier; |
304 const size_t kBufferSize = kRrLength + kReportBlockLength - 1; | 300 const size_t kBufferSize = kRrLength + kReportBlockLength - 1; |
305 uint8_t buffer[kBufferSize]; | 301 uint8_t buffer[kBufferSize]; |
306 EXPECT_FALSE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier)); | 302 EXPECT_FALSE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier)); |
307 } | 303 } |
308 | |
309 | |
310 TEST(RtcpPacketTest, XrWithNoReportBlocks) { | |
311 Xr xr; | |
312 xr.From(kSenderSsrc); | |
313 | |
314 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
315 RtcpPacketParser parser; | |
316 parser.Parse(packet->Buffer(), packet->Length()); | |
317 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
318 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
319 } | |
320 | |
321 TEST(RtcpPacketTest, XrWithRrtr) { | |
322 Rrtr rrtr; | |
323 rrtr.WithNtp(NtpTime(0x11111111, 0x22222222)); | |
324 Xr xr; | |
325 xr.From(kSenderSsrc); | |
326 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
327 | |
328 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
329 RtcpPacketParser parser; | |
330 parser.Parse(packet->Buffer(), packet->Length()); | |
331 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
332 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
333 EXPECT_EQ(1, parser.rrtr()->num_packets()); | |
334 EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec()); | |
335 EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac()); | |
336 } | |
337 | |
338 TEST(RtcpPacketTest, XrWithTwoRrtrBlocks) { | |
339 Rrtr rrtr1; | |
340 rrtr1.WithNtp(NtpTime(0x11111111, 0x22222222)); | |
341 Rrtr rrtr2; | |
342 rrtr2.WithNtp(NtpTime(0x33333333, 0x44444444)); | |
343 Xr xr; | |
344 xr.From(kSenderSsrc); | |
345 EXPECT_TRUE(xr.WithRrtr(&rrtr1)); | |
346 EXPECT_TRUE(xr.WithRrtr(&rrtr2)); | |
347 | |
348 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
349 RtcpPacketParser parser; | |
350 parser.Parse(packet->Buffer(), packet->Length()); | |
351 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
352 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
353 EXPECT_EQ(2, parser.rrtr()->num_packets()); | |
354 EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec()); | |
355 EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac()); | |
356 } | |
357 | |
358 TEST(RtcpPacketTest, XrWithDlrrWithOneSubBlock) { | |
359 Dlrr dlrr; | |
360 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); | |
361 Xr xr; | |
362 xr.From(kSenderSsrc); | |
363 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
364 | |
365 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
366 RtcpPacketParser parser; | |
367 parser.Parse(packet->Buffer(), packet->Length()); | |
368 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
369 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
370 EXPECT_EQ(1, parser.dlrr()->num_packets()); | |
371 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); | |
372 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); | |
373 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); | |
374 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); | |
375 } | |
376 | |
377 TEST(RtcpPacketTest, XrWithDlrrWithTwoSubBlocks) { | |
378 Dlrr dlrr; | |
379 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); | |
380 EXPECT_TRUE(dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); | |
381 Xr xr; | |
382 xr.From(kSenderSsrc); | |
383 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
384 | |
385 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
386 RtcpPacketParser parser; | |
387 parser.Parse(packet->Buffer(), packet->Length()); | |
388 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
389 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
390 EXPECT_EQ(1, parser.dlrr()->num_packets()); | |
391 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); | |
392 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); | |
393 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); | |
394 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); | |
395 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); | |
396 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); | |
397 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); | |
398 } | |
399 | |
400 TEST(RtcpPacketTest, DlrrWithTooManySubBlocks) { | |
401 const int kMaxItems = 100; | |
402 Dlrr dlrr; | |
403 for (int i = 0; i < kMaxItems; ++i) | |
404 EXPECT_TRUE(dlrr.WithDlrrItem(i, i, i)); | |
405 EXPECT_FALSE(dlrr.WithDlrrItem(kMaxItems, kMaxItems, kMaxItems)); | |
406 } | |
407 | |
408 TEST(RtcpPacketTest, XrWithTwoDlrrBlocks) { | |
409 Dlrr dlrr1; | |
410 EXPECT_TRUE(dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); | |
411 Dlrr dlrr2; | |
412 EXPECT_TRUE(dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); | |
413 Xr xr; | |
414 xr.From(kSenderSsrc); | |
415 EXPECT_TRUE(xr.WithDlrr(&dlrr1)); | |
416 EXPECT_TRUE(xr.WithDlrr(&dlrr2)); | |
417 | |
418 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
419 RtcpPacketParser parser; | |
420 parser.Parse(packet->Buffer(), packet->Length()); | |
421 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
422 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
423 EXPECT_EQ(2, parser.dlrr()->num_packets()); | |
424 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); | |
425 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); | |
426 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); | |
427 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); | |
428 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); | |
429 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); | |
430 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); | |
431 } | |
432 | |
433 TEST(RtcpPacketTest, XrWithVoipMetric) { | |
434 RTCPVoIPMetric metric; | |
435 metric.lossRate = 1; | |
436 metric.discardRate = 2; | |
437 metric.burstDensity = 3; | |
438 metric.gapDensity = 4; | |
439 metric.burstDuration = 0x1111; | |
440 metric.gapDuration = 0x2222; | |
441 metric.roundTripDelay = 0x3333; | |
442 metric.endSystemDelay = 0x4444; | |
443 metric.signalLevel = 5; | |
444 metric.noiseLevel = 6; | |
445 metric.RERL = 7; | |
446 metric.Gmin = 8; | |
447 metric.Rfactor = 9; | |
448 metric.extRfactor = 10; | |
449 metric.MOSLQ = 11; | |
450 metric.MOSCQ = 12; | |
451 metric.RXconfig = 13; | |
452 metric.JBnominal = 0x5555; | |
453 metric.JBmax = 0x6666; | |
454 metric.JBabsMax = 0x7777; | |
455 VoipMetric metric_block; | |
456 metric_block.To(kRemoteSsrc); | |
457 metric_block.WithVoipMetric(metric); | |
458 Xr xr; | |
459 xr.From(kSenderSsrc); | |
460 EXPECT_TRUE(xr.WithVoipMetric(&metric_block)); | |
461 | |
462 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
463 RtcpPacketParser parser; | |
464 parser.Parse(packet->Buffer(), packet->Length()); | |
465 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
466 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
467 EXPECT_EQ(1, parser.voip_metric()->num_packets()); | |
468 EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc()); | |
469 EXPECT_EQ(1, parser.voip_metric()->LossRate()); | |
470 EXPECT_EQ(2, parser.voip_metric()->DiscardRate()); | |
471 EXPECT_EQ(3, parser.voip_metric()->BurstDensity()); | |
472 EXPECT_EQ(4, parser.voip_metric()->GapDensity()); | |
473 EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration()); | |
474 EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration()); | |
475 EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay()); | |
476 EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay()); | |
477 EXPECT_EQ(5, parser.voip_metric()->SignalLevel()); | |
478 EXPECT_EQ(6, parser.voip_metric()->NoiseLevel()); | |
479 EXPECT_EQ(7, parser.voip_metric()->Rerl()); | |
480 EXPECT_EQ(8, parser.voip_metric()->Gmin()); | |
481 EXPECT_EQ(9, parser.voip_metric()->Rfactor()); | |
482 EXPECT_EQ(10, parser.voip_metric()->ExtRfactor()); | |
483 EXPECT_EQ(11, parser.voip_metric()->MosLq()); | |
484 EXPECT_EQ(12, parser.voip_metric()->MosCq()); | |
485 EXPECT_EQ(13, parser.voip_metric()->RxConfig()); | |
486 EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal()); | |
487 EXPECT_EQ(0x6666, parser.voip_metric()->JbMax()); | |
488 EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax()); | |
489 } | |
490 | |
491 TEST(RtcpPacketTest, XrWithMultipleReportBlocks) { | |
492 Rrtr rrtr; | |
493 Dlrr dlrr; | |
494 EXPECT_TRUE(dlrr.WithDlrrItem(1, 2, 3)); | |
495 VoipMetric metric; | |
496 Xr xr; | |
497 xr.From(kSenderSsrc); | |
498 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
499 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
500 EXPECT_TRUE(xr.WithVoipMetric(&metric)); | |
501 | |
502 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
503 RtcpPacketParser parser; | |
504 parser.Parse(packet->Buffer(), packet->Length()); | |
505 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
506 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
507 EXPECT_EQ(1, parser.rrtr()->num_packets()); | |
508 EXPECT_EQ(1, parser.dlrr()->num_packets()); | |
509 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); | |
510 EXPECT_EQ(1, parser.voip_metric()->num_packets()); | |
511 } | |
512 | |
513 TEST(RtcpPacketTest, DlrrWithoutItemNotIncludedInPacket) { | |
514 Rrtr rrtr; | |
515 Dlrr dlrr; | |
516 VoipMetric metric; | |
517 Xr xr; | |
518 xr.From(kSenderSsrc); | |
519 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
520 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
521 EXPECT_TRUE(xr.WithVoipMetric(&metric)); | |
522 | |
523 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
524 RtcpPacketParser parser; | |
525 parser.Parse(packet->Buffer(), packet->Length()); | |
526 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
527 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
528 EXPECT_EQ(1, parser.rrtr()->num_packets()); | |
529 EXPECT_EQ(0, parser.dlrr()->num_packets()); | |
530 EXPECT_EQ(1, parser.voip_metric()->num_packets()); | |
531 } | |
532 | |
533 TEST(RtcpPacketTest, XrWithTooManyBlocks) { | |
534 const int kMaxBlocks = 50; | |
535 Xr xr; | |
536 | |
537 Rrtr rrtr; | |
538 for (int i = 0; i < kMaxBlocks; ++i) | |
539 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
540 EXPECT_FALSE(xr.WithRrtr(&rrtr)); | |
541 | |
542 Dlrr dlrr; | |
543 for (int i = 0; i < kMaxBlocks; ++i) | |
544 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
545 EXPECT_FALSE(xr.WithDlrr(&dlrr)); | |
546 | |
547 VoipMetric voip_metric; | |
548 for (int i = 0; i < kMaxBlocks; ++i) | |
549 EXPECT_TRUE(xr.WithVoipMetric(&voip_metric)); | |
550 EXPECT_FALSE(xr.WithVoipMetric(&voip_metric)); | |
551 } | |
552 | |
553 } // namespace webrtc | 304 } // namespace webrtc |
OLD | NEW |