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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 config->rtp.rtx.payload_type = prng->Rand(0, 127); | 193 config->rtp.rtx.payload_type = prng->Rand(0, 127); |
194 // Add header extensions. | 194 // Add header extensions. |
195 for (unsigned i = 0; i < kNumExtensions; i++) { | 195 for (unsigned i = 0; i < kNumExtensions; i++) { |
196 if (extensions_bitvector & (1u << i)) { | 196 if (extensions_bitvector & (1u << i)) { |
197 config->rtp.extensions.push_back( | 197 config->rtp.extensions.push_back( |
198 RtpExtension(kExtensionNames[i], prng->Rand<int>())); | 198 RtpExtension(kExtensionNames[i], prng->Rand<int>())); |
199 } | 199 } |
200 } | 200 } |
201 } | 201 } |
202 | 202 |
| 203 void GenerateAudioReceiveConfig(uint32_t extensions_bitvector, |
| 204 AudioReceiveStream::Config* config, |
| 205 Random* prng) { |
| 206 // Add SSRCs for the stream. |
| 207 config->rtp.remote_ssrc = prng->Rand<uint32_t>(); |
| 208 config->rtp.local_ssrc = prng->Rand<uint32_t>(); |
| 209 // Add header extensions. |
| 210 for (unsigned i = 0; i < kNumExtensions; i++) { |
| 211 if (extensions_bitvector & (1u << i)) { |
| 212 config->rtp.extensions.push_back( |
| 213 RtpExtension(kExtensionNames[i], prng->Rand<int>())); |
| 214 } |
| 215 } |
| 216 } |
| 217 |
| 218 void GenerateAudioSendConfig(uint32_t extensions_bitvector, |
| 219 AudioSendStream::Config* config, |
| 220 Random* prng) { |
| 221 // Add SSRC to the stream. |
| 222 config->rtp.ssrc = prng->Rand<uint32_t>(); |
| 223 // Add header extensions. |
| 224 for (unsigned i = 0; i < kNumExtensions; i++) { |
| 225 if (extensions_bitvector & (1u << i)) { |
| 226 config->rtp.extensions.push_back( |
| 227 RtpExtension(kExtensionNames[i], prng->Rand<int>())); |
| 228 } |
| 229 } |
| 230 } |
| 231 |
203 // Test for the RtcEventLog class. Dumps some RTP packets and other events | 232 // Test for the RtcEventLog class. Dumps some RTP packets and other events |
204 // to disk, then reads them back to see if they match. | 233 // to disk, then reads them back to see if they match. |
205 void LogSessionAndReadBack(size_t rtp_count, | 234 void LogSessionAndReadBack(size_t rtp_count, |
206 size_t rtcp_count, | 235 size_t rtcp_count, |
207 size_t playout_count, | 236 size_t playout_count, |
208 size_t bwe_loss_count, | 237 size_t bwe_loss_count, |
209 uint32_t extensions_bitvector, | 238 uint32_t extensions_bitvector, |
210 uint32_t csrcs_count, | 239 uint32_t csrcs_count, |
211 unsigned int random_seed) { | 240 unsigned int random_seed) { |
212 ASSERT_LE(rtcp_count, rtp_count); | 241 ASSERT_LE(rtcp_count, rtp_count); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 const size_t event_count = config_count + playout_count + bwe_loss_count + | 346 const size_t event_count = config_count + playout_count + bwe_loss_count + |
318 rtcp_count + rtp_count + 2; | 347 rtcp_count + rtp_count + 2; |
319 EXPECT_GE(1000u, event_count); // The events must fit in the message queue. | 348 EXPECT_GE(1000u, event_count); // The events must fit in the message queue. |
320 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents()); | 349 EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents()); |
321 if (event_count != parsed_log.GetNumberOfEvents()) { | 350 if (event_count != parsed_log.GetNumberOfEvents()) { |
322 // Print the expected and actual event types for easier debugging. | 351 // Print the expected and actual event types for easier debugging. |
323 PrintActualEvents(parsed_log); | 352 PrintActualEvents(parsed_log); |
324 PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count); | 353 PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count); |
325 } | 354 } |
326 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); | 355 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); |
327 RtcEventLogTestHelper::VerifyReceiveStreamConfig(parsed_log, 1, | 356 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1, |
328 receiver_config); | 357 receiver_config); |
329 RtcEventLogTestHelper::VerifySendStreamConfig(parsed_log, 2, sender_config); | 358 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2, |
| 359 sender_config); |
330 size_t event_index = config_count + 1; | 360 size_t event_index = config_count + 1; |
331 size_t rtcp_index = 1; | 361 size_t rtcp_index = 1; |
332 size_t playout_index = 1; | 362 size_t playout_index = 1; |
333 size_t bwe_loss_index = 1; | 363 size_t bwe_loss_index = 1; |
334 for (size_t i = 1; i <= rtp_count; i++) { | 364 for (size_t i = 1; i <= rtp_count; i++) { |
335 RtcEventLogTestHelper::VerifyRtpEvent( | 365 RtcEventLogTestHelper::VerifyRtpEvent( |
336 parsed_log, event_index, | 366 parsed_log, event_index, |
337 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, | 367 (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket, |
338 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, | 368 (i % 3 == 0) ? MediaType::AUDIO : MediaType::VIDEO, |
339 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(), | 369 rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(), |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 RtcEventLogTestHelper::VerifyRtcpEvent(parsed_log, 2, kOutgoingPacket, | 480 RtcEventLogTestHelper::VerifyRtcpEvent(parsed_log, 2, kOutgoingPacket, |
451 MediaType::VIDEO, rtcp_packet.data(), | 481 MediaType::VIDEO, rtcp_packet.data(), |
452 rtcp_packet.size()); | 482 rtcp_packet.size()); |
453 | 483 |
454 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); | 484 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3); |
455 | 485 |
456 // Clean up temporary file - can be pretty slow. | 486 // Clean up temporary file - can be pretty slow. |
457 remove(temp_filename.c_str()); | 487 remove(temp_filename.c_str()); |
458 } | 488 } |
459 | 489 |
| 490 class ConfigReadWriteTest { |
| 491 public: |
| 492 ConfigReadWriteTest() : prng(987654321) {} |
| 493 virtual ~ConfigReadWriteTest() {} |
| 494 virtual void GenerateConfig(uint32_t extensions_bitvector) = 0; |
| 495 virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 496 size_t index) = 0; |
| 497 virtual void LogConfig(RtcEventLog* event_log) = 0; |
| 498 |
| 499 void DoTest() { |
| 500 // Find the name of the current test, in order to use it as a temporary |
| 501 // filename. |
| 502 auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); |
| 503 const std::string temp_filename = |
| 504 test::OutputPath() + test_info->test_case_name() + test_info->name(); |
| 505 |
| 506 // Use all extensions. |
| 507 uint32_t extensions_bitvector = (1u << kNumExtensions) - 1; |
| 508 GenerateConfig(extensions_bitvector); |
| 509 |
| 510 // Log a single config event and stop logging. |
| 511 SimulatedClock fake_clock(prng.Rand<uint32_t>()); |
| 512 std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create(&fake_clock)); |
| 513 |
| 514 log_dumper->StartLogging(temp_filename, 10000000); |
| 515 LogConfig(log_dumper.get()); |
| 516 log_dumper->StopLogging(); |
| 517 |
| 518 // Read the generated file from disk. |
| 519 ParsedRtcEventLog parsed_log; |
| 520 ASSERT_TRUE(parsed_log.ParseFile(temp_filename)); |
| 521 |
| 522 // Check the generated number of events. |
| 523 EXPECT_EQ(3u, parsed_log.GetNumberOfEvents()); |
| 524 |
| 525 RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0); |
| 526 |
| 527 // Verify that the parsed config struct matches the one that was logged. |
| 528 VerifyConfig(parsed_log, 1); |
| 529 |
| 530 RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2); |
| 531 |
| 532 // Clean up temporary file - can be pretty slow. |
| 533 remove(temp_filename.c_str()); |
| 534 } |
| 535 Random prng; |
| 536 }; |
| 537 |
| 538 class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest { |
| 539 public: |
| 540 void GenerateConfig(uint32_t extensions_bitvector) override { |
| 541 GenerateAudioReceiveConfig(extensions_bitvector, &config, &prng); |
| 542 } |
| 543 void LogConfig(RtcEventLog* event_log) override { |
| 544 event_log->LogAudioReceiveStreamConfig(config); |
| 545 } |
| 546 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 547 size_t index) override { |
| 548 RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index, |
| 549 config); |
| 550 } |
| 551 AudioReceiveStream::Config config; |
| 552 }; |
| 553 |
| 554 class AudioSendConfigReadWriteTest : public ConfigReadWriteTest { |
| 555 public: |
| 556 AudioSendConfigReadWriteTest() : config(nullptr) {} |
| 557 void GenerateConfig(uint32_t extensions_bitvector) override { |
| 558 GenerateAudioSendConfig(extensions_bitvector, &config, &prng); |
| 559 } |
| 560 void LogConfig(RtcEventLog* event_log) override { |
| 561 event_log->LogAudioSendStreamConfig(config); |
| 562 } |
| 563 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 564 size_t index) override { |
| 565 RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index, |
| 566 config); |
| 567 } |
| 568 AudioSendStream::Config config; |
| 569 }; |
| 570 |
| 571 class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest { |
| 572 public: |
| 573 VideoReceiveConfigReadWriteTest() : config(nullptr) {} |
| 574 void GenerateConfig(uint32_t extensions_bitvector) override { |
| 575 GenerateVideoReceiveConfig(extensions_bitvector, &config, &prng); |
| 576 } |
| 577 void LogConfig(RtcEventLog* event_log) override { |
| 578 event_log->LogVideoReceiveStreamConfig(config); |
| 579 } |
| 580 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 581 size_t index) override { |
| 582 RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index, |
| 583 config); |
| 584 } |
| 585 VideoReceiveStream::Config config; |
| 586 }; |
| 587 |
| 588 class VideoSendConfigReadWriteTest : public ConfigReadWriteTest { |
| 589 public: |
| 590 VideoSendConfigReadWriteTest() : config(nullptr) {} |
| 591 void GenerateConfig(uint32_t extensions_bitvector) override { |
| 592 GenerateVideoSendConfig(extensions_bitvector, &config, &prng); |
| 593 } |
| 594 void LogConfig(RtcEventLog* event_log) override { |
| 595 event_log->LogVideoSendStreamConfig(config); |
| 596 } |
| 597 void VerifyConfig(const ParsedRtcEventLog& parsed_log, |
| 598 size_t index) override { |
| 599 RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index, |
| 600 config); |
| 601 } |
| 602 VideoSendStream::Config config; |
| 603 }; |
| 604 |
| 605 TEST(RtcEventLogTest, LogAudioReceiveConfig) { |
| 606 AudioReceiveConfigReadWriteTest test; |
| 607 test.DoTest(); |
| 608 } |
| 609 |
| 610 TEST(RtcEventLogTest, LogAudioSendConfig) { |
| 611 AudioSendConfigReadWriteTest test; |
| 612 test.DoTest(); |
| 613 } |
| 614 |
| 615 TEST(RtcEventLogTest, LogVideoReceiveConfig) { |
| 616 VideoReceiveConfigReadWriteTest test; |
| 617 test.DoTest(); |
| 618 } |
| 619 |
| 620 TEST(RtcEventLogTest, LogVideoSendConfig) { |
| 621 VideoSendConfigReadWriteTest test; |
| 622 test.DoTest(); |
| 623 } |
460 } // namespace webrtc | 624 } // namespace webrtc |
OLD | NEW |