OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 ASSERT_TRUE(sender_config.has_encoder()); | 217 ASSERT_TRUE(sender_config.has_encoder()); |
218 ASSERT_TRUE(sender_config.encoder().has_name()); | 218 ASSERT_TRUE(sender_config.encoder().has_name()); |
219 ASSERT_TRUE(sender_config.encoder().has_payload_type()); | 219 ASSERT_TRUE(sender_config.encoder().has_payload_type()); |
220 EXPECT_EQ(config.encoder_settings.payload_name, | 220 EXPECT_EQ(config.encoder_settings.payload_name, |
221 sender_config.encoder().name()); | 221 sender_config.encoder().name()); |
222 EXPECT_EQ(config.encoder_settings.payload_type, | 222 EXPECT_EQ(config.encoder_settings.payload_type, |
223 sender_config.encoder().payload_type()); | 223 sender_config.encoder().payload_type()); |
224 } | 224 } |
225 | 225 |
226 void VerifyRtpEvent(const rtclog::Event& event, | 226 void VerifyRtpEvent(const rtclog::Event& event, |
227 bool incoming, | 227 PacketDirection direction, |
228 MediaType media_type, | 228 MediaType media_type, |
229 const uint8_t* header, | 229 const uint8_t* header, |
230 size_t header_size, | 230 size_t header_size, |
231 size_t total_size) { | 231 size_t total_size) { |
232 ASSERT_TRUE(IsValidBasicEvent(event)); | 232 ASSERT_TRUE(IsValidBasicEvent(event)); |
233 ASSERT_EQ(rtclog::Event::RTP_EVENT, event.type()); | 233 ASSERT_EQ(rtclog::Event::RTP_EVENT, event.type()); |
234 const rtclog::RtpPacket& rtp_packet = event.rtp_packet(); | 234 const rtclog::RtpPacket& rtp_packet = event.rtp_packet(); |
235 ASSERT_TRUE(rtp_packet.has_incoming()); | 235 ASSERT_TRUE(rtp_packet.has_incoming()); |
236 EXPECT_EQ(incoming, rtp_packet.incoming()); | 236 EXPECT_EQ(direction == kIncomingPacket, rtp_packet.incoming()); |
237 ASSERT_TRUE(rtp_packet.has_type()); | 237 ASSERT_TRUE(rtp_packet.has_type()); |
238 EXPECT_EQ(media_type, GetRuntimeMediaType(rtp_packet.type())); | 238 EXPECT_EQ(media_type, GetRuntimeMediaType(rtp_packet.type())); |
239 ASSERT_TRUE(rtp_packet.has_packet_length()); | 239 ASSERT_TRUE(rtp_packet.has_packet_length()); |
240 EXPECT_EQ(total_size, rtp_packet.packet_length()); | 240 EXPECT_EQ(total_size, rtp_packet.packet_length()); |
241 ASSERT_TRUE(rtp_packet.has_header()); | 241 ASSERT_TRUE(rtp_packet.has_header()); |
242 ASSERT_EQ(header_size, rtp_packet.header().size()); | 242 ASSERT_EQ(header_size, rtp_packet.header().size()); |
243 for (size_t i = 0; i < header_size; i++) { | 243 for (size_t i = 0; i < header_size; i++) { |
244 EXPECT_EQ(header[i], static_cast<uint8_t>(rtp_packet.header()[i])); | 244 EXPECT_EQ(header[i], static_cast<uint8_t>(rtp_packet.header()[i])); |
245 } | 245 } |
246 } | 246 } |
247 | 247 |
248 void VerifyRtcpEvent(const rtclog::Event& event, | 248 void VerifyRtcpEvent(const rtclog::Event& event, |
249 bool incoming, | 249 PacketDirection direction, |
250 MediaType media_type, | 250 MediaType media_type, |
251 const uint8_t* packet, | 251 const uint8_t* packet, |
252 size_t total_size) { | 252 size_t total_size) { |
253 ASSERT_TRUE(IsValidBasicEvent(event)); | 253 ASSERT_TRUE(IsValidBasicEvent(event)); |
254 ASSERT_EQ(rtclog::Event::RTCP_EVENT, event.type()); | 254 ASSERT_EQ(rtclog::Event::RTCP_EVENT, event.type()); |
255 const rtclog::RtcpPacket& rtcp_packet = event.rtcp_packet(); | 255 const rtclog::RtcpPacket& rtcp_packet = event.rtcp_packet(); |
256 ASSERT_TRUE(rtcp_packet.has_incoming()); | 256 ASSERT_TRUE(rtcp_packet.has_incoming()); |
257 EXPECT_EQ(incoming, rtcp_packet.incoming()); | 257 EXPECT_EQ(direction == kIncomingPacket, rtcp_packet.incoming()); |
258 ASSERT_TRUE(rtcp_packet.has_type()); | 258 ASSERT_TRUE(rtcp_packet.has_type()); |
259 EXPECT_EQ(media_type, GetRuntimeMediaType(rtcp_packet.type())); | 259 EXPECT_EQ(media_type, GetRuntimeMediaType(rtcp_packet.type())); |
260 ASSERT_TRUE(rtcp_packet.has_packet_data()); | 260 ASSERT_TRUE(rtcp_packet.has_packet_data()); |
261 ASSERT_EQ(total_size, rtcp_packet.packet_data().size()); | 261 ASSERT_EQ(total_size, rtcp_packet.packet_data().size()); |
262 for (size_t i = 0; i < total_size; i++) { | 262 for (size_t i = 0; i < total_size; i++) { |
263 EXPECT_EQ(packet[i], static_cast<uint8_t>(rtcp_packet.packet_data()[i])); | 263 EXPECT_EQ(packet[i], static_cast<uint8_t>(rtcp_packet.packet_data()[i])); |
264 } | 264 } |
265 } | 265 } |
266 | 266 |
267 void VerifyPlayoutEvent(const rtclog::Event& event, uint32_t ssrc) { | 267 void VerifyPlayoutEvent(const rtclog::Event& event, uint32_t ssrc) { |
(...skipping 17 matching lines...) Expand all Loading... |
285 EXPECT_EQ(fraction_loss, bwe_event.fraction_loss()); | 285 EXPECT_EQ(fraction_loss, bwe_event.fraction_loss()); |
286 ASSERT_TRUE(bwe_event.has_total_packets()); | 286 ASSERT_TRUE(bwe_event.has_total_packets()); |
287 EXPECT_EQ(total_packets, bwe_event.total_packets()); | 287 EXPECT_EQ(total_packets, bwe_event.total_packets()); |
288 } | 288 } |
289 | 289 |
290 void VerifyLogStartEvent(const rtclog::Event& event) { | 290 void VerifyLogStartEvent(const rtclog::Event& event) { |
291 ASSERT_TRUE(IsValidBasicEvent(event)); | 291 ASSERT_TRUE(IsValidBasicEvent(event)); |
292 EXPECT_EQ(rtclog::Event::LOG_START, event.type()); | 292 EXPECT_EQ(rtclog::Event::LOG_START, event.type()); |
293 } | 293 } |
294 | 294 |
| 295 void VerifyLogEndEvent(const rtclog::Event& event) { |
| 296 ASSERT_TRUE(IsValidBasicEvent(event)); |
| 297 EXPECT_EQ(rtclog::Event::LOG_END, event.type()); |
| 298 } |
| 299 |
295 /* | 300 /* |
296 * Bit number i of extension_bitvector is set to indicate the | 301 * Bit number i of extension_bitvector is set to indicate the |
297 * presence of extension number i from kExtensionTypes / kExtensionNames. | 302 * presence of extension number i from kExtensionTypes / kExtensionNames. |
298 * The least significant bit extension_bitvector has number 0. | 303 * The least significant bit extension_bitvector has number 0. |
299 */ | 304 */ |
300 size_t GenerateRtpPacket(uint32_t extensions_bitvector, | 305 size_t GenerateRtpPacket(uint32_t extensions_bitvector, |
301 uint32_t csrcs_count, | 306 uint32_t csrcs_count, |
302 uint8_t* packet, | 307 uint8_t* packet, |
303 size_t packet_size, | 308 size_t packet_size, |
304 Random* prng) { | 309 Random* prng) { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 | 470 |
466 // Find the name of the current test, in order to use it as a temporary | 471 // Find the name of the current test, in order to use it as a temporary |
467 // filename. | 472 // filename. |
468 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 473 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
469 const std::string temp_filename = | 474 const std::string temp_filename = |
470 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 475 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
471 | 476 |
472 // When log_dumper goes out of scope, it causes the log file to be flushed | 477 // When log_dumper goes out of scope, it causes the log file to be flushed |
473 // to disk. | 478 // to disk. |
474 { | 479 { |
475 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 480 SimulatedClock fake_clock(prng.Rand<uint32_t>()); |
| 481 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create(&fake_clock)); |
476 log_dumper->LogVideoReceiveStreamConfig(receiver_config); | 482 log_dumper->LogVideoReceiveStreamConfig(receiver_config); |
| 483 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
477 log_dumper->LogVideoSendStreamConfig(sender_config); | 484 log_dumper->LogVideoSendStreamConfig(sender_config); |
| 485 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
478 size_t rtcp_index = 1; | 486 size_t rtcp_index = 1; |
479 size_t playout_index = 1; | 487 size_t playout_index = 1; |
480 size_t bwe_loss_index = 1; | 488 size_t bwe_loss_index = 1; |
481 for (size_t i = 1; i <= rtp_count; i++) { | 489 for (size_t i = 1; i <= rtp_count; i++) { |
482 log_dumper->LogRtpHeader( | 490 log_dumper->LogRtpHeader( |
483 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 491 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, |
484 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, | 492 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, |
485 rtp_packets[i - 1].data(), rtp_packets[i - 1].size()); | 493 rtp_packets[i - 1].data(), rtp_packets[i - 1].size()); |
| 494 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
486 if (i * rtcp_count >= rtcp_index * rtp_count) { | 495 if (i * rtcp_count >= rtcp_index * rtp_count) { |
487 log_dumper->LogRtcpPacket( | 496 log_dumper->LogRtcpPacket( |
488 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 497 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, |
489 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, | 498 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, |
490 rtcp_packets[rtcp_index - 1].data(), | 499 rtcp_packets[rtcp_index - 1].data(), |
491 rtcp_packets[rtcp_index - 1].size()); | 500 rtcp_packets[rtcp_index - 1].size()); |
492 rtcp_index++; | 501 rtcp_index++; |
| 502 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
493 } | 503 } |
494 if (i * playout_count >= playout_index * rtp_count) { | 504 if (i * playout_count >= playout_index * rtp_count) { |
495 log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]); | 505 log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]); |
496 playout_index++; | 506 playout_index++; |
| 507 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
497 } | 508 } |
498 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | 509 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { |
499 log_dumper->LogBwePacketLossEvent( | 510 log_dumper->LogBwePacketLossEvent( |
500 bwe_loss_updates[bwe_loss_index - 1].first, | 511 bwe_loss_updates[bwe_loss_index - 1].first, |
501 bwe_loss_updates[bwe_loss_index - 1].second, i); | 512 bwe_loss_updates[bwe_loss_index - 1].second, i); |
502 bwe_loss_index++; | 513 bwe_loss_index++; |
| 514 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
503 } | 515 } |
504 if (i == rtp_count / 2) { | 516 if (i == rtp_count / 2) { |
505 log_dumper->StartLogging(temp_filename, 10000000); | 517 log_dumper->StartLogging(temp_filename, 10000000); |
| 518 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
506 } | 519 } |
507 } | 520 } |
| 521 log_dumper->StopLogging(); |
508 } | 522 } |
509 | 523 |
510 // Read the generated file from disk. | 524 // Read the generated file from disk. |
511 rtclog::EventStream parsed_stream; | 525 rtclog::EventStream parsed_stream; |
512 | 526 |
513 ASSERT_TRUE(RtcEventLog::ParseRtcEventLog(temp_filename, &parsed_stream)); | 527 ASSERT_TRUE(RtcEventLog::ParseRtcEventLog(temp_filename, &parsed_stream)); |
514 | 528 |
515 // Verify that what we read back from the event log is the same as | 529 // Verify that what we read back from the event log is the same as |
516 // what we wrote down. For RTCP we log the full packets, but for | 530 // what we wrote down. For RTCP we log the full packets, but for |
517 // RTP we should only log the header. | 531 // RTP we should only log the header. |
518 const int event_count = config_count + playout_count + bwe_loss_count + | 532 const int event_count = config_count + playout_count + bwe_loss_count + |
519 rtcp_count + rtp_count + 1; | 533 rtcp_count + rtp_count + 2; |
520 EXPECT_EQ(event_count, parsed_stream.stream_size()); | 534 EXPECT_EQ(event_count, parsed_stream.stream_size()); |
521 VerifyReceiveStreamConfig(parsed_stream.stream(0), receiver_config); | 535 // Print the expected and actual event types for easier debugging. |
522 VerifySendStreamConfig(parsed_stream.stream(1), sender_config); | 536 if (event_count != parsed_stream.stream_size()) { |
523 size_t event_index = config_count; | 537 printf( |
| 538 "rtp_count = %zu, rtcp_count = %zu, playout_count = %zu, " |
| 539 "bwe_loss_count " |
| 540 "= %zu\n", |
| 541 rtp_count, rtcp_count, playout_count, bwe_loss_count); |
| 542 for (size_t i = 0; i < static_cast<size_t>(parsed_stream.stream_size()); |
| 543 i++) { |
| 544 printf("%4d ", parsed_stream.stream(i).type()); |
| 545 } |
| 546 printf("\n"); |
| 547 size_t rtcp_index = 1, playout_index = 1, bwe_loss_index = 1; |
| 548 printf("strt cfg cfg "); |
| 549 for (size_t i = 1; i <= rtp_count; i++) { |
| 550 printf(" rtp "); |
| 551 if (i * rtcp_count >= rtcp_index * rtp_count) { |
| 552 printf("rtcp "); |
| 553 rtcp_index++; |
| 554 } |
| 555 if (i * playout_count >= playout_index * rtp_count) { |
| 556 printf("play "); |
| 557 playout_index++; |
| 558 } |
| 559 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { |
| 560 printf("loss "); |
| 561 bwe_loss_index++; |
| 562 } |
| 563 } |
| 564 printf("\n"); |
| 565 } |
| 566 VerifyLogStartEvent(parsed_stream.stream(0)); |
| 567 VerifyReceiveStreamConfig(parsed_stream.stream(1), receiver_config); |
| 568 VerifySendStreamConfig(parsed_stream.stream(2), sender_config); |
| 569 size_t event_index = config_count + 1; |
524 size_t rtcp_index = 1; | 570 size_t rtcp_index = 1; |
525 size_t playout_index = 1; | 571 size_t playout_index = 1; |
526 size_t bwe_loss_index = 1; | 572 size_t bwe_loss_index = 1; |
527 for (size_t i = 1; i <= rtp_count; i++) { | 573 for (size_t i = 1; i <= rtp_count; i++) { |
528 VerifyRtpEvent(parsed_stream.stream(event_index), | 574 VerifyRtpEvent(parsed_stream.stream(event_index), |
529 (i % 2 == 0), // Every second packet is incoming. | 575 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, |
530 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, | 576 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, |
531 rtp_packets[i - 1].data(), rtp_header_sizes[i - 1], | 577 rtp_packets[i - 1].data(), rtp_header_sizes[i - 1], |
532 rtp_packets[i - 1].size()); | 578 rtp_packets[i - 1].size()); |
533 event_index++; | 579 event_index++; |
534 if (i * rtcp_count >= rtcp_index * rtp_count) { | 580 if (i * rtcp_count >= rtcp_index * rtp_count) { |
535 VerifyRtcpEvent(parsed_stream.stream(event_index), | 581 VerifyRtcpEvent(parsed_stream.stream(event_index), |
536 rtcp_index % 2 == 0, // Every second packet is incoming. | 582 (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket, |
537 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, | 583 rtcp_index % 3 == 0 ? MediaType::AUDIO : MediaType::VIDEO, |
538 rtcp_packets[rtcp_index - 1].data(), | 584 rtcp_packets[rtcp_index - 1].data(), |
539 rtcp_packets[rtcp_index - 1].size()); | 585 rtcp_packets[rtcp_index - 1].size()); |
540 event_index++; | 586 event_index++; |
541 rtcp_index++; | 587 rtcp_index++; |
542 } | 588 } |
543 if (i * playout_count >= playout_index * rtp_count) { | 589 if (i * playout_count >= playout_index * rtp_count) { |
544 VerifyPlayoutEvent(parsed_stream.stream(event_index), | 590 VerifyPlayoutEvent(parsed_stream.stream(event_index), |
545 playout_ssrcs[playout_index - 1]); | 591 playout_ssrcs[playout_index - 1]); |
546 event_index++; | 592 event_index++; |
547 playout_index++; | 593 playout_index++; |
548 } | 594 } |
549 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { | 595 if (i * bwe_loss_count >= bwe_loss_index * rtp_count) { |
550 VerifyBweLossEvent(parsed_stream.stream(event_index), | 596 VerifyBweLossEvent(parsed_stream.stream(event_index), |
551 bwe_loss_updates[bwe_loss_index - 1].first, | 597 bwe_loss_updates[bwe_loss_index - 1].first, |
552 bwe_loss_updates[bwe_loss_index - 1].second, i); | 598 bwe_loss_updates[bwe_loss_index - 1].second, i); |
553 event_index++; | 599 event_index++; |
554 bwe_loss_index++; | 600 bwe_loss_index++; |
555 } | 601 } |
556 if (i == rtp_count / 2) { | |
557 VerifyLogStartEvent(parsed_stream.stream(event_index)); | |
558 event_index++; | |
559 } | |
560 } | 602 } |
561 | 603 |
562 // Clean up temporary file - can be pretty slow. | 604 // Clean up temporary file - can be pretty slow. |
563 remove(temp_filename.c_str()); | 605 remove(temp_filename.c_str()); |
564 } | 606 } |
565 | 607 |
566 TEST(RtcEventLogTest, LogSessionAndReadBack) { | 608 TEST(RtcEventLogTest, LogSessionAndReadBack) { |
567 // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events | 609 // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events |
568 // with no header extensions or CSRCS. | 610 // with no header extensions or CSRCS. |
569 LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321); | 611 LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321); |
(...skipping 19 matching lines...) Expand all Loading... |
589 2 + csrcs_count, // Number of RTCP packets. | 631 2 + csrcs_count, // Number of RTCP packets. |
590 3 + csrcs_count, // Number of playout events. | 632 3 + csrcs_count, // Number of playout events. |
591 1 + csrcs_count, // Number of BWE loss events. | 633 1 + csrcs_count, // Number of BWE loss events. |
592 extensions, // Bit vector choosing extensions. | 634 extensions, // Bit vector choosing extensions. |
593 csrcs_count, // Number of contributing sources. | 635 csrcs_count, // Number of contributing sources. |
594 extensions * 3 + csrcs_count + 1); // Random seed. | 636 extensions * 3 + csrcs_count + 1); // Random seed. |
595 } | 637 } |
596 } | 638 } |
597 } | 639 } |
598 | 640 |
599 // Tests that the event queue works correctly, i.e. drops old RTP, RTCP and | 641 TEST(RtcEventLogTest, LogEventAndReadBack) { |
600 // debug events, but keeps config events even if they are older than the limit. | 642 Random prng(987654321); |
601 void DropOldEvents(uint32_t extensions_bitvector, | |
602 uint32_t csrcs_count, | |
603 unsigned int random_seed) { | |
604 rtc::Buffer old_rtp_packet; | |
605 rtc::Buffer recent_rtp_packet; | |
606 rtc::Buffer old_rtcp_packet; | |
607 rtc::Buffer recent_rtcp_packet; | |
608 | 643 |
609 VideoReceiveStream::Config receiver_config(nullptr); | 644 // Create one RTP and one RTCP packet containing random data. |
610 VideoSendStream::Config sender_config(nullptr); | |
611 | |
612 Random prng(random_seed); | |
613 | |
614 // Create two RTP packets containing random data. | |
615 size_t packet_size = prng.Rand(1000, 1100); | 645 size_t packet_size = prng.Rand(1000, 1100); |
616 old_rtp_packet.SetSize(packet_size); | 646 rtc::Buffer rtp_packet(packet_size); |
617 GenerateRtpPacket(extensions_bitvector, csrcs_count, old_rtp_packet.data(), | 647 size_t header_size = |
618 packet_size, &prng); | 648 GenerateRtpPacket(0, 0, rtp_packet.data(), packet_size, &prng); |
619 packet_size = prng.Rand(1000, 1100); | 649 rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng); |
620 recent_rtp_packet.SetSize(packet_size); | |
621 size_t recent_header_size = | |
622 GenerateRtpPacket(extensions_bitvector, csrcs_count, | |
623 recent_rtp_packet.data(), packet_size, &prng); | |
624 | |
625 // Create two RTCP packets containing random data. | |
626 old_rtcp_packet = GenerateRtcpPacket(&prng); | |
627 recent_rtcp_packet = GenerateRtcpPacket(&prng); | |
628 | |
629 // Create configurations for the video streams. | |
630 GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config, &prng); | |
631 GenerateVideoSendConfig(extensions_bitvector, &sender_config, &prng); | |
632 | 650 |
633 // Find the name of the current test, in order to use it as a temporary | 651 // Find the name of the current test, in order to use it as a temporary |
634 // filename. | 652 // filename. |
635 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 653 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
636 const std::string temp_filename = | 654 const std::string temp_filename = |
637 test::OutputPath() + test_info->test_case_name() + test_info->name(); | 655 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
638 | 656 |
639 // The log file will be flushed to disk when the log_dumper goes out of scope. | 657 // Print the exact contents of the packet for easier debugging |
640 { | 658 printf("Writing one RTP to %s\n", temp_filename.c_str()); |
641 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create()); | 659 printf("Incoming: %s\n", "yes"); |
642 // Reduce the time old events are stored to 50 ms. | 660 printf("Media type: %d\n", MediaType::VIDEO); |
643 log_dumper->SetBufferDuration(50000); | 661 printf("Packet length: %zu\n", rtp_packet.size()); |
644 log_dumper->LogVideoReceiveStreamConfig(receiver_config); | 662 printf("Header: "); |
645 log_dumper->LogVideoSendStreamConfig(sender_config); | 663 for (size_t i = 0; i < header_size; i++) { |
646 log_dumper->LogRtpHeader(kOutgoingPacket, MediaType::AUDIO, | 664 printf("%x ", static_cast<uint8_t*>(rtp_packet.data())[i]); |
647 old_rtp_packet.data(), old_rtp_packet.size()); | |
648 log_dumper->LogRtcpPacket(kIncomingPacket, MediaType::AUDIO, | |
649 old_rtcp_packet.data(), | |
650 old_rtcp_packet.size()); | |
651 // Sleep 55 ms to let old events be removed from the queue. | |
652 rtc::Thread::SleepMs(55); | |
653 log_dumper->StartLogging(temp_filename, 10000000); | |
654 log_dumper->LogRtpHeader(kIncomingPacket, MediaType::VIDEO, | |
655 recent_rtp_packet.data(), | |
656 recent_rtp_packet.size()); | |
657 log_dumper->LogRtcpPacket(kOutgoingPacket, MediaType::VIDEO, | |
658 recent_rtcp_packet.data(), | |
659 recent_rtcp_packet.size()); | |
660 } | 665 } |
| 666 printf("\n"); |
| 667 |
| 668 // Add RTP, start logging, add RTCP and then stop logging |
| 669 SimulatedClock fake_clock(prng.Rand<uint32_t>()); |
| 670 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create(&fake_clock)); |
| 671 |
| 672 log_dumper->LogRtpHeader(kIncomingPacket, MediaType::VIDEO, rtp_packet.data(), |
| 673 rtp_packet.size()); |
| 674 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
| 675 |
| 676 log_dumper->StartLogging(temp_filename, 10000000); |
| 677 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
| 678 |
| 679 log_dumper->LogRtcpPacket(kOutgoingPacket, MediaType::VIDEO, |
| 680 rtcp_packet.data(), rtcp_packet.size()); |
| 681 fake_clock.AdvanceTimeMicroseconds(prng.Rand(1, 1000)); |
| 682 |
| 683 log_dumper->StopLogging(); |
661 | 684 |
662 // Read the generated file from disk. | 685 // Read the generated file from disk. |
663 rtclog::EventStream parsed_stream; | 686 rtclog::EventStream parsed_stream; |
664 ASSERT_TRUE(RtcEventLog::ParseRtcEventLog(temp_filename, &parsed_stream)); | 687 ASSERT_TRUE(RtcEventLog::ParseRtcEventLog(temp_filename, &parsed_stream)); |
665 | 688 |
666 // Verify that what we read back from the event log is the same as | 689 // Verify that what we read back from the event log is the same as |
667 // what we wrote. Old RTP and RTCP events should have been discarded, | 690 // what we wrote down. |
668 // but old configuration events should still be available. | 691 EXPECT_EQ(4, parsed_stream.stream_size()); |
669 EXPECT_EQ(5, parsed_stream.stream_size()); | 692 |
670 VerifyReceiveStreamConfig(parsed_stream.stream(0), receiver_config); | 693 VerifyLogStartEvent(parsed_stream.stream(0)); |
671 VerifySendStreamConfig(parsed_stream.stream(1), sender_config); | 694 |
672 VerifyLogStartEvent(parsed_stream.stream(2)); | 695 VerifyRtpEvent(parsed_stream.stream(1), kIncomingPacket, MediaType::VIDEO, |
673 VerifyRtpEvent(parsed_stream.stream(3), true, MediaType::VIDEO, | 696 rtp_packet.data(), header_size, rtp_packet.size()); |
674 recent_rtp_packet.data(), recent_header_size, | 697 |
675 recent_rtp_packet.size()); | 698 VerifyRtcpEvent(parsed_stream.stream(2), kOutgoingPacket, MediaType::VIDEO, |
676 VerifyRtcpEvent(parsed_stream.stream(4), false, MediaType::VIDEO, | 699 rtcp_packet.data(), rtcp_packet.size()); |
677 recent_rtcp_packet.data(), recent_rtcp_packet.size()); | 700 |
| 701 VerifyLogEndEvent(parsed_stream.stream(3)); |
678 | 702 |
679 // Clean up temporary file - can be pretty slow. | 703 // Clean up temporary file - can be pretty slow. |
680 remove(temp_filename.c_str()); | 704 remove(temp_filename.c_str()); |
681 } | 705 } |
682 | |
683 TEST(RtcEventLogTest, DropOldEvents) { | |
684 // Enable all header extensions | |
685 uint32_t extensions = (1u << kNumExtensions) - 1; | |
686 uint32_t csrcs_count = 2; | |
687 DropOldEvents(extensions, csrcs_count, 141421356); | |
688 DropOldEvents(extensions, csrcs_count, 173205080); | |
689 } | |
690 | |
691 } // namespace webrtc | 706 } // namespace webrtc |
692 | 707 |
693 #endif // ENABLE_RTC_EVENT_LOG | 708 #endif // ENABLE_RTC_EVENT_LOG |
OLD | NEW |