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
13c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng#include "testing/gmock/include/gmock/gmock.h"
140f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
170219c9b4bfcbb778137756210eb95f40d936cc66danilchap#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
1850c5136cb2ad11eb9ba3df1a1d54d527c8a0dc77danilchap#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
1997f7e13c23ddb26543f33bce944d501e58d1dd9bDanil Chapovalov#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
200f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org#include "webrtc/test/rtcp_packet_parser.h"
210f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
22c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språngusing ::testing::ElementsAre;
23c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
244b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgusing webrtc::rtcp::App;
250f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Bye;
263b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Dlrr;
270f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::Fir;
280f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::RawPacket;
290f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::ReceiverReport;
303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Remb;
310f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::rtcp::ReportBlock;
32a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgusing webrtc::rtcp::Rpsi;
333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Rrtr;
3497f7e13c23ddb26543f33bce944d501e58d1dd9bDanil Chapovalovusing webrtc::rtcp::Sdes;
353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::SenderReport;
363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::VoipMetric;
373b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgusing webrtc::rtcp::Xr;
380f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgusing webrtc::test::RtcpPacketParser;
390f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
400f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgnamespace webrtc {
410f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
420f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgconst uint32_t kSenderSsrc = 0x12345678;
430f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgconst uint32_t kRemoteSsrc = 0x23456789;
440f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
450f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Sr) {
460f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
470f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
480f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithNtpSec(0x11111111);
490f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithNtpFrac(0x22222222);
500f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithRtpTimestamp(0x33333333);
510f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithPacketCount(0x44444444);
520f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.WithOctetCount(0x55555555);
530f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
54c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(sr.Build());
550f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
56c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
570f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
580f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
590f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
600f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.sender_report()->NtpSec());
610f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.sender_report()->NtpFrac());
620f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.sender_report()->RtpTimestamp());
630f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.sender_report()->PacketCount());
640f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.sender_report()->OctetCount());
650f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(0, parser.report_block()->num_packets());
660f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
670f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
680f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, SrWithOneReportBlock) {
690f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
700f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb.To(kRemoteSsrc);
710f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
720f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
730f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
74bdc0b0d869e9a14bbfafcbb84e294a13383e6fa6Erik Språng  EXPECT_TRUE(sr.WithReportBlock(rb));
750f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
76c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(sr.Build());
770f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
78c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
790f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
800f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
810f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_block()->num_packets());
820f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc());
830f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
840f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
850f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, SrWithTwoReportBlocks) {
860f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb1;
870f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb1.To(kRemoteSsrc);
880f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb2;
890f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rb2.To(kRemoteSsrc + 1);
900f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  SenderReport sr;
920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  sr.From(kSenderSsrc);
93bdc0b0d869e9a14bbfafcbb84e294a13383e6fa6Erik Språng  EXPECT_TRUE(sr.WithReportBlock(rb1));
94bdc0b0d869e9a14bbfafcbb84e294a13383e6fa6Erik Språng  EXPECT_TRUE(sr.WithReportBlock(rb2));
950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
96c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(sr.Build());
970f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
98c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
990f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.sender_report()->num_packets());
1000f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
1010f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(2, parser.report_block()->num_packets());
1020f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc));
1030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1));
1040f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
1050f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
106c1b9d4e686c184e4b1779d442d447128477d3b8bErik SprångTEST(RtcpPacketTest, SrWithTooManyReportBlocks) {
107c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  SenderReport sr;
108c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  sr.From(kSenderSsrc);
109c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  const int kMaxReportBlocks = (1 << 5) - 1;
110c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  ReportBlock rb;
111c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  for (int i = 0; i < kMaxReportBlocks; ++i) {
112c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    rb.To(kRemoteSsrc + i);
113bdc0b0d869e9a14bbfafcbb84e294a13383e6fa6Erik Språng    EXPECT_TRUE(sr.WithReportBlock(rb));
114c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  }
115c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rb.To(kRemoteSsrc + kMaxReportBlocks);
116bdc0b0d869e9a14bbfafcbb84e294a13383e6fa6Erik Språng  EXPECT_FALSE(sr.WithReportBlock(rb));
117c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng}
118c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
1194b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, AppWithNoData) {
1204b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  App app;
1214b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithSubType(30);
1224b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  uint32_t name = 'n' << 24;
1234b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'a' << 16;
1244b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'm' << 8;
1254b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'e';
1264b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithName(name);
1274b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
128c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(app.Build());
1294b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
130c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
1314b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app()->num_packets());
1324b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(30U, parser.app()->SubType());
1334b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(name, parser.app()->Name());
1344b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, parser.app_item()->num_packets());
1354b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1364b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1374b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, App) {
1384b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  App app;
1394b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.From(kSenderSsrc);
1404b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithSubType(30);
1414b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  uint32_t name = 'n' << 24;
1424b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'a' << 16;
1434b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'm' << 8;
1444b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  name += 'e';
1454b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithName(name);
1464b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
1474b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kDataLength = sizeof(kData) / sizeof(kData[0]);
1484b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  app.WithData((const uint8_t*)kData, kDataLength);
1494b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
150c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(app.Build());
1514b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
152c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
1534b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app()->num_packets());
1544b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(30U, parser.app()->SubType());
1554b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(name, parser.app()->Name());
1564b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.app_item()->num_packets());
1574b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kDataLength, parser.app_item()->DataLength());
1584b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(0, strncmp(kData, (const char*)parser.app_item()->Data(),
1594b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org      parser.app_item()->DataLength()));
1604b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1614b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1624b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, SdesWithOneChunk) {
1634b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
164c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "alice@host"));
1654b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
166c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(sdes.Build());
1674b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
168c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
1694b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
1704b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
1714b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
1724b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("alice@host", parser.sdes_chunk()->Cname());
1734b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1744b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
1754b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, SdesWithMultipleChunks) {
1764b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
177c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "a"));
178c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 1, "ab"));
179c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 2, "abc"));
180c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 3, "abcd"));
181c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 4, "abcde"));
182c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 5, "abcdef"));
183c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
184c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(sdes.Build());
1854b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
186c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
1874b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
1884b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(6, parser.sdes_chunk()->num_packets());
1894b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc + 5, parser.sdes_chunk()->Ssrc());
1904b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("abcdef", parser.sdes_chunk()->Cname());
1914b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
1924b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
193c1b9d4e686c184e4b1779d442d447128477d3b8bErik SprångTEST(RtcpPacketTest, SdesWithTooManyChunks) {
194c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  Sdes sdes;
195c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  const int kMaxChunks = (1 << 5) - 1;
196c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  for (int i = 0; i < kMaxChunks; ++i) {
197c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    uint32_t ssrc = kSenderSsrc + i;
198c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    std::ostringstream oss;
199c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    oss << "cname" << i;
200c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    EXPECT_TRUE(sdes.WithCName(ssrc, oss.str()));
201c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  }
202c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_FALSE(sdes.WithCName(kSenderSsrc + kMaxChunks, "foo"));
203c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng}
204c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
2054b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.orgTEST(RtcpPacketTest, CnameItemWithEmptyString) {
2064b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  Sdes sdes;
207c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(sdes.WithCName(kSenderSsrc, ""));
2084b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
209c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(sdes.Build());
2104b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  RtcpPacketParser parser;
211c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
2124b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes()->num_packets());
2134b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
2144b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
2154b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  EXPECT_EQ("", parser.sdes_chunk()->Cname());
2164b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org}
2174b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org
218a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, Rpsi) {
219a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
220a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1000001 (7 bits = 1 byte in native string).
221a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x41;
222a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 1;
223a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPayloadType(100);
224a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
225a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
226c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
227a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
228c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
229a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(100, parser.rpsi()->PayloadType());
230a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
231a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
232a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
233a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
234a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithTwoByteNativeString) {
235a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
236a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // |1 0000001 (7 bits = 1 byte in native string).
237a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x81;
238a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 2;
239a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
240a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
241c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
242a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
243c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
244a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
245a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
246a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
247a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
248a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithThreeByteNativeString) {
249a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
250a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string).
251a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x102040;
252a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 3;
253a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
254a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
255c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
256a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
257c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
258a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
259a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
260a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
261a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
262a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithFourByteNativeString) {
263a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
264a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string).
265a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0x84161C2;
266a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 4;
267a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
268a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
269c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
270a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
271c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
272a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
273a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
274a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
275a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
276a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.orgTEST(RtcpPacketTest, RpsiWithMaxPictureId) {
277a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  Rpsi rpsi;
278a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111|
279a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  // 11 111111|1 1111111 (7 bits = 1 byte in native string).
280a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint64_t kPictureId = 0xffffffffffffffff;
281a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  const uint16_t kNumberOfValidBytes = 10;
282a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  rpsi.WithPictureId(kPictureId);
283a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
284c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
285a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  RtcpPacketParser parser;
286c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
287a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
288a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org  EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
289a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org}
290a826006132b3606b7325befcbffd608df6714f6casapersson@webrtc.org
2910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, Fir) {
2920f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  Fir fir;
2930f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.From(kSenderSsrc);
2940f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.To(kRemoteSsrc);
2950f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  fir.WithCommandSeqNum(123);
2960f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
297c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(fir.Build());
2980f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  RtcpPacketParser parser;
299c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
3000f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir()->num_packets());
3010f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc());
3020f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(1, parser.fir_item()->num_packets());
3030f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc());
3040f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  EXPECT_EQ(123U, parser.fir_item()->SeqNum());
3050f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
3060f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
3070f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.orgTEST(RtcpPacketTest, BuildWithTooSmallBuffer) {
3080f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReportBlock rb;
3090f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  ReceiverReport rr;
3100f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  rr.From(kSenderSsrc);
311bdc0b0d869e9a14bbfafcbb84e294a13383e6fa6Erik Språng  EXPECT_TRUE(rr.WithReportBlock(rb));
3120f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
3134b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kRrLength = 8;
3144b12d400089f324293b8c313ba8257d9247e9cc6asapersson@webrtc.org  const size_t kReportBlockLength = 24;
3150f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
3160f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org  // No packet.
317c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
318c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    void OnPacketReady(uint8_t* data, size_t length) override {
319c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng      ADD_FAILURE() << "Packet should not fit within max size.";
320c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    }
321c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  } verifier;
322c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  const size_t kBufferSize = kRrLength + kReportBlockLength - 1;
323c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  uint8_t buffer[kBufferSize];
324c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_FALSE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier));
3250f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}
3260f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org
3273b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, Remb) {
3283b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Remb remb;
3293b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.From(kSenderSsrc);
3303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.AppliesTo(kRemoteSsrc);
3313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.AppliesTo(kRemoteSsrc + 1);
3323b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.AppliesTo(kRemoteSsrc + 2);
3333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  remb.WithBitrateBps(261011);
3343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
335c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(remb.Build());
3363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
337c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
3383b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.psfb_app()->num_packets());
3393b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.psfb_app()->Ssrc());
3403b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.remb_item()->num_packets());
3413b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(261011, parser.remb_item()->last_bitrate_bps());
3423b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  std::vector<uint32_t> ssrcs = parser.remb_item()->last_ssrc_list();
3433b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, ssrcs[0]);
3443b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc + 1, ssrcs[1]);
3453b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc + 2, ssrcs[2]);
3463b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
3473b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
3483b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithNoReportBlocks) {
3493b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
3503b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
3513b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
352c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
3533b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
354c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
3553b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
3563b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
3573b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
3583b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
3593b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithRrtr) {
3603b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr;
361fc47ed6c0524d7ee0bc7947f0ad65fcefda34a29Danil Chapovalov  rrtr.WithNtp(NtpTime(0x11111111, 0x22222222));
3623b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
3633b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
364c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithRrtr(&rrtr));
3653b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
366c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
3673b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
368c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
3693b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
3703b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
3713b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.rrtr()->num_packets());
3723b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec());
3733b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac());
3743b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
3753b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
3763b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithTwoRrtrBlocks) {
3773b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr1;
378fc47ed6c0524d7ee0bc7947f0ad65fcefda34a29Danil Chapovalov  rrtr1.WithNtp(NtpTime(0x11111111, 0x22222222));
3793b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr2;
380fc47ed6c0524d7ee0bc7947f0ad65fcefda34a29Danil Chapovalov  rrtr2.WithNtp(NtpTime(0x33333333, 0x44444444));
3813b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
3823b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
383c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithRrtr(&rrtr1));
384c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithRrtr(&rrtr2));
3853b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
386c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
3873b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
388c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
3893b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
3903b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
3913b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.rrtr()->num_packets());
3923b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec());
3933b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac());
3943b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
3953b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
3963b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithDlrrWithOneSubBlock) {
3973b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
398c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333));
3993b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
4003b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
401c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithDlrr(&dlrr));
4023b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
403c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
4043b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
405c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
4063b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
4073b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
4083b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr()->num_packets());
4093b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr_items()->num_packets());
4103b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
4113b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
4123b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
4133b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
4143b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
4153b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithDlrrWithTwoSubBlocks) {
4163b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
417c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333));
418c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666));
4193b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
4203b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
421c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithDlrr(&dlrr));
4223b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
423c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
4243b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
425c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
4263b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
4273b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
4283b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr()->num_packets());
4293b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.dlrr_items()->num_packets());
4303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
4313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
4323b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
4333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1));
4343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1));
4353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1));
4363b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
4373b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
438c1b9d4e686c184e4b1779d442d447128477d3b8bErik SprångTEST(RtcpPacketTest, DlrrWithTooManySubBlocks) {
439c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  const int kMaxItems = 100;
440c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  Dlrr dlrr;
441c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  for (int i = 0; i < kMaxItems; ++i)
442c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    EXPECT_TRUE(dlrr.WithDlrrItem(i, i, i));
443c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_FALSE(dlrr.WithDlrrItem(kMaxItems, kMaxItems, kMaxItems));
444c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng}
445c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
4463b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithTwoDlrrBlocks) {
4473b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr1;
448c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333));
4493b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr2;
450c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666));
4513b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
4523b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
453c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithDlrr(&dlrr1));
454c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithDlrr(&dlrr2));
4553b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
456c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
4573b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
458c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
4593b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
4603b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
4613b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.dlrr()->num_packets());
4623b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.dlrr_items()->num_packets());
4633b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
4643b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
4653b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
4663b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1));
4673b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1));
4683b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1));
4693b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
4703b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
4713b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithVoipMetric) {
47291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  RTCPVoIPMetric metric;
47391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.lossRate = 1;
47491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.discardRate = 2;
47591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.burstDensity = 3;
47691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.gapDensity = 4;
47791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.burstDuration = 0x1111;
47891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.gapDuration = 0x2222;
47991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.roundTripDelay = 0x3333;
48091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.endSystemDelay = 0x4444;
48191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.signalLevel = 5;
48291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.noiseLevel = 6;
48391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.RERL = 7;
48491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.Gmin = 8;
48591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.Rfactor = 9;
48691941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.extRfactor = 10;
48791941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.MOSLQ = 11;
48891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.MOSCQ = 12;
48991941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.RXconfig = 13;
49091941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.JBnominal = 0x5555;
49191941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.JBmax = 0x6666;
49291941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric.JBabsMax = 0x7777;
49391941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  VoipMetric metric_block;
49491941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric_block.To(kRemoteSsrc);
49591941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  metric_block.WithVoipMetric(metric);
4963b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
4973b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
49891941ae493cb37a4e1250c7d3aad1c7394b5850edanilchap  EXPECT_TRUE(xr.WithVoipMetric(&metric_block));
4993b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
500c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
5013b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
502c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
5033b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
5043b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
5053b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->num_packets());
5063b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc());
5073b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->LossRate());
5083b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(2, parser.voip_metric()->DiscardRate());
5093b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(3, parser.voip_metric()->BurstDensity());
5103b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(4, parser.voip_metric()->GapDensity());
5113b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration());
5123b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration());
5133b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay());
5143b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay());
5153b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(5, parser.voip_metric()->SignalLevel());
5163b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(6, parser.voip_metric()->NoiseLevel());
5173b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(7, parser.voip_metric()->Rerl());
5183b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(8, parser.voip_metric()->Gmin());
5193b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(9, parser.voip_metric()->Rfactor());
5203b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(10, parser.voip_metric()->ExtRfactor());
5213b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(11, parser.voip_metric()->MosLq());
5223b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(12, parser.voip_metric()->MosCq());
5233b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(13, parser.voip_metric()->RxConfig());
5243b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal());
5253b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x6666, parser.voip_metric()->JbMax());
5263b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax());
5273b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
5283b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
5293b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, XrWithMultipleReportBlocks) {
5303b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr;
5313b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
532c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(dlrr.WithDlrrItem(1, 2, 3));
5333b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  VoipMetric metric;
5343b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
5353b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
536c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithRrtr(&rrtr));
537c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithDlrr(&dlrr));
538c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithVoipMetric(&metric));
5393b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
540c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
5413b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
542c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
5433b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
5443b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
5453b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.rrtr()->num_packets());
5463b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr()->num_packets());
5473b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.dlrr_items()->num_packets());
5483b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->num_packets());
5493b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
5503b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
5513b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.orgTEST(RtcpPacketTest, DlrrWithoutItemNotIncludedInPacket) {
5523b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Rrtr rrtr;
5533b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Dlrr dlrr;
5543b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  VoipMetric metric;
5553b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  Xr xr;
5563b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  xr.From(kSenderSsrc);
557c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithRrtr(&rrtr));
558c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithDlrr(&dlrr));
559c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_TRUE(xr.WithVoipMetric(&metric));
5603b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org
561c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  rtc::scoped_ptr<RawPacket> packet(xr.Build());
5623b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  RtcpPacketParser parser;
563c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  parser.Parse(packet->Buffer(), packet->Length());
5643b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.xr_header()->num_packets());
5653b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
5663b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.rrtr()->num_packets());
5673b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(0, parser.dlrr()->num_packets());
5683b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org  EXPECT_EQ(1, parser.voip_metric()->num_packets());
5693b84b3a58cf4093204749fa7ba782f49b8934246asapersson@webrtc.org}
570c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
571c1b9d4e686c184e4b1779d442d447128477d3b8bErik SprångTEST(RtcpPacketTest, XrWithTooManyBlocks) {
572c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  const int kMaxBlocks = 50;
573c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  Xr xr;
574c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
575c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  Rrtr rrtr;
576c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  for (int i = 0; i < kMaxBlocks; ++i)
577c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    EXPECT_TRUE(xr.WithRrtr(&rrtr));
578c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_FALSE(xr.WithRrtr(&rrtr));
579c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
580c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  Dlrr dlrr;
581c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  for (int i = 0; i < kMaxBlocks; ++i)
582c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    EXPECT_TRUE(xr.WithDlrr(&dlrr));
583c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_FALSE(xr.WithDlrr(&dlrr));
584c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng
585c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  VoipMetric voip_metric;
586c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  for (int i = 0; i < kMaxBlocks; ++i)
587c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng    EXPECT_TRUE(xr.WithVoipMetric(&voip_metric));
588c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng  EXPECT_FALSE(xr.WithVoipMetric(&voip_metric));
589c1b9d4e686c184e4b1779d442d447128477d3b8bErik Språng}
590a3b8769860bdb0a45dbff6d1e0092486fa59aaa4Erik Språng
5910f2809a5ac5477a6134ebafb4680597252f8a5c5asapersson@webrtc.org}  // namespace webrtc
592