rtcp_packet_unittest.cc revision a3b8769860bdb0a45dbff6d1e0092486fa59aaa4
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/test/rtcp_packet_parser.h" 18 19using ::testing::ElementsAre; 20 21using webrtc::rtcp::App; 22using webrtc::rtcp::Bye; 23using webrtc::rtcp::Dlrr; 24using webrtc::rtcp::Empty; 25using webrtc::rtcp::Fir; 26using webrtc::rtcp::Ij; 27using webrtc::rtcp::Nack; 28using webrtc::rtcp::Pli; 29using webrtc::rtcp::Sdes; 30using webrtc::rtcp::SenderReport; 31using webrtc::rtcp::Sli; 32using webrtc::rtcp::RawPacket; 33using webrtc::rtcp::ReceiverReport; 34using webrtc::rtcp::Remb; 35using webrtc::rtcp::ReportBlock; 36using webrtc::rtcp::Rpsi; 37using webrtc::rtcp::Rrtr; 38using webrtc::rtcp::SenderReport; 39using webrtc::rtcp::Tmmbn; 40using webrtc::rtcp::Tmmbr; 41using webrtc::rtcp::VoipMetric; 42using webrtc::rtcp::Xr; 43using webrtc::test::RtcpPacketParser; 44 45namespace webrtc { 46 47const uint32_t kSenderSsrc = 0x12345678; 48const uint32_t kRemoteSsrc = 0x23456789; 49 50TEST(RtcpPacketTest, Rr) { 51 ReceiverReport rr; 52 rr.From(kSenderSsrc); 53 54 rtc::scoped_ptr<RawPacket> packet(rr.Build()); 55 RtcpPacketParser parser; 56 parser.Parse(packet->Buffer(), packet->Length()); 57 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 58 EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc()); 59 EXPECT_EQ(0, parser.report_block()->num_packets()); 60} 61 62TEST(RtcpPacketTest, RrWithOneReportBlock) { 63 ReportBlock rb; 64 rb.To(kRemoteSsrc); 65 rb.WithFractionLost(55); 66 rb.WithCumulativeLost(0x111111); 67 rb.WithExtHighestSeqNum(0x22222222); 68 rb.WithJitter(0x33333333); 69 rb.WithLastSr(0x44444444); 70 rb.WithDelayLastSr(0x55555555); 71 72 ReceiverReport rr; 73 rr.From(kSenderSsrc); 74 EXPECT_TRUE(rr.WithReportBlock(rb)); 75 76 rtc::scoped_ptr<RawPacket> packet(rr.Build()); 77 RtcpPacketParser parser; 78 parser.Parse(packet->Buffer(), packet->Length()); 79 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 80 EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc()); 81 EXPECT_EQ(1, parser.report_block()->num_packets()); 82 EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc()); 83 EXPECT_EQ(55U, parser.report_block()->FractionLost()); 84 EXPECT_EQ(0x111111U, parser.report_block()->CumPacketLost()); 85 EXPECT_EQ(0x22222222U, parser.report_block()->ExtHighestSeqNum()); 86 EXPECT_EQ(0x33333333U, parser.report_block()->Jitter()); 87 EXPECT_EQ(0x44444444U, parser.report_block()->LastSr()); 88 EXPECT_EQ(0x55555555U, parser.report_block()->DelayLastSr()); 89} 90 91TEST(RtcpPacketTest, RrWithTwoReportBlocks) { 92 ReportBlock rb1; 93 rb1.To(kRemoteSsrc); 94 ReportBlock rb2; 95 rb2.To(kRemoteSsrc + 1); 96 97 ReceiverReport rr; 98 rr.From(kSenderSsrc); 99 EXPECT_TRUE(rr.WithReportBlock(rb1)); 100 EXPECT_TRUE(rr.WithReportBlock(rb2)); 101 102 rtc::scoped_ptr<RawPacket> packet(rr.Build()); 103 RtcpPacketParser parser; 104 parser.Parse(packet->Buffer(), packet->Length()); 105 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 106 EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc()); 107 EXPECT_EQ(2, parser.report_block()->num_packets()); 108 EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc)); 109 EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1)); 110} 111 112TEST(RtcpPacketTest, RrWithTooManyReportBlocks) { 113 ReceiverReport rr; 114 rr.From(kSenderSsrc); 115 const int kMaxReportBlocks = (1 << 5) - 1; 116 ReportBlock rb; 117 for (int i = 0; i < kMaxReportBlocks; ++i) { 118 rb.To(kRemoteSsrc + i); 119 EXPECT_TRUE(rr.WithReportBlock(rb)); 120 } 121 rb.To(kRemoteSsrc + kMaxReportBlocks); 122 EXPECT_FALSE(rr.WithReportBlock(rb)); 123} 124 125TEST(RtcpPacketTest, Sr) { 126 SenderReport sr; 127 sr.From(kSenderSsrc); 128 sr.WithNtpSec(0x11111111); 129 sr.WithNtpFrac(0x22222222); 130 sr.WithRtpTimestamp(0x33333333); 131 sr.WithPacketCount(0x44444444); 132 sr.WithOctetCount(0x55555555); 133 134 rtc::scoped_ptr<RawPacket> packet(sr.Build()); 135 RtcpPacketParser parser; 136 parser.Parse(packet->Buffer(), packet->Length()); 137 138 EXPECT_EQ(1, parser.sender_report()->num_packets()); 139 EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc()); 140 EXPECT_EQ(0x11111111U, parser.sender_report()->NtpSec()); 141 EXPECT_EQ(0x22222222U, parser.sender_report()->NtpFrac()); 142 EXPECT_EQ(0x33333333U, parser.sender_report()->RtpTimestamp()); 143 EXPECT_EQ(0x44444444U, parser.sender_report()->PacketCount()); 144 EXPECT_EQ(0x55555555U, parser.sender_report()->OctetCount()); 145 EXPECT_EQ(0, parser.report_block()->num_packets()); 146} 147 148TEST(RtcpPacketTest, SrWithOneReportBlock) { 149 ReportBlock rb; 150 rb.To(kRemoteSsrc); 151 152 SenderReport sr; 153 sr.From(kSenderSsrc); 154 EXPECT_TRUE(sr.WithReportBlock(rb)); 155 156 rtc::scoped_ptr<RawPacket> packet(sr.Build()); 157 RtcpPacketParser parser; 158 parser.Parse(packet->Buffer(), packet->Length()); 159 EXPECT_EQ(1, parser.sender_report()->num_packets()); 160 EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc()); 161 EXPECT_EQ(1, parser.report_block()->num_packets()); 162 EXPECT_EQ(kRemoteSsrc, parser.report_block()->Ssrc()); 163} 164 165TEST(RtcpPacketTest, SrWithTwoReportBlocks) { 166 ReportBlock rb1; 167 rb1.To(kRemoteSsrc); 168 ReportBlock rb2; 169 rb2.To(kRemoteSsrc + 1); 170 171 SenderReport sr; 172 sr.From(kSenderSsrc); 173 EXPECT_TRUE(sr.WithReportBlock(rb1)); 174 EXPECT_TRUE(sr.WithReportBlock(rb2)); 175 176 rtc::scoped_ptr<RawPacket> packet(sr.Build()); 177 RtcpPacketParser parser; 178 parser.Parse(packet->Buffer(), packet->Length()); 179 EXPECT_EQ(1, parser.sender_report()->num_packets()); 180 EXPECT_EQ(kSenderSsrc, parser.sender_report()->Ssrc()); 181 EXPECT_EQ(2, parser.report_block()->num_packets()); 182 EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc)); 183 EXPECT_EQ(1, parser.report_blocks_per_ssrc(kRemoteSsrc + 1)); 184} 185 186TEST(RtcpPacketTest, SrWithTooManyReportBlocks) { 187 SenderReport sr; 188 sr.From(kSenderSsrc); 189 const int kMaxReportBlocks = (1 << 5) - 1; 190 ReportBlock rb; 191 for (int i = 0; i < kMaxReportBlocks; ++i) { 192 rb.To(kRemoteSsrc + i); 193 EXPECT_TRUE(sr.WithReportBlock(rb)); 194 } 195 rb.To(kRemoteSsrc + kMaxReportBlocks); 196 EXPECT_FALSE(sr.WithReportBlock(rb)); 197} 198 199TEST(RtcpPacketTest, IjNoItem) { 200 Ij ij; 201 202 rtc::scoped_ptr<RawPacket> packet(ij.Build()); 203 RtcpPacketParser parser; 204 parser.Parse(packet->Buffer(), packet->Length()); 205 EXPECT_EQ(1, parser.ij()->num_packets()); 206 EXPECT_EQ(0, parser.ij_item()->num_packets()); 207} 208 209TEST(RtcpPacketTest, IjOneItem) { 210 Ij ij; 211 EXPECT_TRUE(ij.WithJitterItem(0x11111111)); 212 213 rtc::scoped_ptr<RawPacket> packet(ij.Build()); 214 RtcpPacketParser parser; 215 parser.Parse(packet->Buffer(), packet->Length()); 216 EXPECT_EQ(1, parser.ij()->num_packets()); 217 EXPECT_EQ(1, parser.ij_item()->num_packets()); 218 EXPECT_EQ(0x11111111U, parser.ij_item()->Jitter()); 219} 220 221TEST(RtcpPacketTest, IjTwoItems) { 222 Ij ij; 223 EXPECT_TRUE(ij.WithJitterItem(0x11111111)); 224 EXPECT_TRUE(ij.WithJitterItem(0x22222222)); 225 226 rtc::scoped_ptr<RawPacket> packet(ij.Build()); 227 RtcpPacketParser parser; 228 parser.Parse(packet->Buffer(), packet->Length()); 229 EXPECT_EQ(1, parser.ij()->num_packets()); 230 EXPECT_EQ(2, parser.ij_item()->num_packets()); 231 EXPECT_EQ(0x22222222U, parser.ij_item()->Jitter()); 232} 233 234TEST(RtcpPacketTest, IjTooManyItems) { 235 Ij ij; 236 const int kMaxIjItems = (1 << 5) - 1; 237 for (int i = 0; i < kMaxIjItems; ++i) { 238 EXPECT_TRUE(ij.WithJitterItem(i)); 239 } 240 EXPECT_FALSE(ij.WithJitterItem(kMaxIjItems)); 241} 242 243TEST(RtcpPacketTest, AppWithNoData) { 244 App app; 245 app.WithSubType(30); 246 uint32_t name = 'n' << 24; 247 name += 'a' << 16; 248 name += 'm' << 8; 249 name += 'e'; 250 app.WithName(name); 251 252 rtc::scoped_ptr<RawPacket> packet(app.Build()); 253 RtcpPacketParser parser; 254 parser.Parse(packet->Buffer(), packet->Length()); 255 EXPECT_EQ(1, parser.app()->num_packets()); 256 EXPECT_EQ(30U, parser.app()->SubType()); 257 EXPECT_EQ(name, parser.app()->Name()); 258 EXPECT_EQ(0, parser.app_item()->num_packets()); 259} 260 261TEST(RtcpPacketTest, App) { 262 App app; 263 app.From(kSenderSsrc); 264 app.WithSubType(30); 265 uint32_t name = 'n' << 24; 266 name += 'a' << 16; 267 name += 'm' << 8; 268 name += 'e'; 269 app.WithName(name); 270 const char kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'}; 271 const size_t kDataLength = sizeof(kData) / sizeof(kData[0]); 272 app.WithData((const uint8_t*)kData, kDataLength); 273 274 rtc::scoped_ptr<RawPacket> packet(app.Build()); 275 RtcpPacketParser parser; 276 parser.Parse(packet->Buffer(), packet->Length()); 277 EXPECT_EQ(1, parser.app()->num_packets()); 278 EXPECT_EQ(30U, parser.app()->SubType()); 279 EXPECT_EQ(name, parser.app()->Name()); 280 EXPECT_EQ(1, parser.app_item()->num_packets()); 281 EXPECT_EQ(kDataLength, parser.app_item()->DataLength()); 282 EXPECT_EQ(0, strncmp(kData, (const char*)parser.app_item()->Data(), 283 parser.app_item()->DataLength())); 284} 285 286TEST(RtcpPacketTest, SdesWithOneChunk) { 287 Sdes sdes; 288 EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "alice@host")); 289 290 rtc::scoped_ptr<RawPacket> packet(sdes.Build()); 291 RtcpPacketParser parser; 292 parser.Parse(packet->Buffer(), packet->Length()); 293 EXPECT_EQ(1, parser.sdes()->num_packets()); 294 EXPECT_EQ(1, parser.sdes_chunk()->num_packets()); 295 EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc()); 296 EXPECT_EQ("alice@host", parser.sdes_chunk()->Cname()); 297} 298 299TEST(RtcpPacketTest, SdesWithMultipleChunks) { 300 Sdes sdes; 301 EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "a")); 302 EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 1, "ab")); 303 EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 2, "abc")); 304 EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 3, "abcd")); 305 EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 4, "abcde")); 306 EXPECT_TRUE(sdes.WithCName(kSenderSsrc + 5, "abcdef")); 307 308 rtc::scoped_ptr<RawPacket> packet(sdes.Build()); 309 RtcpPacketParser parser; 310 parser.Parse(packet->Buffer(), packet->Length()); 311 EXPECT_EQ(1, parser.sdes()->num_packets()); 312 EXPECT_EQ(6, parser.sdes_chunk()->num_packets()); 313 EXPECT_EQ(kSenderSsrc + 5, parser.sdes_chunk()->Ssrc()); 314 EXPECT_EQ("abcdef", parser.sdes_chunk()->Cname()); 315} 316 317TEST(RtcpPacketTest, SdesWithTooManyChunks) { 318 Sdes sdes; 319 const int kMaxChunks = (1 << 5) - 1; 320 for (int i = 0; i < kMaxChunks; ++i) { 321 uint32_t ssrc = kSenderSsrc + i; 322 std::ostringstream oss; 323 oss << "cname" << i; 324 EXPECT_TRUE(sdes.WithCName(ssrc, oss.str())); 325 } 326 EXPECT_FALSE(sdes.WithCName(kSenderSsrc + kMaxChunks, "foo")); 327} 328 329TEST(RtcpPacketTest, CnameItemWithEmptyString) { 330 Sdes sdes; 331 EXPECT_TRUE(sdes.WithCName(kSenderSsrc, "")); 332 333 rtc::scoped_ptr<RawPacket> packet(sdes.Build()); 334 RtcpPacketParser parser; 335 parser.Parse(packet->Buffer(), packet->Length()); 336 EXPECT_EQ(1, parser.sdes()->num_packets()); 337 EXPECT_EQ(1, parser.sdes_chunk()->num_packets()); 338 EXPECT_EQ(kSenderSsrc, parser.sdes_chunk()->Ssrc()); 339 EXPECT_EQ("", parser.sdes_chunk()->Cname()); 340} 341 342TEST(RtcpPacketTest, Pli) { 343 Pli pli; 344 pli.From(kSenderSsrc); 345 pli.To(kRemoteSsrc); 346 347 rtc::scoped_ptr<RawPacket> packet(pli.Build()); 348 RtcpPacketParser parser; 349 parser.Parse(packet->Buffer(), packet->Length()); 350 EXPECT_EQ(1, parser.pli()->num_packets()); 351 EXPECT_EQ(kSenderSsrc, parser.pli()->Ssrc()); 352 EXPECT_EQ(kRemoteSsrc, parser.pli()->MediaSsrc()); 353} 354 355TEST(RtcpPacketTest, Sli) { 356 const uint16_t kFirstMb = 7777; 357 const uint16_t kNumberOfMb = 6666; 358 const uint8_t kPictureId = 60; 359 Sli sli; 360 sli.From(kSenderSsrc); 361 sli.To(kRemoteSsrc); 362 sli.WithFirstMb(kFirstMb); 363 sli.WithNumberOfMb(kNumberOfMb); 364 sli.WithPictureId(kPictureId); 365 366 rtc::scoped_ptr<RawPacket> packet(sli.Build()); 367 RtcpPacketParser parser; 368 parser.Parse(packet->Buffer(), packet->Length()); 369 EXPECT_EQ(1, parser.sli()->num_packets()); 370 EXPECT_EQ(kSenderSsrc, parser.sli()->Ssrc()); 371 EXPECT_EQ(kRemoteSsrc, parser.sli()->MediaSsrc()); 372 EXPECT_EQ(1, parser.sli_item()->num_packets()); 373 EXPECT_EQ(kFirstMb, parser.sli_item()->FirstMb()); 374 EXPECT_EQ(kNumberOfMb, parser.sli_item()->NumberOfMb()); 375 EXPECT_EQ(kPictureId, parser.sli_item()->PictureId()); 376} 377 378TEST(RtcpPacketTest, Nack) { 379 Nack nack; 380 const uint16_t kList[] = {0, 1, 3, 8, 16}; 381 const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]); 382 nack.From(kSenderSsrc); 383 nack.To(kRemoteSsrc); 384 nack.WithList(kList, kListLength); 385 rtc::scoped_ptr<RawPacket> packet(nack.Build()); 386 RtcpPacketParser parser; 387 parser.Parse(packet->Buffer(), packet->Length()); 388 EXPECT_EQ(1, parser.nack()->num_packets()); 389 EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc()); 390 EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc()); 391 EXPECT_EQ(1, parser.nack_item()->num_packets()); 392 std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list(); 393 EXPECT_EQ(kListLength, seqs.size()); 394 for (size_t i = 0; i < kListLength; ++i) { 395 EXPECT_EQ(kList[i], seqs[i]); 396 } 397} 398 399TEST(RtcpPacketTest, NackWithWrap) { 400 Nack nack; 401 const uint16_t kList[] = {65500, 65516, 65534, 65535, 0, 1, 3, 20, 100}; 402 const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]); 403 nack.From(kSenderSsrc); 404 nack.To(kRemoteSsrc); 405 nack.WithList(kList, kListLength); 406 rtc::scoped_ptr<RawPacket> packet(nack.Build()); 407 RtcpPacketParser parser; 408 parser.Parse(packet->Buffer(), packet->Length()); 409 EXPECT_EQ(1, parser.nack()->num_packets()); 410 EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc()); 411 EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc()); 412 EXPECT_EQ(4, parser.nack_item()->num_packets()); 413 std::vector<uint16_t> seqs = parser.nack_item()->last_nack_list(); 414 EXPECT_EQ(kListLength, seqs.size()); 415 for (size_t i = 0; i < kListLength; ++i) { 416 EXPECT_EQ(kList[i], seqs[i]); 417 } 418} 419 420TEST(RtcpPacketTest, NackFragmented) { 421 Nack nack; 422 const uint16_t kList[] = {1, 100, 200, 300, 400}; 423 const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]); 424 nack.From(kSenderSsrc); 425 nack.To(kRemoteSsrc); 426 nack.WithList(kList, kListLength); 427 428 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { 429 public: 430 void OnPacketReady(uint8_t* data, size_t length) override { 431 ++packets_created_; 432 RtcpPacketParser parser; 433 parser.Parse(data, length); 434 EXPECT_EQ(1, parser.nack()->num_packets()); 435 EXPECT_EQ(kSenderSsrc, parser.nack()->Ssrc()); 436 EXPECT_EQ(kRemoteSsrc, parser.nack()->MediaSsrc()); 437 switch (packets_created_) { 438 case 1: 439 EXPECT_THAT(parser.nack_item()->last_nack_list(), 440 ElementsAre(1, 100, 200)); 441 break; 442 case 2: 443 EXPECT_THAT(parser.nack_item()->last_nack_list(), 444 ElementsAre(300, 400)); 445 break; 446 default: 447 ADD_FAILURE() << "Unexpected packet count: " << packets_created_; 448 } 449 } 450 int packets_created_ = 0; 451 } verifier; 452 const size_t kBufferSize = 12 + (3 * 4); // Fits common header + 3 nack items 453 uint8_t buffer[kBufferSize]; 454 EXPECT_TRUE(nack.BuildExternalBuffer(buffer, kBufferSize, &verifier)); 455 EXPECT_EQ(2, verifier.packets_created_); 456} 457 458TEST(RtcpPacketTest, NackWithTooSmallBuffer) { 459 const uint16_t kList[] = {1}; 460 const size_t kMinNackBlockSize = 16; 461 Nack nack; 462 nack.From(kSenderSsrc); 463 nack.To(kRemoteSsrc); 464 nack.WithList(kList, 1); 465 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { 466 public: 467 void OnPacketReady(uint8_t* data, size_t length) override { 468 ADD_FAILURE() << "Buffer should be too small."; 469 } 470 } verifier; 471 uint8_t buffer[kMinNackBlockSize - 1]; 472 EXPECT_FALSE( 473 nack.BuildExternalBuffer(buffer, kMinNackBlockSize - 1, &verifier)); 474} 475 476TEST(RtcpPacketTest, Rpsi) { 477 Rpsi rpsi; 478 // 1000001 (7 bits = 1 byte in native string). 479 const uint64_t kPictureId = 0x41; 480 const uint16_t kNumberOfValidBytes = 1; 481 rpsi.WithPayloadType(100); 482 rpsi.WithPictureId(kPictureId); 483 484 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); 485 RtcpPacketParser parser; 486 parser.Parse(packet->Buffer(), packet->Length()); 487 EXPECT_EQ(100, parser.rpsi()->PayloadType()); 488 EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); 489 EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); 490} 491 492TEST(RtcpPacketTest, RpsiWithTwoByteNativeString) { 493 Rpsi rpsi; 494 // |1 0000001 (7 bits = 1 byte in native string). 495 const uint64_t kPictureId = 0x81; 496 const uint16_t kNumberOfValidBytes = 2; 497 rpsi.WithPictureId(kPictureId); 498 499 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); 500 RtcpPacketParser parser; 501 parser.Parse(packet->Buffer(), packet->Length()); 502 EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); 503 EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); 504} 505 506TEST(RtcpPacketTest, RpsiWithThreeByteNativeString) { 507 Rpsi rpsi; 508 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). 509 const uint64_t kPictureId = 0x102040; 510 const uint16_t kNumberOfValidBytes = 3; 511 rpsi.WithPictureId(kPictureId); 512 513 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); 514 RtcpPacketParser parser; 515 parser.Parse(packet->Buffer(), packet->Length()); 516 EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); 517 EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); 518} 519 520TEST(RtcpPacketTest, RpsiWithFourByteNativeString) { 521 Rpsi rpsi; 522 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). 523 const uint64_t kPictureId = 0x84161C2; 524 const uint16_t kNumberOfValidBytes = 4; 525 rpsi.WithPictureId(kPictureId); 526 527 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); 528 RtcpPacketParser parser; 529 parser.Parse(packet->Buffer(), packet->Length()); 530 EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); 531 EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); 532} 533 534TEST(RtcpPacketTest, RpsiWithMaxPictureId) { 535 Rpsi rpsi; 536 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| 537 // 11 111111|1 1111111 (7 bits = 1 byte in native string). 538 const uint64_t kPictureId = 0xffffffffffffffff; 539 const uint16_t kNumberOfValidBytes = 10; 540 rpsi.WithPictureId(kPictureId); 541 542 rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); 543 RtcpPacketParser parser; 544 parser.Parse(packet->Buffer(), packet->Length()); 545 EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); 546 EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); 547} 548 549TEST(RtcpPacketTest, Fir) { 550 Fir fir; 551 fir.From(kSenderSsrc); 552 fir.To(kRemoteSsrc); 553 fir.WithCommandSeqNum(123); 554 555 rtc::scoped_ptr<RawPacket> packet(fir.Build()); 556 RtcpPacketParser parser; 557 parser.Parse(packet->Buffer(), packet->Length()); 558 EXPECT_EQ(1, parser.fir()->num_packets()); 559 EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc()); 560 EXPECT_EQ(1, parser.fir_item()->num_packets()); 561 EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc()); 562 EXPECT_EQ(123U, parser.fir_item()->SeqNum()); 563} 564 565TEST(RtcpPacketTest, AppendPacket) { 566 Fir fir; 567 ReportBlock rb; 568 ReceiverReport rr; 569 rr.From(kSenderSsrc); 570 EXPECT_TRUE(rr.WithReportBlock(rb)); 571 rr.Append(&fir); 572 573 rtc::scoped_ptr<RawPacket> packet(rr.Build()); 574 RtcpPacketParser parser; 575 parser.Parse(packet->Buffer(), packet->Length()); 576 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 577 EXPECT_EQ(kSenderSsrc, parser.receiver_report()->Ssrc()); 578 EXPECT_EQ(1, parser.report_block()->num_packets()); 579 EXPECT_EQ(1, parser.fir()->num_packets()); 580} 581 582TEST(RtcpPacketTest, AppendPacketOnEmpty) { 583 Empty empty; 584 ReceiverReport rr; 585 rr.From(kSenderSsrc); 586 empty.Append(&rr); 587 588 rtc::scoped_ptr<RawPacket> packet(empty.Build()); 589 RtcpPacketParser parser; 590 parser.Parse(packet->Buffer(), packet->Length()); 591 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 592 EXPECT_EQ(0, parser.report_block()->num_packets()); 593} 594 595TEST(RtcpPacketTest, AppendPacketWithOwnAppendedPacket) { 596 Fir fir; 597 Bye bye; 598 ReportBlock rb; 599 600 ReceiverReport rr; 601 EXPECT_TRUE(rr.WithReportBlock(rb)); 602 rr.Append(&fir); 603 604 SenderReport sr; 605 sr.Append(&bye); 606 sr.Append(&rr); 607 608 rtc::scoped_ptr<RawPacket> packet(sr.Build()); 609 RtcpPacketParser parser; 610 parser.Parse(packet->Buffer(), packet->Length()); 611 EXPECT_EQ(1, parser.sender_report()->num_packets()); 612 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 613 EXPECT_EQ(1, parser.report_block()->num_packets()); 614 EXPECT_EQ(1, parser.bye()->num_packets()); 615 EXPECT_EQ(1, parser.fir()->num_packets()); 616} 617 618TEST(RtcpPacketTest, Bye) { 619 Bye bye; 620 bye.From(kSenderSsrc); 621 622 rtc::scoped_ptr<RawPacket> packet(bye.Build()); 623 RtcpPacketParser parser; 624 parser.Parse(packet->Buffer(), packet->Length()); 625 EXPECT_EQ(1, parser.bye()->num_packets()); 626 EXPECT_EQ(kSenderSsrc, parser.bye()->Ssrc()); 627} 628 629TEST(RtcpPacketTest, ByeWithCsrcs) { 630 Fir fir; 631 Bye bye; 632 bye.From(kSenderSsrc); 633 EXPECT_TRUE(bye.WithCsrc(0x22222222)); 634 EXPECT_TRUE(bye.WithCsrc(0x33333333)); 635 bye.Append(&fir); 636 637 rtc::scoped_ptr<RawPacket> packet(bye.Build()); 638 RtcpPacketParser parser; 639 parser.Parse(packet->Buffer(), packet->Length()); 640 EXPECT_EQ(1, parser.bye()->num_packets()); 641 EXPECT_EQ(kSenderSsrc, parser.bye()->Ssrc()); 642 EXPECT_EQ(1, parser.fir()->num_packets()); 643} 644 645TEST(RtcpPacketTest, ByeWithTooManyCsrcs) { 646 Bye bye; 647 bye.From(kSenderSsrc); 648 const int kMaxCsrcs = (1 << 5) - 2; // 5 bit len, first item is sender SSRC. 649 for (int i = 0; i < kMaxCsrcs; ++i) { 650 EXPECT_TRUE(bye.WithCsrc(i)); 651 } 652 EXPECT_FALSE(bye.WithCsrc(kMaxCsrcs)); 653} 654 655TEST(RtcpPacketTest, BuildWithInputBuffer) { 656 Fir fir; 657 ReportBlock rb; 658 ReceiverReport rr; 659 rr.From(kSenderSsrc); 660 EXPECT_TRUE(rr.WithReportBlock(rb)); 661 rr.Append(&fir); 662 663 const size_t kRrLength = 8; 664 const size_t kReportBlockLength = 24; 665 const size_t kFirLength = 20; 666 667 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { 668 public: 669 void OnPacketReady(uint8_t* data, size_t length) override { 670 RtcpPacketParser parser; 671 parser.Parse(data, length); 672 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 673 EXPECT_EQ(1, parser.report_block()->num_packets()); 674 EXPECT_EQ(1, parser.fir()->num_packets()); 675 ++packets_created_; 676 } 677 678 int packets_created_ = 0; 679 } verifier; 680 const size_t kBufferSize = kRrLength + kReportBlockLength + kFirLength; 681 uint8_t buffer[kBufferSize]; 682 EXPECT_TRUE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier)); 683 EXPECT_EQ(1, verifier.packets_created_); 684} 685 686TEST(RtcpPacketTest, BuildWithTooSmallBuffer) { 687 ReportBlock rb; 688 ReceiverReport rr; 689 rr.From(kSenderSsrc); 690 EXPECT_TRUE(rr.WithReportBlock(rb)); 691 692 const size_t kRrLength = 8; 693 const size_t kReportBlockLength = 24; 694 695 // No packet. 696 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { 697 void OnPacketReady(uint8_t* data, size_t length) override { 698 ADD_FAILURE() << "Packet should not fit within max size."; 699 } 700 } verifier; 701 const size_t kBufferSize = kRrLength + kReportBlockLength - 1; 702 uint8_t buffer[kBufferSize]; 703 EXPECT_FALSE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier)); 704} 705 706TEST(RtcpPacketTest, BuildWithTooSmallBuffer_FragmentedSend) { 707 Fir fir; 708 ReportBlock rb; 709 ReceiverReport rr; 710 rr.From(kSenderSsrc); 711 EXPECT_TRUE(rr.WithReportBlock(rb)); 712 rr.Append(&fir); 713 714 const size_t kRrLength = 8; 715 const size_t kReportBlockLength = 24; 716 717 class Verifier : public rtcp::RtcpPacket::PacketReadyCallback { 718 public: 719 void OnPacketReady(uint8_t* data, size_t length) override { 720 RtcpPacketParser parser; 721 parser.Parse(data, length); 722 switch (packets_created_++) { 723 case 0: 724 EXPECT_EQ(1, parser.receiver_report()->num_packets()); 725 EXPECT_EQ(1, parser.report_block()->num_packets()); 726 EXPECT_EQ(0, parser.fir()->num_packets()); 727 break; 728 case 1: 729 EXPECT_EQ(0, parser.receiver_report()->num_packets()); 730 EXPECT_EQ(0, parser.report_block()->num_packets()); 731 EXPECT_EQ(1, parser.fir()->num_packets()); 732 break; 733 default: 734 ADD_FAILURE() << "OnPacketReady not expected to be called " 735 << packets_created_ << " times."; 736 } 737 } 738 739 int packets_created_ = 0; 740 } verifier; 741 const size_t kBufferSize = kRrLength + kReportBlockLength; 742 uint8_t buffer[kBufferSize]; 743 EXPECT_TRUE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier)); 744 EXPECT_EQ(2, verifier.packets_created_); 745} 746 747TEST(RtcpPacketTest, Remb) { 748 Remb remb; 749 remb.From(kSenderSsrc); 750 remb.AppliesTo(kRemoteSsrc); 751 remb.AppliesTo(kRemoteSsrc + 1); 752 remb.AppliesTo(kRemoteSsrc + 2); 753 remb.WithBitrateBps(261011); 754 755 rtc::scoped_ptr<RawPacket> packet(remb.Build()); 756 RtcpPacketParser parser; 757 parser.Parse(packet->Buffer(), packet->Length()); 758 EXPECT_EQ(1, parser.psfb_app()->num_packets()); 759 EXPECT_EQ(kSenderSsrc, parser.psfb_app()->Ssrc()); 760 EXPECT_EQ(1, parser.remb_item()->num_packets()); 761 EXPECT_EQ(261011, parser.remb_item()->last_bitrate_bps()); 762 std::vector<uint32_t> ssrcs = parser.remb_item()->last_ssrc_list(); 763 EXPECT_EQ(kRemoteSsrc, ssrcs[0]); 764 EXPECT_EQ(kRemoteSsrc + 1, ssrcs[1]); 765 EXPECT_EQ(kRemoteSsrc + 2, ssrcs[2]); 766} 767 768TEST(RtcpPacketTest, Tmmbr) { 769 Tmmbr tmmbr; 770 tmmbr.From(kSenderSsrc); 771 tmmbr.To(kRemoteSsrc); 772 tmmbr.WithBitrateKbps(312); 773 tmmbr.WithOverhead(60); 774 775 rtc::scoped_ptr<RawPacket> packet(tmmbr.Build()); 776 RtcpPacketParser parser; 777 parser.Parse(packet->Buffer(), packet->Length()); 778 EXPECT_EQ(1, parser.tmmbr()->num_packets()); 779 EXPECT_EQ(kSenderSsrc, parser.tmmbr()->Ssrc()); 780 EXPECT_EQ(1, parser.tmmbr_item()->num_packets()); 781 EXPECT_EQ(312U, parser.tmmbr_item()->BitrateKbps()); 782 EXPECT_EQ(60U, parser.tmmbr_item()->Overhead()); 783} 784 785TEST(RtcpPacketTest, TmmbnWithNoItem) { 786 Tmmbn tmmbn; 787 tmmbn.From(kSenderSsrc); 788 789 rtc::scoped_ptr<RawPacket> packet(tmmbn.Build()); 790 RtcpPacketParser parser; 791 parser.Parse(packet->Buffer(), packet->Length()); 792 EXPECT_EQ(1, parser.tmmbn()->num_packets()); 793 EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc()); 794 EXPECT_EQ(0, parser.tmmbn_items()->num_packets()); 795} 796 797TEST(RtcpPacketTest, TmmbnWithOneItem) { 798 Tmmbn tmmbn; 799 tmmbn.From(kSenderSsrc); 800 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc, 312, 60)); 801 802 rtc::scoped_ptr<RawPacket> packet(tmmbn.Build()); 803 RtcpPacketParser parser; 804 parser.Parse(packet->Buffer(), packet->Length()); 805 EXPECT_EQ(1, parser.tmmbn()->num_packets()); 806 EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc()); 807 EXPECT_EQ(1, parser.tmmbn_items()->num_packets()); 808 EXPECT_EQ(kRemoteSsrc, parser.tmmbn_items()->Ssrc(0)); 809 EXPECT_EQ(312U, parser.tmmbn_items()->BitrateKbps(0)); 810 EXPECT_EQ(60U, parser.tmmbn_items()->Overhead(0)); 811} 812 813TEST(RtcpPacketTest, TmmbnWithTwoItems) { 814 Tmmbn tmmbn; 815 tmmbn.From(kSenderSsrc); 816 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc, 312, 60)); 817 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc + 1, 1288, 40)); 818 819 rtc::scoped_ptr<RawPacket> packet(tmmbn.Build()); 820 RtcpPacketParser parser; 821 parser.Parse(packet->Buffer(), packet->Length()); 822 EXPECT_EQ(1, parser.tmmbn()->num_packets()); 823 EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc()); 824 EXPECT_EQ(2, parser.tmmbn_items()->num_packets()); 825 EXPECT_EQ(kRemoteSsrc, parser.tmmbn_items()->Ssrc(0)); 826 EXPECT_EQ(312U, parser.tmmbn_items()->BitrateKbps(0)); 827 EXPECT_EQ(60U, parser.tmmbn_items()->Overhead(0)); 828 EXPECT_EQ(kRemoteSsrc + 1, parser.tmmbn_items()->Ssrc(1)); 829 EXPECT_EQ(1288U, parser.tmmbn_items()->BitrateKbps(1)); 830 EXPECT_EQ(40U, parser.tmmbn_items()->Overhead(1)); 831} 832 833TEST(RtcpPacketTest, TmmbnWithTooManyItems) { 834 Tmmbn tmmbn; 835 tmmbn.From(kSenderSsrc); 836 const int kMaxTmmbrItems = 50; 837 for (int i = 0; i < kMaxTmmbrItems; ++i) 838 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc + i, 312, 60)); 839 840 EXPECT_FALSE(tmmbn.WithTmmbr(kRemoteSsrc + kMaxTmmbrItems, 312, 60)); 841} 842 843TEST(RtcpPacketTest, XrWithNoReportBlocks) { 844 Xr xr; 845 xr.From(kSenderSsrc); 846 847 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 848 RtcpPacketParser parser; 849 parser.Parse(packet->Buffer(), packet->Length()); 850 EXPECT_EQ(1, parser.xr_header()->num_packets()); 851 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 852} 853 854TEST(RtcpPacketTest, XrWithRrtr) { 855 Rrtr rrtr; 856 rrtr.WithNtpSec(0x11111111); 857 rrtr.WithNtpFrac(0x22222222); 858 Xr xr; 859 xr.From(kSenderSsrc); 860 EXPECT_TRUE(xr.WithRrtr(&rrtr)); 861 862 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 863 RtcpPacketParser parser; 864 parser.Parse(packet->Buffer(), packet->Length()); 865 EXPECT_EQ(1, parser.xr_header()->num_packets()); 866 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 867 EXPECT_EQ(1, parser.rrtr()->num_packets()); 868 EXPECT_EQ(0x11111111U, parser.rrtr()->NtpSec()); 869 EXPECT_EQ(0x22222222U, parser.rrtr()->NtpFrac()); 870} 871 872TEST(RtcpPacketTest, XrWithTwoRrtrBlocks) { 873 Rrtr rrtr1; 874 rrtr1.WithNtpSec(0x11111111); 875 rrtr1.WithNtpFrac(0x22222222); 876 Rrtr rrtr2; 877 rrtr2.WithNtpSec(0x33333333); 878 rrtr2.WithNtpFrac(0x44444444); 879 Xr xr; 880 xr.From(kSenderSsrc); 881 EXPECT_TRUE(xr.WithRrtr(&rrtr1)); 882 EXPECT_TRUE(xr.WithRrtr(&rrtr2)); 883 884 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 885 RtcpPacketParser parser; 886 parser.Parse(packet->Buffer(), packet->Length()); 887 EXPECT_EQ(1, parser.xr_header()->num_packets()); 888 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 889 EXPECT_EQ(2, parser.rrtr()->num_packets()); 890 EXPECT_EQ(0x33333333U, parser.rrtr()->NtpSec()); 891 EXPECT_EQ(0x44444444U, parser.rrtr()->NtpFrac()); 892} 893 894TEST(RtcpPacketTest, XrWithDlrrWithOneSubBlock) { 895 Dlrr dlrr; 896 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); 897 Xr xr; 898 xr.From(kSenderSsrc); 899 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 900 901 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 902 RtcpPacketParser parser; 903 parser.Parse(packet->Buffer(), packet->Length()); 904 EXPECT_EQ(1, parser.xr_header()->num_packets()); 905 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 906 EXPECT_EQ(1, parser.dlrr()->num_packets()); 907 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); 908 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); 909 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); 910 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); 911} 912 913TEST(RtcpPacketTest, XrWithDlrrWithTwoSubBlocks) { 914 Dlrr dlrr; 915 EXPECT_TRUE(dlrr.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); 916 EXPECT_TRUE(dlrr.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); 917 Xr xr; 918 xr.From(kSenderSsrc); 919 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 920 921 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 922 RtcpPacketParser parser; 923 parser.Parse(packet->Buffer(), packet->Length()); 924 EXPECT_EQ(1, parser.xr_header()->num_packets()); 925 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 926 EXPECT_EQ(1, parser.dlrr()->num_packets()); 927 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); 928 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); 929 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); 930 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); 931 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); 932 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); 933 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); 934} 935 936TEST(RtcpPacketTest, DlrrWithTooManySubBlocks) { 937 const int kMaxItems = 100; 938 Dlrr dlrr; 939 for (int i = 0; i < kMaxItems; ++i) 940 EXPECT_TRUE(dlrr.WithDlrrItem(i, i, i)); 941 EXPECT_FALSE(dlrr.WithDlrrItem(kMaxItems, kMaxItems, kMaxItems)); 942} 943 944TEST(RtcpPacketTest, XrWithTwoDlrrBlocks) { 945 Dlrr dlrr1; 946 EXPECT_TRUE(dlrr1.WithDlrrItem(0x11111111, 0x22222222, 0x33333333)); 947 Dlrr dlrr2; 948 EXPECT_TRUE(dlrr2.WithDlrrItem(0x44444444, 0x55555555, 0x66666666)); 949 Xr xr; 950 xr.From(kSenderSsrc); 951 EXPECT_TRUE(xr.WithDlrr(&dlrr1)); 952 EXPECT_TRUE(xr.WithDlrr(&dlrr2)); 953 954 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 955 RtcpPacketParser parser; 956 parser.Parse(packet->Buffer(), packet->Length()); 957 EXPECT_EQ(1, parser.xr_header()->num_packets()); 958 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 959 EXPECT_EQ(2, parser.dlrr()->num_packets()); 960 EXPECT_EQ(2, parser.dlrr_items()->num_packets()); 961 EXPECT_EQ(0x11111111U, parser.dlrr_items()->Ssrc(0)); 962 EXPECT_EQ(0x22222222U, parser.dlrr_items()->LastRr(0)); 963 EXPECT_EQ(0x33333333U, parser.dlrr_items()->DelayLastRr(0)); 964 EXPECT_EQ(0x44444444U, parser.dlrr_items()->Ssrc(1)); 965 EXPECT_EQ(0x55555555U, parser.dlrr_items()->LastRr(1)); 966 EXPECT_EQ(0x66666666U, parser.dlrr_items()->DelayLastRr(1)); 967} 968 969TEST(RtcpPacketTest, XrWithVoipMetric) { 970 VoipMetric metric; 971 metric.To(kRemoteSsrc); 972 metric.LossRate(1); 973 metric.DiscardRate(2); 974 metric.BurstDensity(3); 975 metric.GapDensity(4); 976 metric.BurstDuration(0x1111); 977 metric.GapDuration(0x2222); 978 metric.RoundTripDelay(0x3333); 979 metric.EndSystemDelay(0x4444); 980 metric.SignalLevel(5); 981 metric.NoiseLevel(6); 982 metric.Rerl(7); 983 metric.Gmin(8); 984 metric.Rfactor(9); 985 metric.ExtRfactor(10); 986 metric.MosLq(11); 987 metric.MosCq(12); 988 metric.RxConfig(13); 989 metric.JbNominal(0x5555); 990 metric.JbMax(0x6666); 991 metric.JbAbsMax(0x7777); 992 993 Xr xr; 994 xr.From(kSenderSsrc); 995 EXPECT_TRUE(xr.WithVoipMetric(&metric)); 996 997 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 998 RtcpPacketParser parser; 999 parser.Parse(packet->Buffer(), packet->Length()); 1000 EXPECT_EQ(1, parser.xr_header()->num_packets()); 1001 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 1002 EXPECT_EQ(1, parser.voip_metric()->num_packets()); 1003 EXPECT_EQ(kRemoteSsrc, parser.voip_metric()->Ssrc()); 1004 EXPECT_EQ(1, parser.voip_metric()->LossRate()); 1005 EXPECT_EQ(2, parser.voip_metric()->DiscardRate()); 1006 EXPECT_EQ(3, parser.voip_metric()->BurstDensity()); 1007 EXPECT_EQ(4, parser.voip_metric()->GapDensity()); 1008 EXPECT_EQ(0x1111, parser.voip_metric()->BurstDuration()); 1009 EXPECT_EQ(0x2222, parser.voip_metric()->GapDuration()); 1010 EXPECT_EQ(0x3333, parser.voip_metric()->RoundTripDelay()); 1011 EXPECT_EQ(0x4444, parser.voip_metric()->EndSystemDelay()); 1012 EXPECT_EQ(5, parser.voip_metric()->SignalLevel()); 1013 EXPECT_EQ(6, parser.voip_metric()->NoiseLevel()); 1014 EXPECT_EQ(7, parser.voip_metric()->Rerl()); 1015 EXPECT_EQ(8, parser.voip_metric()->Gmin()); 1016 EXPECT_EQ(9, parser.voip_metric()->Rfactor()); 1017 EXPECT_EQ(10, parser.voip_metric()->ExtRfactor()); 1018 EXPECT_EQ(11, parser.voip_metric()->MosLq()); 1019 EXPECT_EQ(12, parser.voip_metric()->MosCq()); 1020 EXPECT_EQ(13, parser.voip_metric()->RxConfig()); 1021 EXPECT_EQ(0x5555, parser.voip_metric()->JbNominal()); 1022 EXPECT_EQ(0x6666, parser.voip_metric()->JbMax()); 1023 EXPECT_EQ(0x7777, parser.voip_metric()->JbAbsMax()); 1024} 1025 1026TEST(RtcpPacketTest, XrWithMultipleReportBlocks) { 1027 Rrtr rrtr; 1028 Dlrr dlrr; 1029 EXPECT_TRUE(dlrr.WithDlrrItem(1, 2, 3)); 1030 VoipMetric metric; 1031 Xr xr; 1032 xr.From(kSenderSsrc); 1033 EXPECT_TRUE(xr.WithRrtr(&rrtr)); 1034 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 1035 EXPECT_TRUE(xr.WithVoipMetric(&metric)); 1036 1037 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 1038 RtcpPacketParser parser; 1039 parser.Parse(packet->Buffer(), packet->Length()); 1040 EXPECT_EQ(1, parser.xr_header()->num_packets()); 1041 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 1042 EXPECT_EQ(1, parser.rrtr()->num_packets()); 1043 EXPECT_EQ(1, parser.dlrr()->num_packets()); 1044 EXPECT_EQ(1, parser.dlrr_items()->num_packets()); 1045 EXPECT_EQ(1, parser.voip_metric()->num_packets()); 1046} 1047 1048TEST(RtcpPacketTest, DlrrWithoutItemNotIncludedInPacket) { 1049 Rrtr rrtr; 1050 Dlrr dlrr; 1051 VoipMetric metric; 1052 Xr xr; 1053 xr.From(kSenderSsrc); 1054 EXPECT_TRUE(xr.WithRrtr(&rrtr)); 1055 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 1056 EXPECT_TRUE(xr.WithVoipMetric(&metric)); 1057 1058 rtc::scoped_ptr<RawPacket> packet(xr.Build()); 1059 RtcpPacketParser parser; 1060 parser.Parse(packet->Buffer(), packet->Length()); 1061 EXPECT_EQ(1, parser.xr_header()->num_packets()); 1062 EXPECT_EQ(kSenderSsrc, parser.xr_header()->Ssrc()); 1063 EXPECT_EQ(1, parser.rrtr()->num_packets()); 1064 EXPECT_EQ(0, parser.dlrr()->num_packets()); 1065 EXPECT_EQ(1, parser.voip_metric()->num_packets()); 1066} 1067 1068TEST(RtcpPacketTest, XrWithTooManyBlocks) { 1069 const int kMaxBlocks = 50; 1070 Xr xr; 1071 1072 Rrtr rrtr; 1073 for (int i = 0; i < kMaxBlocks; ++i) 1074 EXPECT_TRUE(xr.WithRrtr(&rrtr)); 1075 EXPECT_FALSE(xr.WithRrtr(&rrtr)); 1076 1077 Dlrr dlrr; 1078 for (int i = 0; i < kMaxBlocks; ++i) 1079 EXPECT_TRUE(xr.WithDlrr(&dlrr)); 1080 EXPECT_FALSE(xr.WithDlrr(&dlrr)); 1081 1082 VoipMetric voip_metric; 1083 for (int i = 0; i < kMaxBlocks; ++i) 1084 EXPECT_TRUE(xr.WithVoipMetric(&voip_metric)); 1085 EXPECT_FALSE(xr.WithVoipMetric(&voip_metric)); 1086} 1087 1088} // namespace webrtc 1089