rtcp_packet_unittest.cc revision 4b12d400089f324293b8c313ba8257d9247e9cc6
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;
200f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Empty;
210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Fir;
224b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Ij;
23a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgusing webrtc::rtcp::Nack;
244b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Pli;
254b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Sdes;
264b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::SenderReport;
274b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::Sli;
280f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::RawPacket;
290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::ReceiverReport;
300f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::ReportBlock;
31a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgusing webrtc::rtcp::Rpsi;
320f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::test::RtcpPacketParser;
330f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
340f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgnamespace webrtc {
350f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
360f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgconst uint32_t kSenderSsrc = 0x12345678;
370f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgconst uint32_t kRemoteSsrc = 0x23456789;
380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
390f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Rr) {
400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, RrWithOneReportBlock) {
520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.To(kRemoteSsrc);
540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithFractionLost(55);
554b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  rb.WithCumulativeLost(0x111111);
560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithExtHighestSeqNum(0x22222222);
570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithJitter(0x33333333);
580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithLastSr(0x44444444);
590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.WithDelayLastSr(0x55555555);
600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
690f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc());
720f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(55U, parser.report_block()->FractionLost());
730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x111111U, parser.report_block()->CumPacketLost());
740f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.report_block()->ExtHighestSeqNum());
750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.report_block()->Jitter());
760f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.report_block()->LastSr());
770f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.report_block()->DelayLastSr());
780f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
800f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, RrWithTwoReportBlocks) {
810f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb1;
820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb1.To(kRemoteSsrc);
830f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb2;
840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb2.To(kRemoteSsrc + 1);
850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
880f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb1);
890f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb2);
900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
930f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
940f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
960f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(2, parser.report_block()->num_packets());
970f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc));
980f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1));
990f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1000f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1010f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Sr) {
1020f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
1030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
1040f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithNtpSec(0x11111111);
1050f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithNtpFrac(0x22222222);
1060f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithRtpTimestamp(0x33333333);
1070f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithPacketCount(0x44444444);
1080f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithOctetCount(0x55555555);
1090f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1100f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
1110f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1120f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1130f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1140f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.sender_report()->NtpSec());
1170f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.sender_report()->NtpFrac());
1180f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.sender_report()->RtpTimestamp());
1190f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.sender_report()->PacketCount());
1200f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.sender_report()->OctetCount());
1210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
1220f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1230f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1240f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, SrWithOneReportBlock) {
1250f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
1260f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.To(kRemoteSsrc);
1270f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1280f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
1290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
1300f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithReportBlock(&rb);
1310f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1320f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
1330f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1340f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1350f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1360f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1370f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
1380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc());
1390f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, SrWithTwoReportBlocks) {
1420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb1;
1430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb1.To(kRemoteSsrc);
1440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb2;
1450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb2.To(kRemoteSsrc + 1);
1460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
1480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
1490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithReportBlock(&rb1);
1500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithReportBlock(&rb2);
1510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
1530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
1540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(2, parser.report_block()->num_packets());
1580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc));
1590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1));
1600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
1624b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, IjNoItem) {
1634b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Ij ij;
1644b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1654b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = ij.Build();
1664b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
1674b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1684b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij()->num_packets());
1694b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, parser.ij_item()->num_packets());
1704b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1714b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1724b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, IjOneItem) {
1734b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Ij ij;
1744b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  ij.WithJitterItem(0x11111111);
1754b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1764b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = ij.Build();
1774b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
1784b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1794b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij()->num_packets());
1804b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij_item()->num_packets());
1814b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.ij_item()->Jitter());
1824b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1834b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1844b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, IjTwoItems) {
1854b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Ij ij;
1864b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  ij.WithJitterItem(0x11111111);
1874b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  ij.WithJitterItem(0x22222222);
1884b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1894b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = ij.Build();
1904b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
1914b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
1924b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.ij()->num_packets());
1934b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(2, parser.ij_item()->num_packets());
1944b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.ij_item()->Jitter());
1954b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1964b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1974b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, AppWithNoData) {
1984b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  App app;
1994b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithSubType(30);
2004b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  uint32_t name = 'n' << 24;
2014b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'a' << 16;
2024b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'm' << 8;
2034b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'e';
2044b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithName(name);
2054b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2064b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = app.Build();
2074b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2084b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2094b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app()->num_packets());
2104b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(30U, parser.app()->SubType());
2114b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(name, parser.app()->Name());
2124b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, parser.app_item()->num_packets());
2134b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2144b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2154b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, App) {
2164b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  App app;
2174b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.From(kSenderSsrc);
2184b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithSubType(30);
2194b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  uint32_t name = 'n' << 24;
2204b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'a' << 16;
2214b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'm' << 8;
2224b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'e';
2234b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithName(name);
2244b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
2254b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kDataLength = sizeof(kData) / sizeof(kData[0]);
2264b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithData((const uint8_t*)kData, kDataLength);
2274b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2284b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = app.Build();
2294b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2304b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2314b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app()->num_packets());
2324b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(30U, parser.app()->SubType());
2334b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(name, parser.app()->Name());
2344b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app_item()->num_packets());
2354b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kDataLength, parser.app_item()->DataLength());
2364b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, strncmp(kData, (const char*)parser.app_item()->Data(),
2374b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org      parser.app_item()->DataLength()));
2384b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2394b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2404b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, SdesWithOneChunk) {
2414b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
2424b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc, "alice@host");
2434b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2444b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sdes.Build();
2454b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2464b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2474b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2484b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
2494b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
2504b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("alice@host", parser.sdes_chunk()->Cname());
2514b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2524b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2534b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, SdesWithMultipleChunks) {
2544b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
2554b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc, "a");
2564b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 1, "ab");
2574b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 2, "abc");
2584b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 3, "abcd");
2594b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 4, "abcde");
2604b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc + 5, "abcdef");
2614b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2624b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sdes.Build();
2634b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2644b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2654b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2664b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(6, parser.sdes_chunk()->num_packets());
2674b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc + 5, parser.sdes_chunk()->Ssrc());
2684b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("abcdef", parser.sdes_chunk()->Cname());
2694b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2704b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2714b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, CnameItemWithEmptyString) {
2724b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
2734b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sdes.WithCName(kSenderSsrc, "");
2744b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2754b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sdes.Build();
2764b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2774b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2784b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2794b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
2804b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
2814b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("", parser.sdes_chunk()->Cname());
2824b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2834b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2844b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, Pli) {
2854b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Pli pli;
2864b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  pli.From(kSenderSsrc);
2874b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  pli.To(kRemoteSsrc);
2884b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2894b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = pli.Build();
2904b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
2914b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
2924b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.pli()->num_packets());
2934b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.pli()->Ssrc());
2944b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.pli()->MediaSsrc());
2954b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2964b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
2974b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, Sli) {
2984b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const uint16_t kFirstMb = 7777;
2994b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const uint16_t kNumberOfMb = 6666;
3004b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const uint8_t kPictureId = 60;
3014b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sli sli;
3024b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.From(kSenderSsrc);
3034b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.To(kRemoteSsrc);
3044b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.WithFirstMb(kFirstMb);
3054b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.WithNumberOfMb(kNumberOfMb);
3064b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  sli.WithPictureId(kPictureId);
3074b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
3084b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RawPacket packet = sli.Build();
3094b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
3104b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
3114b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sli()->num_packets());
3124b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sli()->Ssrc());
3134b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.sli()->MediaSsrc());
3144b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sli_item()->num_packets());
3154b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kFirstMb, parser.sli_item()->FirstMb());
3164b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kNumberOfMb, parser.sli_item()->NumberOfMb());
3174b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.sli_item()->PictureId());
3184b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
3194b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
320a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, Nack) {
321a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Nack nack;
322a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kList[] = {0, 1, 3, 8, 16};
323a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
324a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.From(kSenderSsrc);
325a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.To(kRemoteSsrc);
326a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.WithList(kList, kListLength);
327a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = nack.Build();
328a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
329a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
330a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(1, parser.nack()->num_packets());
331a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
332a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
333a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(1, parser.nack_item()->num_packets());
334a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list();
335a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kListLength, seqs.size());
336a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  for (size_t i = 0; i < kListLength; ++i) {
337a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org    EXPECT_EQ(kList[i], seqs[i]);
338a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  }
339a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
340a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
341a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, NackWithWrap) {
342a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Nack nack;
343a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kList[] = {65500, 65516, 65534, 65535, 0, 1, 3, 20, 100};
344a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
345a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.From(kSenderSsrc);
346a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.To(kRemoteSsrc);
347a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  nack.WithList(kList, kListLength);
348a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = nack.Build();
349a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
350a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
351a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(1, parser.nack()->num_packets());
352a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc());
353a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc());
354a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(4, parser.nack_item()->num_packets());
355a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list();
356a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kListLength, seqs.size());
357a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  for (size_t i = 0; i < kListLength; ++i) {
358a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org    EXPECT_EQ(kList[i], seqs[i]);
359a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  }
360a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
361a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
362a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, Rpsi) {
363a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
364a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1000001 (7 bits = 1 byte in native string).
365a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x41;
366a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 1;
367a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPayloadType(100);
368a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
369a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
370a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
371a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
372a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
373a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(100, parser.rpsi()->PayloadType());
374a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
375a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
376a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
377a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
378a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithTwoByteNativeString) {
379a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
380a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // |1 0000001 (7 bits = 1 byte in native string).
381a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x81;
382a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 2;
383a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
384a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
385a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
386a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
387a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
388a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
389a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
390a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
391a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
392a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithThreeByteNativeString) {
393a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
394a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string).
395a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x102040;
396a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 3;
397a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
398a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
399a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
400a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
401a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
402a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
403a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
404a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
405a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
406a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithFourByteNativeString) {
407a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
408a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string).
409a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x84161C2;
410a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 4;
411a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
412a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
413a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
414a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
415a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
416a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
417a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
418a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
419a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
420a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithMaxPictureId) {
421a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
422a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111|
423a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 11 111111|1 1111111 (7 bits = 1 byte in native string).
424a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0xffffffffffffffff;
425a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 10;
426a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
427a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
428a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RawPacket packet = rpsi.Build();
429a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
430a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
431a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
432a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
433a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
434a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
4350f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Fir) {
4360f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
4370f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.From(kSenderSsrc);
4380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.To(kRemoteSsrc);
4390f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.WithCommandSeqNum(123);
4400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = fir.Build();
4420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
4450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc());
4460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir_item()->num_packets());
4470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc());
4480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(123U, parser.fir_item()->SeqNum());
4490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
4500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, AppendPacket) {
4520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
4530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
4540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
4550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
4560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
4570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
4580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = rr.Build();
4600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
4630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc());
4640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
4650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
4660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
4670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, AppendPacketOnEmpty) {
4690f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Empty empty;
4700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
4710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
4720f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  empty.Append(&rr);
4730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4740f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = empty.Build();
4750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4760f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4770f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
4780f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
4790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
4800f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4810f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, AppendPacketWithOwnAppendedPacket) {
4820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
4830f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Bye bye;
4840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
4850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
4870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
4880f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
4890f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
4910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.Append(&bye);
4920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.Append(&rr);
4930f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
4940f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = sr.Build();
4950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
4960f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
4970f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
4980f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
4990f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
5000f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.bye()->num_packets());
5010f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5020f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5040f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Bye) {
5050f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Bye bye;
5060f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.From(kSenderSsrc);
5070f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5080f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = bye.Build();
5090f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5100f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
5110f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.bye()->num_packets());
5120f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.bye()->Ssrc());
5130f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5140f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, ByeWithCsrcs) {
5160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
5170f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Bye bye;
5180f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.From(kSenderSsrc);
5190f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.WithCsrc(0x22222222);
5200f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.WithCsrc(0x33333333);
5210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  bye.Append(&fir);
5220f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5230f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RawPacket packet = bye.Build();
5240f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5250f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet.buffer(), packet.buffer_length());
5260f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.bye()->num_packets());
5270f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.bye()->Ssrc());
5280f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5300f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5310f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithInputBuffer) {
5320f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
5330f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
5340f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
5350f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
5360f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
5370f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
5380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5394b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
5404b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
5414b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kFirLength = 20;
5420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5434b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  size_t len = 0;
5440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  uint8_t packet[kRrLength + kReportBlockLength + kFirLength];
5450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Build(packet, &len, kRrLength + kReportBlockLength + kFirLength);
5460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet, len);
5490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.receiver_report()->num_packets());
5500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
5510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5540f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithTooSmallBuffer) {
5550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
5560f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
5570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
5580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
5590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5604b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
5614b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
5620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  // No packet.
5644b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  size_t len = 0;
5650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  uint8_t packet[kRrLength + kReportBlockLength - 1];
5660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Build(packet, &len, kRrLength + kReportBlockLength - 1);
5670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet, len);
5694b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0U, len);
5700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5720f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithTooSmallBuffer_LastBlockFits) {
5730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
5740f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
5750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
5760f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
5770f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.WithReportBlock(&rb);
5780f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Append(&fir);
5790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5804b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
5814b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
5820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
5834b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  size_t len = 0;
5840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  uint8_t packet[kRrLength + kReportBlockLength - 1];
5850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.Build(packet, &len, kRrLength + kReportBlockLength - 1);
5860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
5870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  parser.Parse(packet, len);
5880f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.receiver_report()->num_packets());
5890f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
5900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
5910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
5920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}  // namespace webrtc
593