// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <stdint.h> #include "base/command_line.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/process/process_handle.h" #include "base/strings/string_number_conversions.h" #include "build/build_config.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/browser/webrtc/webrtc_content_browsertest_base.h" #include "content/browser/webrtc/webrtc_internals.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test_utils.h" #include "content/shell/browser/shell.h" #include "media/base/media_switches.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "third_party/blink/public/common/features.h" #include "ui/shell_dialogs/selected_file_info.h" namespace { constexpr int kExpectedConsumerId = …; constexpr int kWaveHeaderSizeBytes = …; constexpr char kBaseFilename[] = …; // Get the expected AEC dump file name. The name will be // <temporary path>.<render process id>.aec_dump.<consumer id>, for example // "/tmp/.com.google.Chrome.Z6UC3P.12345.aec_dump.1". base::FilePath GetExpectedAecDumpFileName(const base::FilePath& base_file_path, int renderer_pid) { … } // Get the file names of the recordings. The name will be // <temporary path>.<kind>.<running stream id>.wav, for example // "/tmp/.com.google.Chrome.Z6UC3P.output.1.wav". |kind| is output or input. std::vector<base::FilePath> GetRecordingFileNames( base::FilePath::StringPieceType kind, const base::FilePath& base_file_path) { … } // Deletes the the file specified by |path|. If that fails, waits for 100 ms and // tries again. Returns true if the delete was successful. // This is to handle when not being able to delete the file due to race when the // file is being closed. See comment for CallWithAudioDebugRecordings test case // below. bool DeleteFileWithRetryAfterPause(const base::FilePath& path) { … } } // namespace namespace content { class WebRtcAudioDebugRecordingsBrowserTest : public WebRtcContentBrowserTestBase { … }; #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ BUILDFLAG(IS_FUCHSIA) // Renderer crashes under Android ASAN: https://crbug.com/408496. // Renderer crashes under Android: https://crbug.com/820934. // Failures on Android M. https://crbug.com/535728. // Flaky on Linux: https://crbug.com/871182 // Failed on Fuchsia: https://crbug.com/1470981 #define MAYBE_CallWithAudioDebugRecordings … #else #define MAYBE_CallWithAudioDebugRecordings … #endif // This tests will make a complete PeerConnection-based call, verify that // video is playing for the call, and verify that non-empty audio debug // recording files exist. The recording is enabled through webrtc-internals. The // HTML and Javascript is bypassed since it would trigger a file picker dialog. // Instead, the dialog callback FileSelected() is invoked directly. In fact, // there's never a webrtc-internals page opened at all since that's not needed. // Note: Both stopping the streams (at hangup()) and disabling the recordings // are asynchronous without response when finished. This means that closing the // files is asynchronous and being able to delete the files in the test is // therefore timing dependent and flaky prone. For this reason we use // DeleteFileWithRetryAfterPause() as a simple mitigation. IN_PROC_BROWSER_TEST_F(WebRtcAudioDebugRecordingsBrowserTest, MAYBE_CallWithAudioDebugRecordings) { … } // TODO(grunell): Add test for multiple dumps when re-use of // MediaStreamAudioProcessor in AudioCapturer has been removed. #if BUILDFLAG(IS_ANDROID) // Renderer crashes under Android ASAN: https://crbug.com/408496. // Renderer crashes under Android: https://crbug.com/820934. #define MAYBE_CallWithAudioDebugRecordingsEnabledThenDisabled … #else #define MAYBE_CallWithAudioDebugRecordingsEnabledThenDisabled … #endif // As above, but enable and disable recordings before starting a call. No files // should be created. IN_PROC_BROWSER_TEST_F(WebRtcAudioDebugRecordingsBrowserTest, MAYBE_CallWithAudioDebugRecordingsEnabledThenDisabled) { … } // Same test as CallWithAudioDebugRecordings, but does two parallel calls. // TODO(crbug.com/40589452): Fix an re-enable test. // List of issues filed before this test was disabled for all platforms: // Renderer crashes under Android ASAN: https://crbug.com/408496. // Renderer crashes under Android: https://crbug.com/820934. // Failures on Android M. https://crbug.com/535728. // Flaky on Linux: https://crbug.com/871182 IN_PROC_BROWSER_TEST_F(WebRtcAudioDebugRecordingsBrowserTest, DISABLED_TwoCallsWithAudioDebugRecordings) { … } } // namespace content