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::Fir; | 26 using webrtc::rtcp::Fir; |
28 using webrtc::rtcp::RawPacket; | 27 using webrtc::rtcp::RawPacket; |
29 using webrtc::rtcp::ReceiverReport; | 28 using webrtc::rtcp::ReceiverReport; |
30 using webrtc::rtcp::Remb; | 29 using webrtc::rtcp::Remb; |
31 using webrtc::rtcp::ReportBlock; | 30 using webrtc::rtcp::ReportBlock; |
32 using webrtc::rtcp::Rpsi; | 31 using webrtc::rtcp::Rpsi; |
33 using webrtc::rtcp::Rrtr; | |
34 using webrtc::rtcp::Sdes; | 32 using webrtc::rtcp::Sdes; |
35 using webrtc::rtcp::SenderReport; | 33 using webrtc::rtcp::SenderReport; |
36 using webrtc::rtcp::VoipMetric; | |
37 using webrtc::rtcp::Xr; | |
38 using webrtc::test::RtcpPacketParser; | 34 using webrtc::test::RtcpPacketParser; |
39 | 35 |
40 namespace webrtc { | 36 namespace webrtc { |
41 | 37 |
42 const uint32_t kSenderSsrc = 0x12345678; | 38 const uint32_t kSenderSsrc = 0x12345678; |
43 const uint32_t kRemoteSsrc = 0x23456789; | 39 const uint32_t kRemoteSsrc = 0x23456789; |
44 | 40 |
45 TEST(RtcpPacketTest, Sr) { | 41 TEST(RtcpPacketTest, Sr) { |
46 SenderReport sr; | 42 SenderReport sr; |
47 sr.From(kSenderSsrc); | 43 sr.From(kSenderSsrc); |
(...skipping 289 matching lines...) Loading... |
337 parser.Parse(packet->Buffer(), packet->Length()); | 333 parser.Parse(packet->Buffer(), packet->Length()); |
338 EXPECT_EQ(1, parser.psfb_app()->num_packets()); | 334 EXPECT_EQ(1, parser.psfb_app()->num_packets()); |
339 EXPECT_EQ(kSenderSsrc, parser.psfb_app()->Ssrc()); | 335 EXPECT_EQ(kSenderSsrc, parser.psfb_app()->Ssrc()); |
340 EXPECT_EQ(1, parser.remb_item()->num_packets()); | 336 EXPECT_EQ(1, parser.remb_item()->num_packets()); |
341 EXPECT_EQ(261011, parser.remb_item()->last_bitrate_bps()); | 337 EXPECT_EQ(261011, parser.remb_item()->last_bitrate_bps()); |
342 std::vector<uint32_t> ssrcs = parser.remb_item()->last_ssrc_list(); | 338 std::vector<uint32_t> ssrcs = parser.remb_item()->last_ssrc_list(); |
343 EXPECT_EQ(kRemoteSsrc, ssrcs[0]); | 339 EXPECT_EQ(kRemoteSsrc, ssrcs[0]); |
344 EXPECT_EQ(kRemoteSsrc + 1, ssrcs[1]); | 340 EXPECT_EQ(kRemoteSsrc + 1, ssrcs[1]); |
345 EXPECT_EQ(kRemoteSsrc + 2, ssrcs[2]); | 341 EXPECT_EQ(kRemoteSsrc + 2, ssrcs[2]); |
346 } | 342 } |
347 | |
348 TEST(RtcpPacketTest, XrWithNoReportBlocks) { | |
349 Xr xr; | |
350 xr.From(kSenderSsrc); | |
351 | |
352 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
353 RtcpPacketParser parser; | |
354 parser.Parse(packet->Buffer(), packet->Length()); | |
355 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
356 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
357 } | |
358 | |
359 TEST(RtcpPacketTest, XrWithRrtr) { | |
360 Rrtr rrtr; | |
361 rrtr.WithNtp(NtpTime(0x11111111, 0x22222222)); | |
362 Xr xr; | |
363 xr.From(kSenderSsrc); | |
364 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
365 | |
366 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
367 RtcpPacketParser parser; | |
368 parser.Parse(packet->Buffer(), packet->Length()); | |
369 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
370 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
371 EXPECT_EQ(1, parser.rrtr()->num_packets()); | |
372 EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec()); | |
373 EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac()); | |
374 } | |
375 | |
376 TEST(RtcpPacketTest, XrWithTwoRrtrBlocks) { | |
377 Rrtr rrtr1; | |
378 rrtr1.WithNtp(NtpTime(0x11111111, 0x22222222)); | |
379 Rrtr rrtr2; | |
380 rrtr2.WithNtp(NtpTime(0x33333333, 0x44444444)); | |
381 Xr xr; | |
382 xr.From(kSenderSsrc); | |
383 EXPECT_TRUE(xr.WithRrtr(&rrtr1)); | |
384 EXPECT_TRUE(xr.WithRrtr(&rrtr2)); | |
385 | |
386 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
387 RtcpPacketParser parser; | |
388 parser.Parse(packet->Buffer(), packet->Length()); | |
389 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
390 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
391 EXPECT_EQ(2, parser.rrtr()->num_packets()); | |
392 EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec()); | |
393 EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac()); | |
394 } | |
395 | |
396 TEST(RtcpPacketTest, XrWithDlrrWithOneSubBlock) { | |
397 Dlrr dlrr; | |
398 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); | |
399 Xr xr; | |
400 xr.From(kSenderSsrc); | |
401 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
402 | |
403 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
404 RtcpPacketParser parser; | |
405 parser.Parse(packet->Buffer(), packet->Length()); | |
406 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
407 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
408 EXPECT_EQ(1, parser.dlrr()->num_packets()); | |
409 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); | |
410 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); | |
411 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); | |
412 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); | |
413 } | |
414 | |
415 TEST(RtcpPacketTest, XrWithDlrrWithTwoSubBlocks) { | |
416 Dlrr dlrr; | |
417 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); | |
418 EXPECT_TRUE(dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); | |
419 Xr xr; | |
420 xr.From(kSenderSsrc); | |
421 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
422 | |
423 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
424 RtcpPacketParser parser; | |
425 parser.Parse(packet->Buffer(), packet->Length()); | |
426 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
427 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
428 EXPECT_EQ(1, parser.dlrr()->num_packets()); | |
429 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); | |
430 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); | |
431 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); | |
432 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); | |
433 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); | |
434 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); | |
435 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); | |
436 } | |
437 | |
438 TEST(RtcpPacketTest, DlrrWithTooManySubBlocks) { | |
439 const int kMaxItems = 100; | |
440 Dlrr dlrr; | |
441 for (int i = 0; i < kMaxItems; ++i) | |
442 EXPECT_TRUE(dlrr.WithDlrrItem(i, i, i)); | |
443 EXPECT_FALSE(dlrr.WithDlrrItem(kMaxItems, kMaxItems, kMaxItems)); | |
444 } | |
445 | |
446 TEST(RtcpPacketTest, XrWithTwoDlrrBlocks) { | |
447 Dlrr dlrr1; | |
448 EXPECT_TRUE(dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); | |
449 Dlrr dlrr2; | |
450 EXPECT_TRUE(dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); | |
451 Xr xr; | |
452 xr.From(kSenderSsrc); | |
453 EXPECT_TRUE(xr.WithDlrr(&dlrr1)); | |
454 EXPECT_TRUE(xr.WithDlrr(&dlrr2)); | |
455 | |
456 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
457 RtcpPacketParser parser; | |
458 parser.Parse(packet->Buffer(), packet->Length()); | |
459 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
460 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
461 EXPECT_EQ(2, parser.dlrr()->num_packets()); | |
462 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); | |
463 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); | |
464 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); | |
465 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); | |
466 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); | |
467 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); | |
468 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); | |
469 } | |
470 | |
471 TEST(RtcpPacketTest, XrWithVoipMetric) { | |
472 RTCPVoIPMetric metric; | |
473 metric.lossRate = 1; | |
474 metric.discardRate = 2; | |
475 metric.burstDensity = 3; | |
476 metric.gapDensity = 4; | |
477 metric.burstDuration = 0x1111; | |
478 metric.gapDuration = 0x2222; | |
479 metric.roundTripDelay = 0x3333; | |
480 metric.endSystemDelay = 0x4444; | |
481 metric.signalLevel = 5; | |
482 metric.noiseLevel = 6; | |
483 metric.RERL = 7; | |
484 metric.Gmin = 8; | |
485 metric.Rfactor = 9; | |
486 metric.extRfactor = 10; | |
487 metric.MOSLQ = 11; | |
488 metric.MOSCQ = 12; | |
489 metric.RXconfig = 13; | |
490 metric.JBnominal = 0x5555; | |
491 metric.JBmax = 0x6666; | |
492 metric.JBabsMax = 0x7777; | |
493 VoipMetric metric_block; | |
494 metric_block.To(kRemoteSsrc); | |
495 metric_block.WithVoipMetric(metric); | |
496 Xr xr; | |
497 xr.From(kSenderSsrc); | |
498 EXPECT_TRUE(xr.WithVoipMetric(&metric_block)); | |
499 | |
500 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
501 RtcpPacketParser parser; | |
502 parser.Parse(packet->Buffer(), packet->Length()); | |
503 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
504 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
505 EXPECT_EQ(1, parser.voip_metric()->num_packets()); | |
506 EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc()); | |
507 EXPECT_EQ(1, parser.voip_metric()->LossRate()); | |
508 EXPECT_EQ(2, parser.voip_metric()->DiscardRate()); | |
509 EXPECT_EQ(3, parser.voip_metric()->BurstDensity()); | |
510 EXPECT_EQ(4, parser.voip_metric()->GapDensity()); | |
511 EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration()); | |
512 EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration()); | |
513 EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay()); | |
514 EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay()); | |
515 EXPECT_EQ(5, parser.voip_metric()->SignalLevel()); | |
516 EXPECT_EQ(6, parser.voip_metric()->NoiseLevel()); | |
517 EXPECT_EQ(7, parser.voip_metric()->Rerl()); | |
518 EXPECT_EQ(8, parser.voip_metric()->Gmin()); | |
519 EXPECT_EQ(9, parser.voip_metric()->Rfactor()); | |
520 EXPECT_EQ(10, parser.voip_metric()->ExtRfactor()); | |
521 EXPECT_EQ(11, parser.voip_metric()->MosLq()); | |
522 EXPECT_EQ(12, parser.voip_metric()->MosCq()); | |
523 EXPECT_EQ(13, parser.voip_metric()->RxConfig()); | |
524 EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal()); | |
525 EXPECT_EQ(0x6666, parser.voip_metric()->JbMax()); | |
526 EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax()); | |
527 } | |
528 | |
529 TEST(RtcpPacketTest, XrWithMultipleReportBlocks) { | |
530 Rrtr rrtr; | |
531 Dlrr dlrr; | |
532 EXPECT_TRUE(dlrr.WithDlrrItem(1, 2, 3)); | |
533 VoipMetric metric; | |
534 Xr xr; | |
535 xr.From(kSenderSsrc); | |
536 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
537 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
538 EXPECT_TRUE(xr.WithVoipMetric(&metric)); | |
539 | |
540 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
541 RtcpPacketParser parser; | |
542 parser.Parse(packet->Buffer(), packet->Length()); | |
543 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
544 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
545 EXPECT_EQ(1, parser.rrtr()->num_packets()); | |
546 EXPECT_EQ(1, parser.dlrr()->num_packets()); | |
547 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); | |
548 EXPECT_EQ(1, parser.voip_metric()->num_packets()); | |
549 } | |
550 | |
551 TEST(RtcpPacketTest, DlrrWithoutItemNotIncludedInPacket) { | |
552 Rrtr rrtr; | |
553 Dlrr dlrr; | |
554 VoipMetric metric; | |
555 Xr xr; | |
556 xr.From(kSenderSsrc); | |
557 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
558 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
559 EXPECT_TRUE(xr.WithVoipMetric(&metric)); | |
560 | |
561 rtc::scoped_ptr<RawPacket> packet(xr.Build()); | |
562 RtcpPacketParser parser; | |
563 parser.Parse(packet->Buffer(), packet->Length()); | |
564 EXPECT_EQ(1, parser.xr_header()->num_packets()); | |
565 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); | |
566 EXPECT_EQ(1, parser.rrtr()->num_packets()); | |
567 EXPECT_EQ(0, parser.dlrr()->num_packets()); | |
568 EXPECT_EQ(1, parser.voip_metric()->num_packets()); | |
569 } | |
570 | |
571 TEST(RtcpPacketTest, XrWithTooManyBlocks) { | |
572 const int kMaxBlocks = 50; | |
573 Xr xr; | |
574 | |
575 Rrtr rrtr; | |
576 for (int i = 0; i < kMaxBlocks; ++i) | |
577 EXPECT_TRUE(xr.WithRrtr(&rrtr)); | |
578 EXPECT_FALSE(xr.WithRrtr(&rrtr)); | |
579 | |
580 Dlrr dlrr; | |
581 for (int i = 0; i < kMaxBlocks; ++i) | |
582 EXPECT_TRUE(xr.WithDlrr(&dlrr)); | |
583 EXPECT_FALSE(xr.WithDlrr(&dlrr)); | |
584 | |
585 VoipMetric voip_metric; | |
586 for (int i = 0; i < kMaxBlocks; ++i) | |
587 EXPECT_TRUE(xr.WithVoipMetric(&voip_metric)); | |
588 EXPECT_FALSE(xr.WithVoipMetric(&voip_metric)); | |
589 } | |
590 | |
591 } // namespace webrtc | 343 } // namespace webrtc |
OLD | NEW |