Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  *
     10  * This file includes unit tests for the RtcpPacket.
     11  */
     12 
     13 #include "testing/gmock/include/gmock/gmock.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
     17 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
     18 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
     19 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
     20 #include "webrtc/test/rtcp_packet_parser.h"
     21 
     22 using ::testing::ElementsAre;
     23 
     24 using webrtc::rtcp::App;
     25 using webrtc::rtcp::Bye;
     26 using webrtc::rtcp::Dlrr;
     27 using webrtc::rtcp::Fir;
     28 using webrtc::rtcp::RawPacket;
     29 using webrtc::rtcp::ReceiverReport;
     30 using webrtc::rtcp::Remb;
     31 using webrtc::rtcp::ReportBlock;
     32 using webrtc::rtcp::Rpsi;
     33 using webrtc::rtcp::Rrtr;
     34 using webrtc::rtcp::Sdes;
     35 using webrtc::rtcp::SenderReport;
     36 using webrtc::rtcp::VoipMetric;
     37 using webrtc::rtcp::Xr;
     38 using webrtc::test::RtcpPacketParser;
     39 
     40 namespace webrtc {
     41 
     42 const uint32_t kSenderSsrc = 0x12345678;
     43 const uint32_t kRemoteSsrc = 0x23456789;
     44 
     45 TEST(RtcpPacketTest, Sr) {
     46   SenderReport sr;
     47   sr.From(kSenderSsrc);
     48   sr.WithNtpSec(0x11111111);
     49   sr.WithNtpFrac(0x22222222);
     50   sr.WithRtpTimestamp(0x33333333);
     51   sr.WithPacketCount(0x44444444);
     52   sr.WithOctetCount(0x55555555);
     53 
     54   rtc::scoped_ptr<RawPacket> packet(sr.Build());
     55   RtcpPacketParser parser;
     56   parser.Parse(packet->Buffer(), packet->Length());
     57 
     58   EXPECT_EQ(1, parser.sender_report()->num_packets());
     59   EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
     60   EXPECT_EQ(0x11111111U, parser.sender_report()->NtpSec());
     61   EXPECT_EQ(0x22222222U, parser.sender_report()->NtpFrac());
     62   EXPECT_EQ(0x33333333U, parser.sender_report()->RtpTimestamp());
     63   EXPECT_EQ(0x44444444U, parser.sender_report()->PacketCount());
     64   EXPECT_EQ(0x55555555U, parser.sender_report()->OctetCount());
     65   EXPECT_EQ(0, parser.report_block()->num_packets());
     66 }
     67 
     68 TEST(RtcpPacketTest, SrWithOneReportBlock) {
     69   ReportBlock rb;
     70   rb.To(kRemoteSsrc);
     71 
     72   SenderReport sr;
     73   sr.From(kSenderSsrc);
     74   EXPECT_TRUE(sr.WithReportBlock(rb));
     75 
     76   rtc::scoped_ptr<RawPacket> packet(sr.Build());
     77   RtcpPacketParser parser;
     78   parser.Parse(packet->Buffer(), packet->Length());
     79   EXPECT_EQ(1, parser.sender_report()->num_packets());
     80   EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
     81   EXPECT_EQ(1, parser.report_block()->num_packets());
     82   EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc());
     83 }
     84 
     85 TEST(RtcpPacketTest, SrWithTwoReportBlocks) {
     86   ReportBlock rb1;
     87   rb1.To(kRemoteSsrc);
     88   ReportBlock rb2;
     89   rb2.To(kRemoteSsrc + 1);
     90 
     91   SenderReport sr;
     92   sr.From(kSenderSsrc);
     93   EXPECT_TRUE(sr.WithReportBlock(rb1));
     94   EXPECT_TRUE(sr.WithReportBlock(rb2));
     95 
     96   rtc::scoped_ptr<RawPacket> packet(sr.Build());
     97   RtcpPacketParser parser;
     98   parser.Parse(packet->Buffer(), packet->Length());
     99   EXPECT_EQ(1, parser.sender_report()->num_packets());
    100   EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc());
    101   EXPECT_EQ(2, parser.report_block()->num_packets());
    102   EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc));
    103   EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1));
    104 }
    105 
    106 TEST(RtcpPacketTest, SrWithTooManyReportBlocks) {
    107   SenderReport sr;
    108   sr.From(kSenderSsrc);
    109   const int kMaxReportBlocks = (1 << 5) - 1;
    110   ReportBlock rb;
    111   for (int i = 0; i < kMaxReportBlocks; ++i) {
    112     rb.To(kRemoteSsrc + i);
    113     EXPECT_TRUE(sr.WithReportBlock(rb));
    114   }
    115   rb.To(kRemoteSsrc + kMaxReportBlocks);
    116   EXPECT_FALSE(sr.WithReportBlock(rb));
    117 }
    118 
    119 TEST(RtcpPacketTest, AppWithNoData) {
    120   App app;
    121   app.WithSubType(30);
    122   uint32_t name = 'n' << 24;
    123   name += 'a' << 16;
    124   name += 'm' << 8;
    125   name += 'e';
    126   app.WithName(name);
    127 
    128   rtc::scoped_ptr<RawPacket> packet(app.Build());
    129   RtcpPacketParser parser;
    130   parser.Parse(packet->Buffer(), packet->Length());
    131   EXPECT_EQ(1, parser.app()->num_packets());
    132   EXPECT_EQ(30U, parser.app()->SubType());
    133   EXPECT_EQ(name, parser.app()->Name());
    134   EXPECT_EQ(0, parser.app_item()->num_packets());
    135 }
    136 
    137 TEST(RtcpPacketTest, App) {
    138   App app;
    139   app.From(kSenderSsrc);
    140   app.WithSubType(30);
    141   uint32_t name = 'n' << 24;
    142   name += 'a' << 16;
    143   name += 'm' << 8;
    144   name += 'e';
    145   app.WithName(name);
    146   const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
    147   const size_t kDataLength = sizeof(kData) / sizeof(kData[0]);
    148   app.WithData((const uint8_t*)kData, kDataLength);
    149 
    150   rtc::scoped_ptr<RawPacket> packet(app.Build());
    151   RtcpPacketParser parser;
    152   parser.Parse(packet->Buffer(), packet->Length());
    153   EXPECT_EQ(1, parser.app()->num_packets());
    154   EXPECT_EQ(30U, parser.app()->SubType());
    155   EXPECT_EQ(name, parser.app()->Name());
    156   EXPECT_EQ(1, parser.app_item()->num_packets());
    157   EXPECT_EQ(kDataLength, parser.app_item()->DataLength());
    158   EXPECT_EQ(0, strncmp(kData, (const char*)parser.app_item()->Data(),
    159       parser.app_item()->DataLength()));
    160 }
    161 
    162 TEST(RtcpPacketTest, SdesWithOneChunk) {
    163   Sdes sdes;
    164   EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "alice@host"));
    165 
    166   rtc::scoped_ptr<RawPacket> packet(sdes.Build());
    167   RtcpPacketParser parser;
    168   parser.Parse(packet->Buffer(), packet->Length());
    169   EXPECT_EQ(1, parser.sdes()->num_packets());
    170   EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
    171   EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
    172   EXPECT_EQ("alice@host", parser.sdes_chunk()->Cname());
    173 }
    174 
    175 TEST(RtcpPacketTest, SdesWithMultipleChunks) {
    176   Sdes sdes;
    177   EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "a"));
    178   EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 1, "ab"));
    179   EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 2, "abc"));
    180   EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 3, "abcd"));
    181   EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 4, "abcde"));
    182   EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 5, "abcdef"));
    183 
    184   rtc::scoped_ptr<RawPacket> packet(sdes.Build());
    185   RtcpPacketParser parser;
    186   parser.Parse(packet->Buffer(), packet->Length());
    187   EXPECT_EQ(1, parser.sdes()->num_packets());
    188   EXPECT_EQ(6, parser.sdes_chunk()->num_packets());
    189   EXPECT_EQ(kSenderSsrc + 5, parser.sdes_chunk()->Ssrc());
    190   EXPECT_EQ("abcdef", parser.sdes_chunk()->Cname());
    191 }
    192 
    193 TEST(RtcpPacketTest, SdesWithTooManyChunks) {
    194   Sdes sdes;
    195   const int kMaxChunks = (1 << 5) - 1;
    196   for (int i = 0; i < kMaxChunks; ++i) {
    197     uint32_t ssrc = kSenderSsrc + i;
    198     std::ostringstream oss;
    199     oss << "cname" << i;
    200     EXPECT_TRUE(sdes.WithCName(ssrc, oss.str()));
    201   }
    202   EXPECT_FALSE(sdes.WithCName(kSenderSsrc + kMaxChunks, "foo"));
    203 }
    204 
    205 TEST(RtcpPacketTest, CnameItemWithEmptyString) {
    206   Sdes sdes;
    207   EXPECT_TRUE(sdes.WithCName(kSenderSsrc, ""));
    208 
    209   rtc::scoped_ptr<RawPacket> packet(sdes.Build());
    210   RtcpPacketParser parser;
    211   parser.Parse(packet->Buffer(), packet->Length());
    212   EXPECT_EQ(1, parser.sdes()->num_packets());
    213   EXPECT_EQ(1, parser.sdes_chunk()->num_packets());
    214   EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc());
    215   EXPECT_EQ("", parser.sdes_chunk()->Cname());
    216 }
    217 
    218 TEST(RtcpPacketTest, Rpsi) {
    219   Rpsi rpsi;
    220   // 1000001 (7 bits = 1 byte in native string).
    221   const uint64_t kPictureId = 0x41;
    222   const uint16_t kNumberOfValidBytes = 1;
    223   rpsi.WithPayloadType(100);
    224   rpsi.WithPictureId(kPictureId);
    225 
    226   rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
    227   RtcpPacketParser parser;
    228   parser.Parse(packet->Buffer(), packet->Length());
    229   EXPECT_EQ(100, parser.rpsi()->PayloadType());
    230   EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
    231   EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
    232 }
    233 
    234 TEST(RtcpPacketTest, RpsiWithTwoByteNativeString) {
    235   Rpsi rpsi;
    236   // |1 0000001 (7 bits = 1 byte in native string).
    237   const uint64_t kPictureId = 0x81;
    238   const uint16_t kNumberOfValidBytes = 2;
    239   rpsi.WithPictureId(kPictureId);
    240 
    241   rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
    242   RtcpPacketParser parser;
    243   parser.Parse(packet->Buffer(), packet->Length());
    244   EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
    245   EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
    246 }
    247 
    248 TEST(RtcpPacketTest, RpsiWithThreeByteNativeString) {
    249   Rpsi rpsi;
    250   // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string).
    251   const uint64_t kPictureId = 0x102040;
    252   const uint16_t kNumberOfValidBytes = 3;
    253   rpsi.WithPictureId(kPictureId);
    254 
    255   rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
    256   RtcpPacketParser parser;
    257   parser.Parse(packet->Buffer(), packet->Length());
    258   EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
    259   EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
    260 }
    261 
    262 TEST(RtcpPacketTest, RpsiWithFourByteNativeString) {
    263   Rpsi rpsi;
    264   // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string).
    265   const uint64_t kPictureId = 0x84161C2;
    266   const uint16_t kNumberOfValidBytes = 4;
    267   rpsi.WithPictureId(kPictureId);
    268 
    269   rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
    270   RtcpPacketParser parser;
    271   parser.Parse(packet->Buffer(), packet->Length());
    272   EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
    273   EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
    274 }
    275 
    276 TEST(RtcpPacketTest, RpsiWithMaxPictureId) {
    277   Rpsi rpsi;
    278   // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111|
    279   // 11 111111|1 1111111 (7 bits = 1 byte in native string).
    280   const uint64_t kPictureId = 0xffffffffffffffff;
    281   const uint16_t kNumberOfValidBytes = 10;
    282   rpsi.WithPictureId(kPictureId);
    283 
    284   rtc::scoped_ptr<RawPacket> packet(rpsi.Build());
    285   RtcpPacketParser parser;
    286   parser.Parse(packet->Buffer(), packet->Length());
    287   EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits());
    288   EXPECT_EQ(kPictureId, parser.rpsi()->PictureId());
    289 }
    290 
    291 TEST(RtcpPacketTest, Fir) {
    292   Fir fir;
    293   fir.From(kSenderSsrc);
    294   fir.To(kRemoteSsrc);
    295   fir.WithCommandSeqNum(123);
    296 
    297   rtc::scoped_ptr<RawPacket> packet(fir.Build());
    298   RtcpPacketParser parser;
    299   parser.Parse(packet->Buffer(), packet->Length());
    300   EXPECT_EQ(1, parser.fir()->num_packets());
    301   EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc());
    302   EXPECT_EQ(1, parser.fir_item()->num_packets());
    303   EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc());
    304   EXPECT_EQ(123U, parser.fir_item()->SeqNum());
    305 }
    306 
    307 TEST(RtcpPacketTest, BuildWithTooSmallBuffer) {
    308   ReportBlock rb;
    309   ReceiverReport rr;
    310   rr.From(kSenderSsrc);
    311   EXPECT_TRUE(rr.WithReportBlock(rb));
    312 
    313   const size_t kRrLength = 8;
    314   const size_t kReportBlockLength = 24;
    315 
    316   // No packet.
    317   class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
    318     void OnPacketReady(uint8_t* data, size_t length) override {
    319       ADD_FAILURE() << "Packet should not fit within max size.";
    320     }
    321   } verifier;
    322   const size_t kBufferSize = kRrLength + kReportBlockLength - 1;
    323   uint8_t buffer[kBufferSize];
    324   EXPECT_FALSE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier));
    325 }
    326 
    327 TEST(RtcpPacketTest, Remb) {
    328   Remb remb;
    329   remb.From(kSenderSsrc);
    330   remb.AppliesTo(kRemoteSsrc);
    331   remb.AppliesTo(kRemoteSsrc + 1);
    332   remb.AppliesTo(kRemoteSsrc + 2);
    333   remb.WithBitrateBps(261011);
    334 
    335   rtc::scoped_ptr<RawPacket> packet(remb.Build());
    336   RtcpPacketParser parser;
    337   parser.Parse(packet->Buffer(), packet->Length());
    338   EXPECT_EQ(1, parser.psfb_app()->num_packets());
    339   EXPECT_EQ(kSenderSsrc, parser.psfb_app()->Ssrc());
    340   EXPECT_EQ(1, parser.remb_item()->num_packets());
    341   EXPECT_EQ(261011, parser.remb_item()->last_bitrate_bps());
    342   std::vector<uint32_t> ssrcs = parser.remb_item()->last_ssrc_list();
    343   EXPECT_EQ(kRemoteSsrc, ssrcs[0]);
    344   EXPECT_EQ(kRemoteSsrc + 1, ssrcs[1]);
    345   EXPECT_EQ(kRemoteSsrc + 2, ssrcs[2]);
    346 }
    347 
    348 TEST(RtcpPacketTest, XrWithNoReportBlocks) {
    349   Xr xr;
    350   xr.From(kSenderSsrc);
    351 
    352   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    353   RtcpPacketParser parser;
    354   parser.Parse(packet->Buffer(), packet->Length());
    355   EXPECT_EQ(1, parser.xr_header()->num_packets());
    356   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    357 }
    358 
    359 TEST(RtcpPacketTest, XrWithRrtr) {
    360   Rrtr rrtr;
    361   rrtr.WithNtp(NtpTime(0x11111111, 0x22222222));
    362   Xr xr;
    363   xr.From(kSenderSsrc);
    364   EXPECT_TRUE(xr.WithRrtr(&rrtr));
    365 
    366   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    367   RtcpPacketParser parser;
    368   parser.Parse(packet->Buffer(), packet->Length());
    369   EXPECT_EQ(1, parser.xr_header()->num_packets());
    370   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    371   EXPECT_EQ(1, parser.rrtr()->num_packets());
    372   EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec());
    373   EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac());
    374 }
    375 
    376 TEST(RtcpPacketTest, XrWithTwoRrtrBlocks) {
    377   Rrtr rrtr1;
    378   rrtr1.WithNtp(NtpTime(0x11111111, 0x22222222));
    379   Rrtr rrtr2;
    380   rrtr2.WithNtp(NtpTime(0x33333333, 0x44444444));
    381   Xr xr;
    382   xr.From(kSenderSsrc);
    383   EXPECT_TRUE(xr.WithRrtr(&rrtr1));
    384   EXPECT_TRUE(xr.WithRrtr(&rrtr2));
    385 
    386   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    387   RtcpPacketParser parser;
    388   parser.Parse(packet->Buffer(), packet->Length());
    389   EXPECT_EQ(1, parser.xr_header()->num_packets());
    390   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    391   EXPECT_EQ(2, parser.rrtr()->num_packets());
    392   EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec());
    393   EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac());
    394 }
    395 
    396 TEST(RtcpPacketTest, XrWithDlrrWithOneSubBlock) {
    397   Dlrr dlrr;
    398   EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333));
    399   Xr xr;
    400   xr.From(kSenderSsrc);
    401   EXPECT_TRUE(xr.WithDlrr(&dlrr));
    402 
    403   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    404   RtcpPacketParser parser;
    405   parser.Parse(packet->Buffer(), packet->Length());
    406   EXPECT_EQ(1, parser.xr_header()->num_packets());
    407   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    408   EXPECT_EQ(1, parser.dlrr()->num_packets());
    409   EXPECT_EQ(1, parser.dlrr_items()->num_packets());
    410   EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
    411   EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
    412   EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
    413 }
    414 
    415 TEST(RtcpPacketTest, XrWithDlrrWithTwoSubBlocks) {
    416   Dlrr dlrr;
    417   EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333));
    418   EXPECT_TRUE(dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666));
    419   Xr xr;
    420   xr.From(kSenderSsrc);
    421   EXPECT_TRUE(xr.WithDlrr(&dlrr));
    422 
    423   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    424   RtcpPacketParser parser;
    425   parser.Parse(packet->Buffer(), packet->Length());
    426   EXPECT_EQ(1, parser.xr_header()->num_packets());
    427   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    428   EXPECT_EQ(1, parser.dlrr()->num_packets());
    429   EXPECT_EQ(2, parser.dlrr_items()->num_packets());
    430   EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
    431   EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
    432   EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
    433   EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1));
    434   EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1));
    435   EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1));
    436 }
    437 
    438 TEST(RtcpPacketTest, DlrrWithTooManySubBlocks) {
    439   const int kMaxItems = 100;
    440   Dlrr dlrr;
    441   for (int i = 0; i < kMaxItems; ++i)
    442     EXPECT_TRUE(dlrr.WithDlrrItem(i, i, i));
    443   EXPECT_FALSE(dlrr.WithDlrrItem(kMaxItems, kMaxItems, kMaxItems));
    444 }
    445 
    446 TEST(RtcpPacketTest, XrWithTwoDlrrBlocks) {
    447   Dlrr dlrr1;
    448   EXPECT_TRUE(dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333));
    449   Dlrr dlrr2;
    450   EXPECT_TRUE(dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666));
    451   Xr xr;
    452   xr.From(kSenderSsrc);
    453   EXPECT_TRUE(xr.WithDlrr(&dlrr1));
    454   EXPECT_TRUE(xr.WithDlrr(&dlrr2));
    455 
    456   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    457   RtcpPacketParser parser;
    458   parser.Parse(packet->Buffer(), packet->Length());
    459   EXPECT_EQ(1, parser.xr_header()->num_packets());
    460   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    461   EXPECT_EQ(2, parser.dlrr()->num_packets());
    462   EXPECT_EQ(2, parser.dlrr_items()->num_packets());
    463   EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0));
    464   EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0));
    465   EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0));
    466   EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1));
    467   EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1));
    468   EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1));
    469 }
    470 
    471 TEST(RtcpPacketTest, XrWithVoipMetric) {
    472   RTCPVoIPMetric metric;
    473   metric.lossRate = 1;
    474   metric.discardRate = 2;
    475   metric.burstDensity = 3;
    476   metric.gapDensity = 4;
    477   metric.burstDuration = 0x1111;
    478   metric.gapDuration = 0x2222;
    479   metric.roundTripDelay = 0x3333;
    480   metric.endSystemDelay = 0x4444;
    481   metric.signalLevel = 5;
    482   metric.noiseLevel = 6;
    483   metric.RERL = 7;
    484   metric.Gmin = 8;
    485   metric.Rfactor = 9;
    486   metric.extRfactor = 10;
    487   metric.MOSLQ = 11;
    488   metric.MOSCQ = 12;
    489   metric.RXconfig = 13;
    490   metric.JBnominal = 0x5555;
    491   metric.JBmax = 0x6666;
    492   metric.JBabsMax = 0x7777;
    493   VoipMetric metric_block;
    494   metric_block.To(kRemoteSsrc);
    495   metric_block.WithVoipMetric(metric);
    496   Xr xr;
    497   xr.From(kSenderSsrc);
    498   EXPECT_TRUE(xr.WithVoipMetric(&metric_block));
    499 
    500   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    501   RtcpPacketParser parser;
    502   parser.Parse(packet->Buffer(), packet->Length());
    503   EXPECT_EQ(1, parser.xr_header()->num_packets());
    504   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    505   EXPECT_EQ(1, parser.voip_metric()->num_packets());
    506   EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc());
    507   EXPECT_EQ(1, parser.voip_metric()->LossRate());
    508   EXPECT_EQ(2, parser.voip_metric()->DiscardRate());
    509   EXPECT_EQ(3, parser.voip_metric()->BurstDensity());
    510   EXPECT_EQ(4, parser.voip_metric()->GapDensity());
    511   EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration());
    512   EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration());
    513   EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay());
    514   EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay());
    515   EXPECT_EQ(5, parser.voip_metric()->SignalLevel());
    516   EXPECT_EQ(6, parser.voip_metric()->NoiseLevel());
    517   EXPECT_EQ(7, parser.voip_metric()->Rerl());
    518   EXPECT_EQ(8, parser.voip_metric()->Gmin());
    519   EXPECT_EQ(9, parser.voip_metric()->Rfactor());
    520   EXPECT_EQ(10, parser.voip_metric()->ExtRfactor());
    521   EXPECT_EQ(11, parser.voip_metric()->MosLq());
    522   EXPECT_EQ(12, parser.voip_metric()->MosCq());
    523   EXPECT_EQ(13, parser.voip_metric()->RxConfig());
    524   EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal());
    525   EXPECT_EQ(0x6666, parser.voip_metric()->JbMax());
    526   EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax());
    527 }
    528 
    529 TEST(RtcpPacketTest, XrWithMultipleReportBlocks) {
    530   Rrtr rrtr;
    531   Dlrr dlrr;
    532   EXPECT_TRUE(dlrr.WithDlrrItem(1, 2, 3));
    533   VoipMetric metric;
    534   Xr xr;
    535   xr.From(kSenderSsrc);
    536   EXPECT_TRUE(xr.WithRrtr(&rrtr));
    537   EXPECT_TRUE(xr.WithDlrr(&dlrr));
    538   EXPECT_TRUE(xr.WithVoipMetric(&metric));
    539 
    540   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    541   RtcpPacketParser parser;
    542   parser.Parse(packet->Buffer(), packet->Length());
    543   EXPECT_EQ(1, parser.xr_header()->num_packets());
    544   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    545   EXPECT_EQ(1, parser.rrtr()->num_packets());
    546   EXPECT_EQ(1, parser.dlrr()->num_packets());
    547   EXPECT_EQ(1, parser.dlrr_items()->num_packets());
    548   EXPECT_EQ(1, parser.voip_metric()->num_packets());
    549 }
    550 
    551 TEST(RtcpPacketTest, DlrrWithoutItemNotIncludedInPacket) {
    552   Rrtr rrtr;
    553   Dlrr dlrr;
    554   VoipMetric metric;
    555   Xr xr;
    556   xr.From(kSenderSsrc);
    557   EXPECT_TRUE(xr.WithRrtr(&rrtr));
    558   EXPECT_TRUE(xr.WithDlrr(&dlrr));
    559   EXPECT_TRUE(xr.WithVoipMetric(&metric));
    560 
    561   rtc::scoped_ptr<RawPacket> packet(xr.Build());
    562   RtcpPacketParser parser;
    563   parser.Parse(packet->Buffer(), packet->Length());
    564   EXPECT_EQ(1, parser.xr_header()->num_packets());
    565   EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc());
    566   EXPECT_EQ(1, parser.rrtr()->num_packets());
    567   EXPECT_EQ(0, parser.dlrr()->num_packets());
    568   EXPECT_EQ(1, parser.voip_metric()->num_packets());
    569 }
    570 
    571 TEST(RtcpPacketTest, XrWithTooManyBlocks) {
    572   const int kMaxBlocks = 50;
    573   Xr xr;
    574 
    575   Rrtr rrtr;
    576   for (int i = 0; i < kMaxBlocks; ++i)
    577     EXPECT_TRUE(xr.WithRrtr(&rrtr));
    578   EXPECT_FALSE(xr.WithRrtr(&rrtr));
    579 
    580   Dlrr dlrr;
    581   for (int i = 0; i < kMaxBlocks; ++i)
    582     EXPECT_TRUE(xr.WithDlrr(&dlrr));
    583   EXPECT_FALSE(xr.WithDlrr(&dlrr));
    584 
    585   VoipMetric voip_metric;
    586   for (int i = 0; i < kMaxBlocks; ++i)
    587     EXPECT_TRUE(xr.WithVoipMetric(&voip_metric));
    588   EXPECT_FALSE(xr.WithVoipMetric(&voip_metric));
    589 }
    590 
    591 }  // namespace webrtc
    592