| Index: content/browser/renderer_host/media/video_capture_host_unittest.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_host_unittest.cc b/content/browser/renderer_host/media/video_capture_host_unittest.cc
|
| deleted file mode 100644
|
| index 48679a438720af110c5db3950106075e50535f33..0000000000000000000000000000000000000000
|
| --- a/content/browser/renderer_host/media/video_capture_host_unittest.cc
|
| +++ /dev/null
|
| @@ -1,362 +0,0 @@
|
| -// Copyright (c) 2012 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 "content/browser/renderer_host/media/video_capture_host.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <map>
|
| -#include <memory>
|
| -#include <string>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/location.h"
|
| -#include "base/macros.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#include "build/build_config.h"
|
| -#include "content/browser/browser_thread_impl.h"
|
| -#include "content/browser/renderer_host/media/media_stream_manager.h"
|
| -#include "content/browser/renderer_host/media/media_stream_requester.h"
|
| -#include "content/browser/renderer_host/media/video_capture_manager.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "content/public/test/mock_resource_context.h"
|
| -#include "content/public/test/test_browser_context.h"
|
| -#include "content/public/test/test_browser_thread_bundle.h"
|
| -#include "content/test/test_content_browser_client.h"
|
| -#include "media/audio/mock_audio_manager.h"
|
| -#include "media/base/media_switches.h"
|
| -#include "media/base/video_capture_types.h"
|
| -#include "mojo/public/cpp/bindings/binding.h"
|
| -#include "net/url_request/url_request_context.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using ::testing::_;
|
| -using ::testing::AnyNumber;
|
| -using ::testing::DoAll;
|
| -using ::testing::InSequence;
|
| -using ::testing::Mock;
|
| -using ::testing::Return;
|
| -using ::testing::SaveArg;
|
| -using ::testing::StrictMock;
|
| -
|
| -namespace content {
|
| -
|
| -// Id used to identify the capture session between renderer and
|
| -// video_capture_host. This is an arbitrary value.
|
| -static const int kDeviceId = 555;
|
| -
|
| -class MockMediaStreamRequester : public MediaStreamRequester {
|
| - public:
|
| - MockMediaStreamRequester() {}
|
| - virtual ~MockMediaStreamRequester() {}
|
| -
|
| - // MediaStreamRequester implementation.
|
| - MOCK_METHOD5(StreamGenerated,
|
| - void(int render_frame_id,
|
| - int page_request_id,
|
| - const std::string& label,
|
| - const StreamDeviceInfoArray& audio_devices,
|
| - const StreamDeviceInfoArray& video_devices));
|
| - MOCK_METHOD3(StreamGenerationFailed,
|
| - void(int render_frame_id,
|
| - int page_request_id,
|
| - content::MediaStreamRequestResult result));
|
| - MOCK_METHOD3(DeviceStopped, void(int render_frame_id,
|
| - const std::string& label,
|
| - const StreamDeviceInfo& device));
|
| - MOCK_METHOD4(DevicesEnumerated, void(int render_frame_id,
|
| - int page_request_id,
|
| - const std::string& label,
|
| - const StreamDeviceInfoArray& devices));
|
| - MOCK_METHOD4(DeviceOpened, void(int render_frame_id,
|
| - int page_request_id,
|
| - const std::string& label,
|
| - const StreamDeviceInfo& device_info));
|
| - MOCK_METHOD1(DevicesChanged, void(MediaStreamType type));
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(MockMediaStreamRequester);
|
| -};
|
| -
|
| -ACTION_P2(ExitMessageLoop, task_runner, quit_closure) {
|
| - task_runner->PostTask(FROM_HERE, quit_closure);
|
| -}
|
| -
|
| -// This is an integration test of VideoCaptureHost in conjunction with
|
| -// MediaStreamManager, VideoCaptureManager, VideoCaptureController, and
|
| -// VideoCaptureDevice.
|
| -class VideoCaptureHostTest : public testing::Test,
|
| - public mojom::VideoCaptureObserver {
|
| - public:
|
| - VideoCaptureHostTest()
|
| - : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
|
| - audio_manager_(
|
| - new media::MockAudioManager(base::ThreadTaskRunnerHandle::Get())),
|
| - task_runner_(base::ThreadTaskRunnerHandle::Get()),
|
| - opened_session_id_(kInvalidMediaCaptureSessionId),
|
| - observer_binding_(this) {}
|
| -
|
| - void SetUp() override {
|
| - SetBrowserClientForTesting(&browser_client_);
|
| -
|
| - base::CommandLine::ForCurrentProcess()->AppendSwitch(
|
| - switches::kUseFakeDeviceForMediaStream);
|
| - base::CommandLine::ForCurrentProcess()->AppendSwitch(
|
| - switches::kUseFakeUIForMediaStream);
|
| - media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
|
| -
|
| - // Create a Host and connect it to a simulated IPC channel.
|
| - host_.reset(new VideoCaptureHost(media_stream_manager_.get()));
|
| -
|
| - OpenSession();
|
| - }
|
| -
|
| - void TearDown() override {
|
| - Mock::VerifyAndClearExpectations(host_.get());
|
| - EXPECT_TRUE(host_->controllers_.empty());
|
| -
|
| - CloseSession();
|
| -
|
| - // Release the reference to the mock object. The object will be destructed
|
| - // on the current message loop.
|
| - host_ = nullptr;
|
| - }
|
| -
|
| - void OpenSession() {
|
| - const int render_process_id = 1;
|
| - const int render_frame_id = 1;
|
| - const int page_request_id = 1;
|
| - const url::Origin security_origin(GURL("http://test.com"));
|
| -
|
| - ASSERT_TRUE(opened_device_label_.empty());
|
| -
|
| - // Enumerate video devices.
|
| - StreamDeviceInfoArray devices;
|
| - {
|
| - base::RunLoop run_loop;
|
| - std::string label = media_stream_manager_->EnumerateDevices(
|
| - &stream_requester_,
|
| - render_process_id,
|
| - render_frame_id,
|
| - browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
|
| - page_request_id,
|
| - MEDIA_DEVICE_VIDEO_CAPTURE,
|
| - security_origin);
|
| - EXPECT_CALL(stream_requester_,
|
| - DevicesEnumerated(render_frame_id, page_request_id, label, _))
|
| - .Times(1)
|
| - .WillOnce(DoAll(ExitMessageLoop(task_runner_, run_loop.QuitClosure()),
|
| - SaveArg<3>(&devices)));
|
| - run_loop.Run();
|
| - Mock::VerifyAndClearExpectations(&stream_requester_);
|
| - media_stream_manager_->CancelRequest(label);
|
| - }
|
| - ASSERT_FALSE(devices.empty());
|
| - ASSERT_EQ(StreamDeviceInfo::kNoId, devices[0].session_id);
|
| -
|
| - // Open the first device.
|
| - {
|
| - base::RunLoop run_loop;
|
| - StreamDeviceInfo opened_device;
|
| - media_stream_manager_->OpenDevice(
|
| - &stream_requester_,
|
| - render_process_id,
|
| - render_frame_id,
|
| - browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
|
| - page_request_id,
|
| - devices[0].device.id,
|
| - MEDIA_DEVICE_VIDEO_CAPTURE,
|
| - security_origin);
|
| - EXPECT_CALL(stream_requester_,
|
| - DeviceOpened(render_frame_id, page_request_id, _, _))
|
| - .Times(1)
|
| - .WillOnce(DoAll(ExitMessageLoop(task_runner_, run_loop.QuitClosure()),
|
| - SaveArg<2>(&opened_device_label_),
|
| - SaveArg<3>(&opened_device)));
|
| - run_loop.Run();
|
| - Mock::VerifyAndClearExpectations(&stream_requester_);
|
| - ASSERT_NE(StreamDeviceInfo::kNoId, opened_device.session_id);
|
| - opened_session_id_ = opened_device.session_id;
|
| - }
|
| - }
|
| -
|
| - void CloseSession() {
|
| - if (opened_device_label_.empty())
|
| - return;
|
| - media_stream_manager_->CancelRequest(opened_device_label_);
|
| - opened_device_label_.clear();
|
| - opened_session_id_ = kInvalidMediaCaptureSessionId;
|
| - }
|
| -
|
| - protected:
|
| - // mojom::VideoCaptureObserver implementation.
|
| - MOCK_METHOD1(OnStateChanged, void(mojom::VideoCaptureState));
|
| - void OnBufferCreated(int32_t buffer_id,
|
| - mojo::ScopedSharedBufferHandle handle) override {
|
| - DoOnBufferCreated(buffer_id);
|
| - }
|
| - MOCK_METHOD1(DoOnBufferCreated, void(int32_t));
|
| - void OnBufferReady(int32_t buffer_id,
|
| - mojom::VideoFrameInfoPtr info) override {
|
| - DoOnBufferReady(buffer_id);
|
| - }
|
| - MOCK_METHOD1(DoOnBufferReady, void(int32_t));
|
| - MOCK_METHOD1(OnBufferDestroyed, void(int32_t));
|
| -
|
| - void StartCapture() {
|
| - base::RunLoop run_loop;
|
| - media::VideoCaptureParams params;
|
| - params.requested_format = media::VideoCaptureFormat(
|
| - gfx::Size(352, 288), 30, media::PIXEL_FORMAT_I420);
|
| -
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::STARTED));
|
| - EXPECT_CALL(*this, DoOnBufferCreated(_))
|
| - .Times(AnyNumber())
|
| - .WillRepeatedly(Return());
|
| - EXPECT_CALL(*this, DoOnBufferReady(_))
|
| - .Times(AnyNumber())
|
| - .WillRepeatedly(ExitMessageLoop(task_runner_, run_loop.QuitClosure()));
|
| -
|
| - host_->Start(kDeviceId, opened_session_id_, params,
|
| - observer_binding_.CreateInterfacePtrAndBind());
|
| -
|
| - run_loop.Run();
|
| - }
|
| -
|
| - void StartAndImmediateStopCapture() {
|
| - // Quickly start and then stop capture, without giving much chance for
|
| - // asynchronous capture operations to produce frames.
|
| - InSequence s;
|
| - base::RunLoop run_loop;
|
| -
|
| - media::VideoCaptureParams params;
|
| - params.requested_format = media::VideoCaptureFormat(
|
| - gfx::Size(352, 288), 30, media::PIXEL_FORMAT_I420);
|
| -
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::STARTED));
|
| - host_->Start(kDeviceId, opened_session_id_, params,
|
| - observer_binding_.CreateInterfacePtrAndBind());
|
| -
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::STOPPED));
|
| - host_->Stop(kDeviceId);
|
| - run_loop.RunUntilIdle();
|
| - }
|
| -
|
| - void PauseResumeCapture() {
|
| - InSequence s;
|
| - base::RunLoop run_loop;
|
| -
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::PAUSED));
|
| - host_->Pause(kDeviceId);
|
| -
|
| - media::VideoCaptureParams params;
|
| - params.requested_format = media::VideoCaptureFormat(
|
| - gfx::Size(352, 288), 30, media::PIXEL_FORMAT_I420);
|
| -
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::RESUMED));
|
| - host_->Resume(kDeviceId, opened_session_id_, params);
|
| - run_loop.RunUntilIdle();
|
| - }
|
| -
|
| - void StopCapture() {
|
| - base::RunLoop run_loop;
|
| -
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::STOPPED))
|
| - .WillOnce(ExitMessageLoop(task_runner_, run_loop.QuitClosure()));
|
| - host_->Stop(kDeviceId);
|
| -
|
| - run_loop.Run();
|
| -
|
| - EXPECT_TRUE(host_->controllers_.empty());
|
| - }
|
| -
|
| - void WaitForOneCapturedBuffer() {
|
| - base::RunLoop run_loop;
|
| -
|
| - EXPECT_CALL(*this, DoOnBufferReady(_))
|
| - .Times(AnyNumber())
|
| - .WillOnce(ExitMessageLoop(task_runner_, run_loop.QuitClosure()))
|
| - .RetiresOnSaturation();
|
| - run_loop.Run();
|
| - }
|
| -
|
| - void SimulateError() {
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::FAILED));
|
| - VideoCaptureControllerID id(kDeviceId);
|
| - host_->OnError(id);
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| -
|
| - private:
|
| - // |media_stream_manager_| needs to outlive |thread_bundle_| because it is a
|
| - // MessageLoop::DestructionObserver.
|
| - StrictMock<MockMediaStreamRequester> stream_requester_;
|
| - std::unique_ptr<MediaStreamManager> media_stream_manager_;
|
| - const content::TestBrowserThreadBundle thread_bundle_;
|
| - // |audio_manager_| needs to outlive |thread_bundle_| because it uses the
|
| - // underlying message loop.
|
| - media::ScopedAudioManagerPtr audio_manager_;
|
| - content::TestBrowserContext browser_context_;
|
| - content::TestContentBrowserClient browser_client_;
|
| - const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| - int opened_session_id_;
|
| - std::string opened_device_label_;
|
| -
|
| - std::unique_ptr<VideoCaptureHost> host_;
|
| - mojo::Binding<mojom::VideoCaptureObserver> observer_binding_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(VideoCaptureHostTest);
|
| -};
|
| -
|
| -// Construct and destruct all objects. This is a non trivial sequence.
|
| -TEST_F(VideoCaptureHostTest, ConstructAndDestruct) {}
|
| -
|
| -TEST_F(VideoCaptureHostTest, StartAndImmediateStop) {
|
| - StartAndImmediateStopCapture();
|
| -}
|
| -
|
| -TEST_F(VideoCaptureHostTest, StartAndCaptureAndStop) {
|
| - StartCapture();
|
| - WaitForOneCapturedBuffer();
|
| - WaitForOneCapturedBuffer();
|
| - StopCapture();
|
| -}
|
| -
|
| -TEST_F(VideoCaptureHostTest, StartAndErrorAndStop) {
|
| - StartCapture();
|
| - SimulateError();
|
| - StopCapture();
|
| -}
|
| -
|
| -TEST_F(VideoCaptureHostTest, StartAndCaptureAndError) {
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::STOPPED))
|
| - .Times(0);
|
| - StartCapture();
|
| - WaitForOneCapturedBuffer();
|
| - SimulateError();
|
| - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
|
| -}
|
| -
|
| -TEST_F(VideoCaptureHostTest, StartAndPauseAndResumeAndStop) {
|
| - StartCapture();
|
| - PauseResumeCapture();
|
| - StopCapture();
|
| -}
|
| -
|
| -TEST_F(VideoCaptureHostTest, CloseSessionWithoutStopping) {
|
| - StartCapture();
|
| -
|
| - // When the session is closed via the stream without stopping capture, the
|
| - // ENDED event is sent.
|
| - EXPECT_CALL(*this, OnStateChanged(mojom::VideoCaptureState::ENDED));
|
| - CloseSession();
|
| - base::RunLoop().RunUntilIdle();
|
| -}
|
| -
|
| -} // namespace content
|
|
|