From d62ac3f0b8308a77c0944d444b5de7686c389a07 Mon Sep 17 00:00:00 2001 From: Kuang-che Wu Date: Thu, 10 Oct 2019 22:06:12 +0800 Subject: [PATCH] Use fake clock for replay fuzzing This speed up fuzzing because no more SleepMs in real time. Bug: chromium:959836, chromium:1009073 Change-Id: Ib00a2ff8d6ca2e0bfc706ee7469e0a9c7fb10758 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156362 Commit-Queue: Benjamin Wright Reviewed-by: Benjamin Wright Cr-Commit-Position: refs/heads/master@{#29439} --- test/fuzzers/utils/BUILD.gn | 1 + test/fuzzers/utils/rtp_replayer.cc | 20 +++++++++++++++----- test/fuzzers/utils/rtp_replayer.h | 5 ++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/test/fuzzers/utils/BUILD.gn b/test/fuzzers/utils/BUILD.gn index e821e2f137..5f9ea4c221 100644 --- a/test/fuzzers/utils/BUILD.gn +++ b/test/fuzzers/utils/BUILD.gn @@ -25,6 +25,7 @@ rtc_source_set("rtp_replayer") { "../../../media:rtc_internal_video_codecs", "../../../rtc_base:checks", "../../../rtc_base:rtc_base_approved", + "../../../rtc_base:rtc_base_tests_utils", "../../../rtc_base:rtc_json", "../../../system_wrappers", "../../../test:call_config_utils", diff --git a/test/fuzzers/utils/rtp_replayer.cc b/test/fuzzers/utils/rtp_replayer.cc index 4a9712ad67..af03be2f2c 100644 --- a/test/fuzzers/utils/rtp_replayer.cc +++ b/test/fuzzers/utils/rtp_replayer.cc @@ -18,7 +18,6 @@ #include "api/task_queue/default_task_queue_factory.h" #include "rtc_base/strings/json.h" #include "system_wrappers/include/clock.h" -#include "system_wrappers/include/sleep.h" #include "test/call_config_utils.h" #include "test/encoder_settings.h" #include "test/fake_decoder.h" @@ -43,6 +42,13 @@ void RtpReplayer::Replay( std::vector receive_stream_configs, const uint8_t* rtp_dump_data, size_t rtp_dump_size) { + rtc::ScopedBaseFakeClock fake_clock; + + // Work around: webrtc calls webrtc::Random(clock.TimeInMicroseconds()) + // everywhere and Random expects non-zero seed. Let's set the clock non-zero + // to make them happy. + fake_clock.SetTime(webrtc::Timestamp::ms(1)); + // Attempt to create an RtpReader from the input file. auto rtp_reader = CreateRtpReader(rtp_dump_data, rtp_dump_size); if (rtp_reader == nullptr) { @@ -64,7 +70,7 @@ void RtpReplayer::Replay( receive_stream->Start(); } - ReplayPackets(call.get(), rtp_reader.get()); + ReplayPackets(&fake_clock, call.get(), rtp_reader.get()); for (const auto& receive_stream : stream_state->receive_streams) { call->DestroyVideoReceiveStream(receive_stream); @@ -127,7 +133,9 @@ std::unique_ptr RtpReplayer::CreateRtpReader( return rtp_reader; } -void RtpReplayer::ReplayPackets(Call* call, test::RtpFileReader* rtp_reader) { +void RtpReplayer::ReplayPackets(rtc::FakeClock* clock, + Call* call, + test::RtpFileReader* rtp_reader) { int64_t replay_start_ms = -1; int num_packets = 0; std::map unknown_packets; @@ -145,8 +153,10 @@ void RtpReplayer::ReplayPackets(Call* call, test::RtpFileReader* rtp_reader) { int64_t deliver_in_ms = replay_start_ms + packet.time_ms - now_ms; if (deliver_in_ms > 0) { - // Set an upper limit on sleep to prevent timing out. - SleepMs(std::min(deliver_in_ms, static_cast(100))); + // StatsCounter::ReportMetricToAggregatedCounter is O(elapsed time). + // Set an upper limit to prevent waste time. + clock->AdvanceTime(webrtc::TimeDelta::ms( + std::min(deliver_in_ms, static_cast(100)))); } ++num_packets; diff --git a/test/fuzzers/utils/rtp_replayer.h b/test/fuzzers/utils/rtp_replayer.h index 3217fc30cf..c79a17eec5 100644 --- a/test/fuzzers/utils/rtp_replayer.h +++ b/test/fuzzers/utils/rtp_replayer.h @@ -23,6 +23,7 @@ #include "api/video_codecs/video_decoder.h" #include "call/call.h" #include "media/engine/internal_decoder_factory.h" +#include "rtc_base/fake_clock.h" #include "rtc_base/time_utils.h" #include "test/null_transport.h" #include "test/rtp_file_reader.h" @@ -78,7 +79,9 @@ class RtpReplayer final { size_t rtp_dump_size); // Replays each packet to from the RtpDump. - static void ReplayPackets(Call* call, test::RtpFileReader* rtp_reader); + static void ReplayPackets(rtc::FakeClock* clock, + Call* call, + test::RtpFileReader* rtp_reader); }; // class RtpReplayer } // namespace test