blob: fa0e532948089babb2454650c10b008ac303ba9f [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/command_line.h"
#include "build/build_config.h"
#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
#include "chrome/browser/media/webrtc/webrtc_browsertest_common.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_features.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "media/base/media_switches.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest/include/gtest/gtest-param-test.h"
static const char kMainWebrtcTestHtmlPage[] =
"/webrtc/webrtc_jsep01_test.html";
enum class TargetVideoCaptureImplementation {
DEFAULT,
#if defined(OS_WIN)
WIN_MEDIA_FOUNDATION
#endif
};
const TargetVideoCaptureImplementation kTargetVideoCaptureImplementations[] = {
TargetVideoCaptureImplementation::DEFAULT,
#if defined(OS_WIN)
TargetVideoCaptureImplementation::WIN_MEDIA_FOUNDATION
#endif
};
// These tests runs on real webcams and ensure WebRTC can acquire webcams
// correctly. They will do nothing if there are no webcams on the system.
// The webcam on the system must support up to 1080p, or the test will fail.
// This test is excellent for testing the various capture paths of WebRTC
// on all desktop platforms.
class WebRtcWebcamBrowserTest
: public WebRtcTestBase,
public testing::WithParamInterface<TargetVideoCaptureImplementation> {
public:
WebRtcWebcamBrowserTest() {
#if defined(OS_WIN)
if (GetParam() == TargetVideoCaptureImplementation::WIN_MEDIA_FOUNDATION) {
scoped_feature_list_.InitAndEnableFeature(
media::kMediaFoundationVideoCapture);
} else {
scoped_feature_list_.InitAndDisableFeature(
media::kMediaFoundationVideoCapture);
}
#endif
}
void SetUpCommandLine(base::CommandLine* command_line) override {
EXPECT_FALSE(command_line->HasSwitch(
switches::kUseFakeDeviceForMediaStream));
EXPECT_FALSE(command_line->HasSwitch(
switches::kUseFakeUIForMediaStream));
}
protected:
void SetUpInProcessBrowserTestFixture() override {
DetectErrorsInJavaScript(); // Look for errors in our rather complex js.
}
std::string GetUserMediaAndGetStreamSize(content::WebContents* tab,
const std::string& constraints) {
std::string actual_stream_size;
if (GetUserMediaWithSpecificConstraintsAndAcceptIfPrompted(tab,
constraints)) {
StartDetectingVideo(tab, "local-view");
if (WaitForVideoToPlay(tab))
actual_stream_size = GetStreamSize(tab, "local-view");
CloseLastLocalStream(tab);
}
return actual_stream_size;
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
// This test is manual because the test results can vary heavily depending on
// which webcam or drivers you have on the system.
IN_PROC_BROWSER_TEST_P(WebRtcWebcamBrowserTest,
MANUAL_TestAcquiringAndReacquiringWebcam) {
ASSERT_TRUE(embedded_test_server()->Start());
GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
ui_test_utils::NavigateToURL(browser(), url);
content::WebContents* tab =
browser()->tab_strip_model()->GetActiveWebContents();
if (!content::IsWebcamAvailableOnSystem(tab)) {
DVLOG(0) << "No webcam found on bot: skipping...";
return;
}
EXPECT_EQ("320x240",
GetUserMediaAndGetStreamSize(tab, kVideoCallConstraintsQVGA));
EXPECT_EQ("640x480",
GetUserMediaAndGetStreamSize(tab, kVideoCallConstraintsVGA));
EXPECT_EQ("640x360",
GetUserMediaAndGetStreamSize(tab, kVideoCallConstraints360p));
EXPECT_EQ("1280x720",
GetUserMediaAndGetStreamSize(tab, kVideoCallConstraints720p));
EXPECT_EQ("1920x1080",
GetUserMediaAndGetStreamSize(tab, kVideoCallConstraints1080p));
}
INSTANTIATE_TEST_CASE_P(WebRtcWebcamBrowserTests,
WebRtcWebcamBrowserTest,
testing::ValuesIn(kTargetVideoCaptureImplementations));