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