Chromium Code Reviews| Index: chrome/browser/extensions/api/webrtc_logging_private/webrtc_event_log_apitest.cc |
| diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_event_log_apitest.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_event_log_apitest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..967c2d72901c983e463edfde34d0c5abed705443 |
| --- /dev/null |
| +++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_event_log_apitest.cc |
| @@ -0,0 +1,261 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "base/command_line.h" |
| +#include "base/json/json_writer.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/threading/platform_thread.h" |
| +#include "base/time/time.h" |
| +#include "build/build_config.h" |
| +#include "chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.h" |
| +#include "chrome/browser/extensions/extension_function_test_utils.h" |
| +#include "chrome/browser/extensions/extension_tab_util.h" |
| +#include "chrome/browser/media/webrtc_browsertest_base.h" |
| +#include "chrome/browser/media/webrtc_browsertest_common.h" |
| +#include "chrome/common/chrome_switches.h" |
| +#include "content/public/common/content_switches.h" |
| +#include "content/public/test/browser_test_utils.h" |
| +#include "extensions/browser/api_test_utils.h" |
| +#include "extensions/common/test_util.h" |
| +#include "media/base/media_switches.h" |
| +#include "net/test/embedded_test_server/embedded_test_server.h" |
| + |
| +#if defined(OS_WIN) |
| +#define IntToStringType base::IntToString16 |
| +#else |
| +#define IntToStringType base::IntToString |
| +#endif |
| + |
| +using extensions::WebrtcLoggingPrivateStartWebRtcEventLoggingFunction; |
| +using extensions::WebrtcLoggingPrivateStopWebRtcEventLoggingFunction; |
| + |
| +namespace utils = extension_function_test_utils; |
| + |
| +namespace { |
| + |
| +// Get the expected EventLog file name. The name will be |
| +// <temporary path>.<render process id>.event_log.<consumer id>, for example |
| +// "/tmp/.com.google.Chrome.Z6UC3P.12345.event_log.1". |
| +base::FilePath GetExpectedEventLogFileName(const base::FilePath& base_file, |
| + int render_process_id) { |
| + const int kExpectedConsumerId = 1; |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
nit: static const int kExpectedConsumerId = 1;
(kF
terelius-chromium
2016/04/13 08:52:04
Done.
|
| + return base_file.AddExtension(IntToStringType(render_process_id)) |
| + .AddExtension(FILE_PATH_LITERAL("event_log")) |
| + .AddExtension(IntToStringType(kExpectedConsumerId)); |
| +} |
| + |
| +static const char kMainWebrtcTestHtmlPage[] = "/webrtc/webrtc_jsep01_test.html"; |
| + |
| +std::string ParamsToString(const base::ListValue& parameters) { |
| + std::string parameter_string; |
| + EXPECT_TRUE(base::JSONWriter::Write(parameters, ¶meter_string)); |
| + return parameter_string; |
| +} |
| + |
| +class WebrtcEventLogApiTest : public WebRtcTestBase { |
| + protected: |
| + void SetUp() override { |
| + WebRtcTestBase::SetUp(); |
| + extension_ = extensions::test_util::CreateEmptyExtension(); |
| + } |
| + |
| + void SetUpInProcessBrowserTestFixture() override { |
| + DetectErrorsInJavaScript(); // Look for errors in our rather complex js. |
| + } |
| + |
| + void SetUpCommandLine(base::CommandLine* command_line) override { |
| + // Ensure the infobar is enabled, since we expect that in this test. |
| + EXPECT_FALSE(command_line->HasSwitch(switches::kUseFakeUIForMediaStream)); |
| + |
| + // Always use fake devices. |
| + command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream); |
| + |
| + // Flag used by TestWebAudioMediaStream to force garbage collection. |
| + command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc"); |
| + |
| + // Enable the the event log in the extension API. |
| + command_line->AppendSwitch( |
| + switches::kEnableWebRtcEventLoggingFromExtension); |
| + } |
| + |
| + template <typename T> |
| + scoped_refptr<T> CreateFunction() { |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
nit: CreateExtensionFunction
terelius-chromium
2016/04/13 08:52:05
Done.
|
| + scoped_refptr<T> function(new T()); |
| + function->set_extension(extension_.get()); |
| + function->set_has_callback(true); |
| + return function; |
| + } |
| + |
| + void AppendTabIdAndUrl(base::ListValue* parameters, |
| + content::WebContents* tab) { |
| + base::DictionaryValue* request_info = new base::DictionaryValue(); |
| + request_info->SetInteger("tabId", |
| + extensions::ExtensionTabUtil::GetTabId(tab)); |
| + parameters->Append(request_info); |
| + parameters->AppendString(tab->GetURL().GetOrigin().spec()); |
| + } |
| + |
| + private: |
| + scoped_refptr<extensions::Extension> extension_; |
| +}; |
| + |
| +} // namespace |
| + |
| +IN_PROC_BROWSER_TEST_F(WebrtcEventLogApiTest, TestStartStopWebRtcEventLogging) { |
| + if (OnWinXp()) |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
I don't think XP is supported any longer, so this
terelius-chromium
2016/04/13 08:52:04
Done.
|
| + return; |
| + |
| + ASSERT_TRUE(embedded_test_server()->Start()); |
| + |
| + content::WebContents* left_tab = |
| + OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage); |
| + content::WebContents* right_tab = |
| + OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage); |
| + |
| + SetupPeerconnectionWithLocalStream(left_tab); |
| + SetupPeerconnectionWithLocalStream(right_tab); |
| + |
| + NegotiateCall(left_tab, right_tab, "VP8"); |
| + |
| + StartDetectingVideo(left_tab, "remote-view"); |
| + StartDetectingVideo(right_tab, "remote-view"); |
| + |
| + // Start the event log. |
| + const int seconds = 0; |
| + base::ListValue start_params; |
| + AppendTabIdAndUrl(&start_params, left_tab); |
| + start_params.AppendInteger(seconds); |
| + scoped_refptr<WebrtcLoggingPrivateStartWebRtcEventLoggingFunction> |
| + start_function(CreateFunction< |
| + WebrtcLoggingPrivateStartWebRtcEventLoggingFunction>()); |
| + scoped_ptr<base::Value> start_result(utils::RunFunctionAndReturnSingleResult( |
| + start_function.get(), ParamsToString(start_params), browser())); |
| + ASSERT_TRUE(start_result.get()); |
| + |
| + // Get the file name. |
| + scoped_ptr<extensions::api::webrtc_logging_private::RecordingInfo> |
| + recordings_info_start( |
| + extensions::api::webrtc_logging_private::RecordingInfo::FromValue( |
| + *start_result.get())); |
| + ASSERT_TRUE(recordings_info_start.get()); |
| + base::FilePath file_name_start( |
| + base::FilePath::FromUTF8Unsafe(recordings_info_start->prefix_path)); |
| + |
| +#if !defined(OS_MACOSX) |
| + // Video is choppy on Mac OS X. http://crbug.com/443542. |
| + WaitForVideoToPlay(left_tab); |
| + WaitForVideoToPlay(right_tab); |
| +#endif |
| + |
| + // Stop the event log. |
| + base::ListValue stop_params; |
| + AppendTabIdAndUrl(&stop_params, left_tab); |
| + scoped_refptr<WebrtcLoggingPrivateStopWebRtcEventLoggingFunction> |
| + stop_function( |
| + CreateFunction<WebrtcLoggingPrivateStopWebRtcEventLoggingFunction>()); |
| + scoped_ptr<base::Value> stop_result(utils::RunFunctionAndReturnSingleResult( |
| + stop_function.get(), ParamsToString(stop_params), browser())); |
| + |
| + // Get the file name. |
| + scoped_ptr<extensions::api::webrtc_logging_private::RecordingInfo> |
| + recordings_info_stop( |
| + extensions::api::webrtc_logging_private::RecordingInfo::FromValue( |
| + *stop_result.get())); |
| + ASSERT_TRUE(recordings_info_stop.get()); |
| + base::FilePath file_name_stop( |
| + base::FilePath::FromUTF8Unsafe(recordings_info_stop->prefix_path)); |
| + |
| + HangUp(left_tab); |
| + HangUp(right_tab); |
| + |
| + EXPECT_EQ(file_name_start, file_name_stop); |
| + |
| + // Check that the file exists and is non-empty. |
| + base::ProcessId render_process_id = |
| + base::GetProcId(left_tab->GetRenderProcessHost()->GetHandle()); |
| + EXPECT_NE(render_process_id, base::kNullProcessId); |
| + base::FilePath full_file_name = |
| + GetExpectedEventLogFileName(file_name_stop, render_process_id); |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
what if there were two tests running at the same t
terelius-chromium
2016/04/13 08:52:05
The path is based on Profile::GetPath(). This path
|
| + while (!base::PathExists(full_file_name)) { |
| + LOG(INFO) << "Waiting for logfile to become available..."; |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
I think 'INFO' is discouraged. Instead use VLOG(1
terelius-chromium
2016/04/13 08:52:04
Done.
|
| + base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
ehm... ok, I see now what this loop is about. Sle
terelius-chromium
2016/04/13 08:52:05
I've updated the loop based on our offline discuss
|
| + } |
| + EXPECT_TRUE(base::PathExists(full_file_name)); |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
should this be ASSERT_TRUE()? As is, you'll conti
terelius-chromium
2016/04/13 08:52:04
Done. However, the loop above will not exit until
|
| + int64_t file_size = 0; |
| + EXPECT_TRUE(base::GetFileSize(full_file_name, &file_size)); |
| + EXPECT_GT(file_size, 0); |
| + |
| + // Clean up. |
| + base::DeleteFile(full_file_name, false); |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
If you use some of the temporary file utilities in
terelius-chromium
2016/04/13 08:52:05
Acknowledged. The idea was to exercise the same co
|
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(WebrtcEventLogApiTest, |
| + TestStartTimedWebRtcEventLogging) { |
| + if (OnWinXp()) |
| + return; |
| + |
| + ASSERT_TRUE(embedded_test_server()->Start()); |
| + |
| + content::WebContents* left_tab = |
| + OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage); |
| + content::WebContents* right_tab = |
| + OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage); |
| + |
| + SetupPeerconnectionWithLocalStream(left_tab); |
| + SetupPeerconnectionWithLocalStream(right_tab); |
| + |
| + NegotiateCall(left_tab, right_tab, "VP8"); |
| + |
| + StartDetectingVideo(left_tab, "remote-view"); |
| + StartDetectingVideo(right_tab, "remote-view"); |
| + |
| + // Start the event log. RunFunctionAndReturnSingleResult will block until a |
| + // result is available, which happens when the logging stops after 1 second. |
| + const int seconds = 1; |
| + base::ListValue start_params; |
| + AppendTabIdAndUrl(&start_params, left_tab); |
| + start_params.AppendInteger(seconds); |
| + scoped_refptr<WebrtcLoggingPrivateStartWebRtcEventLoggingFunction> |
| + start_function(CreateFunction< |
| + WebrtcLoggingPrivateStartWebRtcEventLoggingFunction>()); |
| + scoped_ptr<base::Value> start_result(utils::RunFunctionAndReturnSingleResult( |
| + start_function.get(), ParamsToString(start_params), browser())); |
| + ASSERT_TRUE(start_result.get()); |
| + |
| + // Get the file name. |
| + scoped_ptr<extensions::api::webrtc_logging_private::RecordingInfo> |
| + recordings_info_start( |
| + extensions::api::webrtc_logging_private::RecordingInfo::FromValue( |
| + *start_result.get())); |
| + ASSERT_TRUE(recordings_info_start.get()); |
| + base::FilePath file_name_start( |
| + base::FilePath::FromUTF8Unsafe(recordings_info_start->prefix_path)); |
| + |
| +#if !defined(OS_MACOSX) |
| + // Video is choppy on Mac OS X. http://crbug.com/443542. |
| + WaitForVideoToPlay(left_tab); |
| + WaitForVideoToPlay(right_tab); |
| +#endif |
| + |
| + HangUp(left_tab); |
| + HangUp(right_tab); |
| + |
| + // The log has stopped automatically. Check that the file exists and is |
| + // non-empty. |
| + base::ProcessId render_process_id = |
| + base::GetProcId(left_tab->GetRenderProcessHost()->GetHandle()); |
| + EXPECT_NE(render_process_id, base::kNullProcessId); |
| + base::FilePath full_file_name = |
| + GetExpectedEventLogFileName(file_name_start, render_process_id); |
| + while (!base::PathExists(full_file_name)) { |
| + LOG(INFO) << "Waiting for logfile to become available..."; |
| + base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
|
tommi (sloooow) - chröme
2016/04/07 12:44:29
Use RunLoop instead
terelius-chromium
2016/04/13 08:52:04
There is currently no easy way to get a callback f
|
| + } |
| + int64_t file_size = 0; |
| + EXPECT_TRUE(base::GetFileSize(full_file_name, &file_size)); |
| + EXPECT_GT(file_size, 0); |
| + |
| + // Clean up. |
| + base::DeleteFile(full_file_name, false); |
| +} |