OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
phoglund_chromium
2014/05/20 12:43:40
This code pretty much moved straight out of chrome
| |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/command_line.h" | |
6 #include "base/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" | |
27 | |
28 static const char kMainWebrtcTestHtmlPage[] = | |
29 "/webrtc/webrtc_jsep01_test.html"; | |
30 | |
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. | |
38 } | |
39 | |
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)); | |
43 | |
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); | |
51 } | |
52 | |
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); | |
61 | |
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; | |
66 | |
67 return NULL; | |
68 } | |
69 | |
70 const base::DictionaryValue* GetDataOnFirstPeerConnection( | |
71 const base::DictionaryValue* all_data) { | |
72 base::DictionaryValue::Iterator iterator(*all_data); | |
73 | |
74 const base::DictionaryValue* result; | |
75 if (!iterator.IsAtEnd() && iterator.value().GetAsDictionary(&result)) | |
76 return result; | |
77 | |
78 return NULL; | |
79 } | |
80 }; | |
81 | |
82 // This is manual for its long execution time. | |
83 IN_PROC_BROWSER_TEST_F(WebRtcPerfBrowserTest, | |
84 MANUAL_RunsAudioVideoCall60SecsAndLogsInternalMetrics) { | |
85 if (OnWinXp()) return; | |
86 | |
87 ASSERT_TRUE(test::HasReferenceFilesInCheckout()); | |
88 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
89 | |
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."; | |
93 | |
94 content::WebContents* left_tab = | |
95 OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage); | |
96 content::WebContents* right_tab = | |
97 OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage); | |
98 | |
99 SetupPeerconnectionWithLocalStream(left_tab); | |
100 SetupPeerconnectionWithLocalStream(right_tab); | |
101 | |
102 NegotiateCall(left_tab, right_tab); | |
103 | |
104 StartDetectingVideo(left_tab, "remote-view"); | |
105 StartDetectingVideo(right_tab, "remote-view"); | |
106 | |
107 WaitForVideoToPlay(left_tab); | |
108 WaitForVideoToPlay(right_tab); | |
109 | |
110 // Let values stabilize, bandwidth ramp up, etc. | |
111 test::SleepInJavascript(left_tab, 60000); | |
112 | |
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(); | |
118 | |
119 test::SleepInJavascript(left_tab, 10000); | |
120 | |
121 scoped_ptr<base::DictionaryValue> all_data( | |
122 GetWebrtcInternalsData(webrtc_internals_tab)); | |
123 ASSERT_TRUE(all_data.get() != NULL); | |
124 | |
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); | |
130 | |
131 HangUp(left_tab); | |
132 HangUp(right_tab); | |
133 } | |
OLD | NEW |