1// Copyright 2013 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/strings/stringprintf.h"
7#include "chrome/browser/media/webrtc_browsertest_base.h"
8#include "chrome/browser/media/webrtc_browsertest_common.h"
9#include "chrome/browser/ui/browser.h"
10#include "chrome/browser/ui/browser_tabstrip.h"
11#include "chrome/browser/ui/tabs/tab_strip_model.h"
12#include "chrome/common/chrome_switches.h"
13#include "chrome/test/base/in_process_browser_test.h"
14#include "chrome/test/base/ui_test_utils.h"
15#include "content/public/test/browser_test_utils.h"
16#include "media/base/media_switches.h"
17#include "net/test/embedded_test_server/embedded_test_server.h"
18
19static const char kMainWebrtcTestHtmlPage[] =
20    "/webrtc/webrtc_jsep01_test.html";
21
22// Top-level integration test for WebRTC. It always uses fake devices; see
23// WebRtcWebcamBrowserTest for a test that acquires any real webcam on the
24// system.
25class WebRtcBrowserTest : public WebRtcTestBase {
26 public:
27  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
28    DetectErrorsInJavaScript();  // Look for errors in our rather complex js.
29  }
30
31  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
32    // Ensure the infobar is enabled, since we expect that in this test.
33    EXPECT_FALSE(command_line->HasSwitch(switches::kUseFakeUIForMediaStream));
34
35    // Always use fake devices.
36    command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
37
38    // Flag used by TestWebAudioMediaStream to force garbage collection.
39    command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
40  }
41};
42
43#if defined(OS_WIN) || defined(OS_CHROMEOS)
44// http://crbug.com/396505
45#define MAYBE_RunsAudioVideoWebRTCCallInTwoTabs \
46    DISABLED_RunsAudioVideoWebRTCCallInTwoTabs
47#else
48#define MAYBE_RunsAudioVideoWebRTCCallInTwoTabs RunsAudioVideoWebRTCCallInTwoTabs
49#endif
50IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
51                       MAYBE_RunsAudioVideoWebRTCCallInTwoTabs) {
52  if (OnWinXp()) return;
53
54  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
55
56  content::WebContents* left_tab =
57      OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
58  content::WebContents* right_tab =
59      OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
60
61  SetupPeerconnectionWithLocalStream(left_tab);
62  SetupPeerconnectionWithLocalStream(right_tab);
63
64  NegotiateCall(left_tab, right_tab);
65
66  StartDetectingVideo(left_tab, "remote-view");
67  StartDetectingVideo(right_tab, "remote-view");
68
69  WaitForVideoToPlay(left_tab);
70  WaitForVideoToPlay(right_tab);
71
72  HangUp(left_tab);
73  HangUp(right_tab);
74}
75
76IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, TestWebAudioMediaStream) {
77  // This tests against crash regressions for the WebAudio-MediaStream
78  // integration.
79  if (OnWinXp()) return;
80
81  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
82  GURL url(embedded_test_server()->GetURL("/webrtc/webaudio_crash.html"));
83  ui_test_utils::NavigateToURL(browser(), url);
84  content::WebContents* tab =
85      browser()->tab_strip_model()->GetActiveWebContents();
86
87  // A sleep is necessary to be able to detect the crash.
88  test::SleepInJavascript(tab, 1000);
89
90  ASSERT_FALSE(tab->IsCrashed());
91}
92