Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / media / chrome_webrtc_perf_browsertest.cc
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.
4
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"
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   void SetUpInProcessBrowserTestFixture() override {
37     DetectErrorsInJavaScript();  // Look for errors in our rather complex js.
38   }
39
40   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 }