Hotword Audio Verification App: Adds to hotwordPrivate API
[chromium-blink-merge.git] / chrome / browser / media / chrome_webrtc_perf_browsertest.cc
blob368bad92cb09cbd96327792f3215c149752a889c
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/command_line.h"
6 #include "base/files/file_util.h"
7 #include "base/json/json_reader.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/string_split.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/test/test_timeouts.h"
12 #include "base/time/time.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/media/webrtc_browsertest_base.h"
15 #include "chrome/browser/media/webrtc_browsertest_common.h"
16 #include "chrome/browser/media/webrtc_browsertest_perf.h"
17 #include "chrome/browser/ui/browser.h"
18 #include "chrome/browser/ui/browser_tabstrip.h"
19 #include "chrome/browser/ui/tabs/tab_strip_model.h"
20 #include "chrome/common/chrome_switches.h"
21 #include "chrome/test/base/in_process_browser_test.h"
22 #include "chrome/test/base/ui_test_utils.h"
23 #include "content/public/test/browser_test_utils.h"
24 #include "media/base/media_switches.h"
25 #include "net/test/embedded_test_server/embedded_test_server.h"
26 #include "testing/perf/perf_test.h"
28 static const char kMainWebrtcTestHtmlPage[] =
29 "/webrtc/webrtc_jsep01_test.html";
31 // Performance browsertest for WebRTC. This test is manual since it takes long
32 // to execute and requires the reference files provided by the webrtc.DEPS
33 // solution (which is only available on WebRTC internal bots).
34 class WebRtcPerfBrowserTest : public WebRtcTestBase {
35 public:
36 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
37 DetectErrorsInJavaScript(); // Look for errors in our rather complex js.
40 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
41 // Ensure the infobar is enabled, since we expect that in this test.
42 EXPECT_FALSE(command_line->HasSwitch(switches::kUseFakeUIForMediaStream));
44 // Play a suitable, somewhat realistic video file.
45 base::FilePath input_video = test::GetReferenceFilesDir()
46 .Append(test::kReferenceFileName360p)
47 .AddExtension(test::kY4mFileExtension);
48 command_line->AppendSwitchPath(switches::kUseFileForFakeVideoCapture,
49 input_video);
50 command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
53 // Tries to extract data from peerConnectionDataStore in the webrtc-internals
54 // tab. The caller owns the parsed data. Returns NULL on failure.
55 base::DictionaryValue* GetWebrtcInternalsData(
56 content::WebContents* webrtc_internals_tab) {
57 std::string all_stats_json = ExecuteJavascript(
58 "window.domAutomationController.send("
59 " JSON.stringify(peerConnectionDataStore));",
60 webrtc_internals_tab);
62 base::Value* parsed_json = base::JSONReader::Read(all_stats_json);
63 base::DictionaryValue* result;
64 if (parsed_json && parsed_json->GetAsDictionary(&result))
65 return result;
67 return NULL;
70 const base::DictionaryValue* GetDataOnFirstPeerConnection(
71 const base::DictionaryValue* all_data) {
72 base::DictionaryValue::Iterator iterator(*all_data);
74 const base::DictionaryValue* result;
75 if (!iterator.IsAtEnd() && iterator.value().GetAsDictionary(&result))
76 return result;
78 return NULL;
82 // This is manual for its long execution time.
83 IN_PROC_BROWSER_TEST_F(WebRtcPerfBrowserTest,
84 MANUAL_RunsAudioVideoCall60SecsAndLogsInternalMetrics) {
85 if (OnWinXp()) return;
87 ASSERT_TRUE(test::HasReferenceFilesInCheckout());
88 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
90 ASSERT_GE(TestTimeouts::action_max_timeout().InSeconds(), 100) <<
91 "This is a long-running test; you must specify "
92 "--ui-test-action-max-timeout to have a value of at least 100000.";
94 content::WebContents* left_tab =
95 OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
96 content::WebContents* right_tab =
97 OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
99 SetupPeerconnectionWithLocalStream(left_tab);
100 SetupPeerconnectionWithLocalStream(right_tab);
102 NegotiateCall(left_tab, right_tab);
104 StartDetectingVideo(left_tab, "remote-view");
105 StartDetectingVideo(right_tab, "remote-view");
107 WaitForVideoToPlay(left_tab);
108 WaitForVideoToPlay(right_tab);
110 // Let values stabilize, bandwidth ramp up, etc.
111 test::SleepInJavascript(left_tab, 60000);
113 // Start measurements.
114 chrome::AddTabAt(browser(), GURL(), -1, true);
115 ui_test_utils::NavigateToURL(browser(), GURL("chrome://webrtc-internals"));
116 content::WebContents* webrtc_internals_tab =
117 browser()->tab_strip_model()->GetActiveWebContents();
119 test::SleepInJavascript(left_tab, 10000);
121 scoped_ptr<base::DictionaryValue> all_data(
122 GetWebrtcInternalsData(webrtc_internals_tab));
123 ASSERT_TRUE(all_data.get() != NULL);
125 const base::DictionaryValue* first_pc_dict =
126 GetDataOnFirstPeerConnection(all_data.get());
127 ASSERT_TRUE(first_pc_dict != NULL);
128 test::PrintBweForVideoMetrics(*first_pc_dict);
129 test::PrintMetricsForAllStreams(*first_pc_dict);
131 HangUp(left_tab);
132 HangUp(right_tab);