1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/command_line.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/media/webrtc_browsertest_base.h"
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/media/webrtc_browsertest_common.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/browser.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/browser_tabstrip.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/common/chrome_switches.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/in_process_browser_test.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/ui_test_utils.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/test/browser_test_utils.h"
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "media/base/media_switches.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest-param-test.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic const char kMainWebrtcTestHtmlPage[] =
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "/webrtc/webrtc_jsep01_test.html";
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char* kTestConfigFlags[] = {
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_WIN)
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switches::kForceDirectShowVideoCapture,
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Media Foundation is only available in Windows versions >= 7, below that the
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // following flag has no effect; the test would run twice using DirectShow.
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switches::kForceMediaFoundationVideoCapture
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX)
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switches::kForceQTKit,
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  switches::kEnableAVFoundation
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NULL
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// These tests runs on real webcams and ensure WebRTC can acquire webcams
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// correctly. They will do nothing if there are no webcams on the system.
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The webcam on the system must support up to 1080p, or the test will fail.
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class WebRtcWebcamBrowserTest : public WebRtcTestBase,
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    public testing::WithParamInterface<const char*> {
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(command_line->HasSwitch(
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        switches::kUseFakeDeviceForMediaStream));
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(command_line->HasSwitch(
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        switches::kUseFakeUIForMediaStream));
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (GetParam())
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      command_line->AppendSwitch(GetParam());
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    DetectErrorsInJavaScript();  // Look for errors in our rather complex js.
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string GetUserMediaAndGetStreamSize(content::WebContents* tab,
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                           const std::string& constraints) {
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GetUserMediaWithSpecificConstraintsAndAccept(tab, constraints);
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    StartDetectingVideo(tab, "local-view");
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    WaitForVideoToPlay(tab);
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    std::string actual_stream_size = GetStreamSize(tab, "local-view");
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    CloseLastLocalStream(tab);
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return actual_stream_size;
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool IsOnQtKit() const {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return GetParam() && std::string(GetParam()) == switches::kForceQTKit;
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return false;
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(WebRtcWebcamBrowserTest,
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       TestAcquiringAndReacquiringWebcam) {
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  content::WebContents* tab =
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!HasWebcamAvailableOnSystem(tab)) {
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    LOG(INFO) << "No webcam found on bot: skipping...";
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!IsOnQtKit()) {
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Temporarily disabled on QtKit due to http://crbug.com/375185.
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ("320x240",
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              GetUserMediaAndGetStreamSize(tab,
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                           kAudioVideoCallConstraintsQVGA));
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ("640x480",
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            GetUserMediaAndGetStreamSize(tab, kAudioVideoCallConstraintsVGA));
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ("640x360",
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            GetUserMediaAndGetStreamSize(tab, kAudioVideoCallConstraints360p));
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ("1280x720",
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            GetUserMediaAndGetStreamSize(tab, kAudioVideoCallConstraints720p));
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (IsOnQtKit())
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;  // QTKit only supports up to 720p.
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ("1920x1080",
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu            GetUserMediaAndGetStreamSize(tab, kAudioVideoCallConstraints1080p));
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(WebRtcWebcamBrowserTests,
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        WebRtcWebcamBrowserTest,
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        testing::ValuesIn(kTestConfigFlags));
113