rtcp_packet_unittest.cc revision 3b84b3a58cf4093204749fa7ba782f49b8934246
10f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org/*
20f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
30f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *
40f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *  Use of this source code is governed by a BSD-style license
50f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *  that can be found in the LICENSE file in the root of the source
60f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *  tree. An additional intellectual property rights grant can be found
70f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *  in the file PATENTS.  All contributing project authors may
80f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
90f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org *
100f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org * This file includes unit tests for the RtcpPacket.
110f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org */
120f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
130f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
140f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org#include "webrtc/test/rtcp_packet_parser.h"
170f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
184b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::App;
190f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Bye;
203b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Dlrr;
210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Empty;
220f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Fir;
234b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Ij;
24a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgusing webrtc::rtcp::Nack;
254b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Pli;
264b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Sdes;
274b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::SenderReport;
284b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Sli;
290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::RawPacket;
300f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::ReceiverReport;
313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Remb;
320f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::ReportBlock;
33a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgusing webrtc::rtcp::Rpsi;
343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Rrtr;
353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::SenderReport;
363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Tmmbn;
373b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Tmmbr;
383b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::VoipMetric;
393b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Xr;
400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::test::RtcpPacketParser;
410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgnamespace webrtc {
430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgconst uint32_t kSenderSsrc = 0x12345678;
450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgconst uint32_t kRemoteSsrc = 0x23456789;
460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Rr) {
480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, RrWithOneReportBlock) {
600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.To(kRemoteSsrc);
620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithFractionLost(55);
634b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  rb.WithCumulativeLost(0x111111);
640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithExtHighestSeqNum(0x22222222);
650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithJitter(0x33333333);
660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithLastSr(0x44444444);
670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithDelayLastSr(0x55555555);
680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
690f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
720f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
740f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
760f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
770f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
780f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc());
800f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(55U, parser.report_block()->FractionLost());
810f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x111111U, parser.report_block()->CumPacketLost());
820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.report_block()->ExtHighestSeqNum());
830f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.report_block()->Jitter());
840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.report_block()->LastSr());
850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.report_block()->DelayLastSr());
860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
880f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, RrWithTwoReportBlocks) {
890f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb1;
900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb1.To(kRemoteSsrc);
910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb2;
920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb2.To(kRemoteSsrc + 1);
930f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
940f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
960f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb1);
970f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb2);
980f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
990f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
1000f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1010f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1020f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
1030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
1040f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(2, parser.report_block()->num_packets());
1050f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc));
1060f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1));
1070f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1080f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1090f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Sr) {
1100f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
1110f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
1120f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithNtpSec(0x11111111);
1130f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithNtpFrac(0x22222222);
1140f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithRtpTimestamp(0x33333333);
1150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithPacketCount(0x44444444);
1160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithOctetCount(0x55555555);
1170f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1180f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
1190f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1200f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1220f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1230f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1240f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.sender_report()->NtpSec());
1250f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.sender_report()->NtpFrac());
1260f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.sender_report()->RtpTimestamp());
1270f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.sender_report()->PacketCount());
1280f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.sender_report()->OctetCount());
1290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
1300f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1310f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1320f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, SrWithOneReportBlock) {
1330f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
1340f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.To(kRemoteSsrc);
1350f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1360f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
1370f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
1380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithReportBlock(&rb);
1390f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
1410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
1460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc());
1470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, SrWithTwoReportBlocks) {
1500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb1;
1510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb1.To(kRemoteSsrc);
1520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb2;
1530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb2.To(kRemoteSsrc + 1);
1540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
1560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
1570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithReportBlock(&rb1);
1580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithReportBlock(&rb2);
1590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
1610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(2, parser.report_block()->num_packets());
1660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc));
1670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1));
1680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1690f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1704b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, IjNoItem) {
1714b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Ij ij;
1724b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1734b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = ij.Build();
1744b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
1754b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1764b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij()->num_packets());
1774b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, parser.ij_item()->num_packets());
1784b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1794b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1804b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, IjOneItem) {
1814b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Ij ij;
1824b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  ij.WithJitterItem(0x11111111);
1834b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1844b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = ij.Build();
1854b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
1864b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1874b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij()->num_packets());
1884b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij_item()->num_packets());
1894b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.ij_item()->Jitter());
1904b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1914b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1924b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, IjTwoItems) {
1934b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Ij ij;
1944b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  ij.WithJitterItem(0x11111111);
1954b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  ij.WithJitterItem(0x22222222);
1964b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1974b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = ij.Build();
1984b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
1994b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2004b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij()->num_packets());
2014b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(2, parser.ij_item()->num_packets());
2024b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.ij_item()->Jitter());
2034b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2044b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2054b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, AppWithNoData) {
2064b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  App app;
2074b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithSubType(30);
2084b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  uint32_t name = 'n' << 24;
2094b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'a' << 16;
2104b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'm' << 8;
2114b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'e';
2124b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithName(name);
2134b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2144b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = app.Build();
2154b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2164b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2174b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app()->num_packets());
2184b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(30U, parser.app()->SubType());
2194b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(name, parser.app()->Name());
2204b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, parser.app_item()->num_packets());
2214b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2224b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2234b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, App) {
2244b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  App app;
2254b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.From(kSenderSsrc);
2264b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithSubType(30);
2274b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  uint32_t name = 'n' << 24;
2284b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'a' << 16;
2294b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'm' << 8;
2304b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'e';
2314b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithName(name);
2324b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
2334b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kDataLength = sizeof(kData) / sizeof(kData[0]);
2344b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithData((const uint8_t*)kData, kDataLength);
2354b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2364b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = app.Build();
2374b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2384b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2394b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app()->num_packets());
2404b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(30U, parser.app()->SubType());
2414b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(name, parser.app()->Name());
2424b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app_item()->num_packets());
2434b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kDataLength, parser.app_item()->DataLength());
2444b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, strncmp(kData, (const char*)parser.app_item()->Data(),
2454b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org      parser.app_item()->DataLength()));
2464b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2474b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2484b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, SdesWithOneChunk) {
2494b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
2504b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc, "alice@host");
2514b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2524b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sdes.Build();
2534b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2544b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2554b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2564b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
2574b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
2584b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("alice@host", parser.sdes_chunk()->Cname());
2594b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2604b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2614b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, SdesWithMultipleChunks) {
2624b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
2634b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc, "a");
2644b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 1, "ab");
2654b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 2, "abc");
2664b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 3, "abcd");
2674b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 4, "abcde");
2684b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 5, "abcdef");
2694b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2704b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sdes.Build();
2714b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2724b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2734b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2744b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(6, parser.sdes_chunk()->num_packets());
2754b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc + 5, parser.sdes_chunk()->Ssrc());
2764b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("abcdef", parser.sdes_chunk()->Cname());
2774b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2784b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2794b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, CnameItemWithEmptyString) {
2804b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
2814b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc, "");
2824b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2834b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sdes.Build();
2844b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2854b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2864b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2874b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
2884b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
2894b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("", parser.sdes_chunk()->Cname());
2904b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2914b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2924b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, Pli) {
2934b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Pli pli;
2944b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  pli.From(kSenderSsrc);
2954b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  pli.To(kRemoteSsrc);
2964b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2974b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = pli.Build();
2984b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2994b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
3004b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.pli()->num_packets());
3014b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.pli()->Ssrc());
3024b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.pli()->MediaSsrc());
3034b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
3044b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
3054b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, Sli) {
3064b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const uint16_t kFirstMb = 7777;
3074b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const uint16_t kNumberOfMb = 6666;
3084b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const uint8_t kPictureId = 60;
3094b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sli sli;
3104b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.From(kSenderSsrc);
3114b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.To(kRemoteSsrc);
3124b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.WithFirstMb(kFirstMb);
3134b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.WithNumberOfMb(kNumberOfMb);
3144b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.WithPictureId(kPictureId);
3154b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
3164b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sli.Build();
3174b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
3184b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
3194b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sli()->num_packets());
3204b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sli()->Ssrc());
3214b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.sli()->MediaSsrc());
3224b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sli_item()->num_packets());
3234b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kFirstMb, parser.sli_item()->FirstMb());
3244b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kNumberOfMb, parser.sli_item()->NumberOfMb());
3254b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.sli_item()->PictureId());
3264b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
3274b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
328a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, Nack) {
329a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Nack nack;
330a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kList[] = {0, 1, 3, 8, 16};
331a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
332a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.From(kSenderSsrc);
333a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.To(kRemoteSsrc);
334a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.WithList(kList, kListLength);
335a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = nack.Build();
336a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
337a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
338a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(1, parser.nack()->num_packets());
339a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
340a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
341a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(1, parser.nack_item()->num_packets());
342a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list();
343a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kListLength, seqs.size());
344a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  for (size_t i = 0; i < kListLength; ++i) {
345a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org    EXPECT_EQ(kList[i], seqs[i]);
346a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  }
347a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
348a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
349a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, NackWithWrap) {
350a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Nack nack;
351a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kList[] = {65500, 65516, 65534, 65535, 0, 1, 3, 20, 100};
352a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
353a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.From(kSenderSsrc);
354a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.To(kRemoteSsrc);
355a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.WithList(kList, kListLength);
356a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = nack.Build();
357a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
358a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
359a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(1, parser.nack()->num_packets());
360a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
361a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
362a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(4, parser.nack_item()->num_packets());
363a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list();
364a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kListLength, seqs.size());
365a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  for (size_t i = 0; i < kListLength; ++i) {
366a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org    EXPECT_EQ(kList[i], seqs[i]);
367a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  }
368a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
369a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
370a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, Rpsi) {
371a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
372a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1000001 (7 bits = 1 byte in native string).
373a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x41;
374a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 1;
375a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPayloadType(100);
376a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
377a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
378a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
379a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
380a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
381a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(100, parser.rpsi()->PayloadType());
382a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
383a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
384a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
385a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
386a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithTwoByteNativeString) {
387a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
388a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // |1 0000001 (7 bits = 1 byte in native string).
389a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x81;
390a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 2;
391a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
392a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
393a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
394a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
395a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
396a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
397a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
398a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
399a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
400a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithThreeByteNativeString) {
401a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
402a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string).
403a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x102040;
404a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 3;
405a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
406a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
407a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
408a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
409a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
410a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
411a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
412a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
413a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
414a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithFourByteNativeString) {
415a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
416a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string).
417a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x84161C2;
418a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 4;
419a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
420a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
421a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
422a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
423a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
424a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
425a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
426a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
427a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
428a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithMaxPictureId) {
429a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
430a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111|
431a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 11 111111|1 1111111 (7 bits = 1 byte in native string).
432a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0xffffffffffffffff;
433a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 10;
434a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
435a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
436a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
437a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
438a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
439a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
440a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
441a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
442a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
4430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Fir) {
4440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
4450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.From(kSenderSsrc);
4460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.To(kRemoteSsrc);
4470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.WithCommandSeqNum(123);
4480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = fir.Build();
4500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
4530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc());
4540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir_item()->num_packets());
4550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc());
4560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(123U, parser.fir_item()->SeqNum());
4570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
4580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, AppendPacket) {
4600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
4610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
4620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
4630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
4640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
4650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
4660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
4680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4690f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
4710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
4720f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
4730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
4740f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
4750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4760f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, AppendPacketOnEmpty) {
4770f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Empty empty;
4780f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
4790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
4800f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  empty.Append(&rr);
4810f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = empty.Build();
4830f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
4860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
4870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
4880f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4890f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, AppendPacketWithOwnAppendedPacket) {
4900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
4910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Bye bye;
4920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
4930f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4940f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
4950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
4960f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
4970f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4980f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
4990f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.Append(&bye);
5000f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.Append(&rr);
5010f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5020f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
5030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5040f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
5050f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
5060f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
5070f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
5080f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.bye()->num_packets());
5090f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5100f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5110f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5120f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Bye) {
5130f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Bye bye;
5140f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.From(kSenderSsrc);
5150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = bye.Build();
5170f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5180f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
5190f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.bye()->num_packets());
5200f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.bye()->Ssrc());
5210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5220f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5230f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, ByeWithCsrcs) {
5240f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
5250f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Bye bye;
5260f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.From(kSenderSsrc);
5270f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.WithCsrc(0x22222222);
5280f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.WithCsrc(0x33333333);
5290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.Append(&fir);
5300f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5310f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = bye.Build();
5320f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5330f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
5340f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.bye()->num_packets());
5350f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.bye()->Ssrc());
5360f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5370f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5390f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithInputBuffer) {
5400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
5410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
5420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
5430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
5440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
5450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
5460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5474b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
5484b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
5494b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kFirLength = 20;
5500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5514b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  size_t len = 0;
5520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  uint8_t packet[kRrLength + kReportBlockLength + kFirLength];
5530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Build(packet, &len, kRrLength + kReportBlockLength + kFirLength);
5540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet, len);
5570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
5580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
5590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithTooSmallBuffer) {
5630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
5640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
5650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
5660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
5670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5684b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
5694b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
5700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  // No packet.
5724b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  size_t len = 0;
5730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  uint8_t packet[kRrLength + kReportBlockLength - 1];
5740f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Build(packet, &len, kRrLength + kReportBlockLength - 1);
5750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5760f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet, len);
5774b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0U, len);
5780f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5800f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithTooSmallBuffer_LastBlockFits) {
5810f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
5820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
5830f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
5840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
5850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
5860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
5870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5884b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
5894b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
5900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5914b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  size_t len = 0;
5920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  uint8_t packet[kRrLength + kReportBlockLength - 1];
5930f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Build(packet, &len, kRrLength + kReportBlockLength - 1);
5940f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet, len);
5960f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.receiver_report()->num_packets());
5970f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
5980f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5990f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
6003b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6013b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, Remb) {
6023b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Remb remb;
6033b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.From(kSenderSsrc);
6043b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.AppliesTo(kRemoteSsrc);
6053b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.AppliesTo(kRemoteSsrc + 1);
6063b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.AppliesTo(kRemoteSsrc + 2);
6073b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.WithBitrateBps(261011);
6083b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6093b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = remb.Build();
6103b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
6113b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
6123b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.psfb_app()->num_packets());
6133b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.psfb_app()->Ssrc());
6143b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.remb_item()->num_packets());
6153b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(261011, parser.remb_item()->last_bitrate_bps());
6163b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  std::vector<uint32_t> ssrcs = parser.remb_item()->last_ssrc_list();
6173b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, ssrcs[0]);
6183b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc + 1, ssrcs[1]);
6193b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc + 2, ssrcs[2]);
6203b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
6213b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6223b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, Tmmbr) {
6233b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Tmmbr tmmbr;
6243b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbr.From(kSenderSsrc);
6253b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbr.To(kRemoteSsrc);
6263b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbr.WithBitrateKbps(312);
6273b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbr.WithOverhead(60);
6283b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6293b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = tmmbr.Build();
6303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
6313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
6323b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.tmmbr()->num_packets());
6333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.tmmbr()->Ssrc());
6343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.tmmbr_item()->num_packets());
6353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(312U, parser.tmmbr_item()->BitrateKbps());
6363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(60U, parser.tmmbr_item()->Overhead());
6373b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
6383b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6393b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, TmmbnWithNoItem) {
6403b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Tmmbn tmmbn;
6413b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbn.From(kSenderSsrc);
6423b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6433b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = tmmbn.Build();
6443b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
6453b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
6463b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.tmmbn()->num_packets());
6473b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc());
6483b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0, parser.tmmbn_items()->num_packets());
6493b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
6503b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6513b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, TmmbnWithOneItem) {
6523b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Tmmbn tmmbn;
6533b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbn.From(kSenderSsrc);
6543b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbn.WithTmmbr(kRemoteSsrc, 312, 60);
6553b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6563b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = tmmbn.Build();
6573b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
6583b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
6593b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.tmmbn()->num_packets());
6603b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc());
6613b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.tmmbn_items()->num_packets());
6623b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.tmmbn_items()->Ssrc(0));
6633b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(312U, parser.tmmbn_items()->BitrateKbps(0));
6643b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(60U, parser.tmmbn_items()->Overhead(0));
6653b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
6663b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6673b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, TmmbnWithTwoItems) {
6683b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Tmmbn tmmbn;
6693b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbn.From(kSenderSsrc);
6703b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbn.WithTmmbr(kRemoteSsrc, 312, 60);
6713b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  tmmbn.WithTmmbr(kRemoteSsrc + 1, 1288, 40);
6723b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6733b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = tmmbn.Build();
6743b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
6753b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
6763b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.tmmbn()->num_packets());
6773b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc());
6783b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.tmmbn_items()->num_packets());
6793b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.tmmbn_items()->Ssrc(0));
6803b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(312U, parser.tmmbn_items()->BitrateKbps(0));
6813b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(60U, parser.tmmbn_items()->Overhead(0));
6823b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc + 1, parser.tmmbn_items()->Ssrc(1));
6833b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1288U, parser.tmmbn_items()->BitrateKbps(1));
6843b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(40U, parser.tmmbn_items()->Overhead(1));
6853b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
6863b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6873b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithNoReportBlocks) {
6883b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
6893b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
6903b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6913b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
6923b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
6933b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
6943b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
6953b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
6963b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
6973b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
6983b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithRrtr) {
6993b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr;
7003b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  rrtr.WithNtpSec(0x11111111);
7013b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  rrtr.WithNtpFrac(0x22222222);
7023b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
7033b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
7043b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithRrtr(&rrtr);
7053b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7063b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
7073b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
7083b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
7093b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
7103b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
7113b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.rrtr()->num_packets());
7123b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec());
7133b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac());
7143b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
7153b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7163b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithTwoRrtrBlocks) {
7173b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr1;
7183b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  rrtr1.WithNtpSec(0x11111111);
7193b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  rrtr1.WithNtpFrac(0x22222222);
7203b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr2;
7213b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  rrtr2.WithNtpSec(0x33333333);
7223b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  rrtr2.WithNtpFrac(0x44444444);
7233b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
7243b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
7253b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithRrtr(&rrtr1);
7263b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithRrtr(&rrtr2);
7273b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7283b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
7293b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
7303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
7313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
7323b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
7333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.rrtr()->num_packets());
7343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec());
7353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac());
7363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
7373b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7383b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithDlrrWithOneSubBlock) {
7393b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
7403b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333);
7413b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
7423b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
7433b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithDlrr(&dlrr);
7443b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7453b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
7463b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
7473b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
7483b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
7493b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
7503b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr()->num_packets());
7513b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr_items()->num_packets());
7523b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
7533b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
7543b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
7553b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
7563b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7573b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithDlrrWithTwoSubBlocks) {
7583b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
7593b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333);
7603b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666);
7613b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
7623b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
7633b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithDlrr(&dlrr);
7643b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7653b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
7663b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
7673b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
7683b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
7693b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
7703b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr()->num_packets());
7713b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.dlrr_items()->num_packets());
7723b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
7733b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
7743b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
7753b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1));
7763b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1));
7773b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1));
7783b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
7793b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7803b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithTwoDlrrBlocks) {
7813b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr1;
7823b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333);
7833b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr2;
7843b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666);
7853b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
7863b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
7873b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithDlrr(&dlrr1);
7883b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithDlrr(&dlrr2);
7893b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
7903b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
7913b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
7923b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
7933b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
7943b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
7953b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.dlrr()->num_packets());
7963b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.dlrr_items()->num_packets());
7973b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
7983b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
7993b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
8003b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1));
8013b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1));
8023b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1));
8033b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
8043b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8053b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithVoipMetric) {
8063b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  VoipMetric metric;
8073b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.To(kRemoteSsrc);
8083b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.LossRate(1);
8093b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.DiscardRate(2);
8103b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.BurstDensity(3);
8113b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.GapDensity(4);
8123b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.BurstDuration(0x1111);
8133b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.GapDuration(0x2222);
8143b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.RoundTripDelay(0x3333);
8153b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.EndSystemDelay(0x4444);
8163b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.SignalLevel(5);
8173b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.NoiseLevel(6);
8183b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.Rerl(7);
8193b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.Gmin(8);
8203b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.Rfactor(9);
8213b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.ExtRfactor(10);
8223b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.MosLq(11);
8233b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.MosCq(12);
8243b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.RxConfig(13);
8253b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.JbNominal(0x5555);
8263b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.JbMax(0x6666);
8273b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  metric.JbAbsMax(0x7777);
8283b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8293b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
8303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
8313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithVoipMetric(&metric);
8323b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
8343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
8353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
8363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
8373b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
8383b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->num_packets());
8393b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc());
8403b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->LossRate());
8413b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.voip_metric()->DiscardRate());
8423b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(3, parser.voip_metric()->BurstDensity());
8433b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(4, parser.voip_metric()->GapDensity());
8443b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration());
8453b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration());
8463b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay());
8473b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay());
8483b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(5, parser.voip_metric()->SignalLevel());
8493b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(6, parser.voip_metric()->NoiseLevel());
8503b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(7, parser.voip_metric()->Rerl());
8513b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(8, parser.voip_metric()->Gmin());
8523b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(9, parser.voip_metric()->Rfactor());
8533b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(10, parser.voip_metric()->ExtRfactor());
8543b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(11, parser.voip_metric()->MosLq());
8553b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(12, parser.voip_metric()->MosCq());
8563b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(13, parser.voip_metric()->RxConfig());
8573b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal());
8583b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x6666, parser.voip_metric()->JbMax());
8593b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax());
8603b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
8613b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8623b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithMultipleReportBlocks) {
8633b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr;
8643b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
8653b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  dlrr.WithDlrrItem(1, 2, 3);
8663b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  VoipMetric metric;
8673b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
8683b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
8693b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithRrtr(&rrtr);
8703b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithDlrr(&dlrr);
8713b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithVoipMetric(&metric);
8723b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8733b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
8743b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
8753b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
8763b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
8773b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
8783b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.rrtr()->num_packets());
8793b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr()->num_packets());
8803b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr_items()->num_packets());
8813b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->num_packets());
8823b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
8833b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8843b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, DlrrWithoutItemNotIncludedInPacket) {
8853b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr;
8863b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
8873b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  VoipMetric metric;
8883b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
8893b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
8903b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithRrtr(&rrtr);
8913b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithDlrr(&dlrr);
8923b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.WithVoipMetric(&metric);
8933b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
8943b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RawPacket packet = xr.Build();
8953b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
8963b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
8973b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
8983b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
8993b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.rrtr()->num_packets());
9003b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0, parser.dlrr()->num_packets());
9013b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->num_packets());
9023b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
9030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}  // namespace webrtc
904