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