1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/command_line.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/media/webrtc_browsertest_base.h"
8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/media/webrtc_browsertest_common.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/media_switches.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const char kMainWebrtcTestHtmlPage[] =
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    "/webrtc/webrtc_jsep01_test.html";
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Top-level integration test for WebRTC. It always uses fake devices; see
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// WebRtcWebcamBrowserTest for a test that acquires any real webcam on the
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// system.
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebRtcBrowserTest : public WebRtcTestBase {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DetectErrorsInJavaScript();  // Look for errors in our rather complex js.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Ensure the infobar is enabled, since we expect that in this test.
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(command_line->HasSwitch(switches::kUseFakeUIForMediaStream));
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Always use fake devices.
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Flag used by TestWebAudioMediaStream to force garbage collection.
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_CHROMEOS)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396505
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_RunsAudioVideoWebRTCCallInTwoTabs \
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    DISABLED_RunsAudioVideoWebRTCCallInTwoTabs
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_RunsAudioVideoWebRTCCallInTwoTabs RunsAudioVideoWebRTCCallInTwoTabs
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebRtcBrowserTest,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       MAYBE_RunsAudioVideoWebRTCCallInTwoTabs) {
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (OnWinXp()) return;
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::WebContents* left_tab =
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::WebContents* right_tab =
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      OpenTestPageAndGetUserMediaInNewTab(kMainWebrtcTestHtmlPage);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupPeerconnectionWithLocalStream(left_tab);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupPeerconnectionWithLocalStream(right_tab);
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NegotiateCall(left_tab, right_tab);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartDetectingVideo(left_tab, "remote-view");
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartDetectingVideo(right_tab, "remote-view");
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WaitForVideoToPlay(left_tab);
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WaitForVideoToPlay(right_tab);
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  HangUp(left_tab);
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  HangUp(right_tab);
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
76116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(WebRtcBrowserTest, TestWebAudioMediaStream) {
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This tests against crash regressions for the WebAudio-MediaStream
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // integration.
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (OnWinXp()) return;
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GURL url(embedded_test_server()->GetURL("/webrtc/webaudio_crash.html"));
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content::WebContents* tab =
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A sleep is necessary to be able to detect the crash.
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  test::SleepInJavascript(tab, 1000);
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_FALSE(tab->IsCrashed());
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
92