Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: content/browser/renderer_host/media/video_capture_controller_unittest.cc

Issue 10391065: handle the case when device is closed before media pipeline is fully initialized. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: code review Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/media/video_capture_controller_unittest.cc
===================================================================
--- content/browser/renderer_host/media/video_capture_controller_unittest.cc (revision 0)
+++ content/browser/renderer_host/media/video_capture_controller_unittest.cc (revision 0)
@@ -0,0 +1,268 @@
+// 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.
+
+// Unit test for VideoCaptureController.
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
+#include "base/process_util.h"
+#include "content/browser/browser_thread_impl.h"
+#include "content/browser/renderer_host/media/media_stream_provider.h"
+#include "content/browser/renderer_host/media/video_capture_controller.h"
+#include "content/browser/renderer_host/media/video_capture_manager.h"
+#include "content/common/media/media_stream_options.h"
+#include "media/video/capture/fake_video_capture_device.h"
+#include "media/video/capture/video_capture_device.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::AnyNumber;
+using ::testing::AtLeast;
+using ::testing::InSequence;
+using ::testing::Return;
+using content::BrowserThread;
+using content::BrowserThreadImpl;
+
+enum { kDeviceId = 1 };
+
+ACTION_P5(StopCapture, controller, controller_id, controller_handler, flag,
+ message_loop) {
+ message_loop->PostTask(FROM_HERE,
+ base::Bind(&VideoCaptureController::StopCapture,
+ controller, controller_id, controller_handler, flag));
+ message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure());
+}
+
+ACTION_P3(StopSession, controller, session_id, message_loop) {
+ message_loop->PostTask(FROM_HERE,
+ base::Bind(&VideoCaptureController::StopSession,
+ controller, session_id));
+ message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure());
+}
+
+class MockVideoCaptureControllerEventHandler
+ : public VideoCaptureControllerEventHandler {
+ public:
+ MockVideoCaptureControllerEventHandler(VideoCaptureController* controller,
+ MessageLoop* message_loop)
+ : controller_(controller),
+ message_loop_(message_loop),
+ controller_id_(kDeviceId),
+ process_handle_(base::kNullProcessHandle) {
+ }
+ virtual ~MockVideoCaptureControllerEventHandler() {}
+
+ MOCK_METHOD1(DoBufferCreated, void(const VideoCaptureControllerID&));
+ MOCK_METHOD1(DoBufferReady, void(const VideoCaptureControllerID&));
+ MOCK_METHOD1(DoFrameInfo, void(const VideoCaptureControllerID&));
+ MOCK_METHOD1(DoPaused, void(const VideoCaptureControllerID&));
+
+ virtual void OnError(const VideoCaptureControllerID& id) OVERRIDE {}
+ virtual void OnBufferCreated(const VideoCaptureControllerID& id,
+ base::SharedMemoryHandle handle,
+ int length, int buffer_id) OVERRIDE {
+ EXPECT_EQ(id, controller_id_);
+ DoBufferCreated(id);
+ }
+ virtual void OnBufferReady(const VideoCaptureControllerID& id,
+ int buffer_id,
+ base::Time timestamp) OVERRIDE {
+ EXPECT_EQ(id, controller_id_);
+ DoBufferReady(id);
+ message_loop_->PostTask(FROM_HERE,
+ base::Bind(&VideoCaptureController::ReturnBuffer,
+ controller_, controller_id_, this, buffer_id));
+ }
+ virtual void OnFrameInfo(const VideoCaptureControllerID& id,
+ int width,
+ int height,
+ int frame_per_second) OVERRIDE {
+ EXPECT_EQ(id, controller_id_);
+ DoFrameInfo(id);
+ }
+ virtual void OnPaused(const VideoCaptureControllerID& id) OVERRIDE {
+ EXPECT_EQ(id, controller_id_);
+ DoPaused(id);
+ }
+ virtual void OnReadyToDelete(const VideoCaptureControllerID& id) OVERRIDE {}
+
+ scoped_refptr<VideoCaptureController> controller_;
+ MessageLoop* message_loop_;
+ VideoCaptureControllerID controller_id_;
+ base::ProcessHandle process_handle_;
+};
+
+class MockVideoCaptureManager
+ : public media_stream::VideoCaptureManager {
+ public:
+ MockVideoCaptureManager()
+ : video_session_id_(kStartOpenSessionId) {}
+
+ void Init() {
+ device_name_.unique_id = "/dev/video0";
+ device_name_.device_name = "fake_device_0";
+
+ video_capture_device_.reset(
+ media::FakeVideoCaptureDevice::Create(device_name_));
+ ASSERT_TRUE(video_capture_device_.get() != NULL);
+ }
+
+ MOCK_METHOD3(StartCapture, void(int, int,
+ media::VideoCaptureDevice::EventHandler*));
+ MOCK_METHOD1(StopCapture, void(const media::VideoCaptureSessionId&));
+
+ void Start(const media::VideoCaptureParams& capture_params,
+ media::VideoCaptureDevice::EventHandler* vc_receiver) OVERRIDE {
+ StartCapture(capture_params.width, capture_params.height, vc_receiver);
+ video_capture_device_->Allocate(capture_params.width, capture_params.height,
+ capture_params.frame_per_second,
+ vc_receiver);
+ video_capture_device_->Start();
+ }
+
+ void Stop(const media::VideoCaptureSessionId& capture_session_id,
+ base::Closure stopped_cb) OVERRIDE {
+ StopCapture(capture_session_id);
+ video_capture_device_->Stop();
+ video_capture_device_->DeAllocate();
+ }
+
+ void Error(const media::VideoCaptureSessionId& capture_session_id) OVERRIDE {
+ }
+
+ int video_session_id_;
+ media::VideoCaptureDevice::Name device_name_;
+ scoped_ptr<media::VideoCaptureDevice> video_capture_device_;
+
+ private:
+ virtual ~MockVideoCaptureManager() {}
+ DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureManager);
+};
+
+// Test class.
+class VideoCaptureControllerTest : public testing::Test {
+ public:
+ VideoCaptureControllerTest() {}
+ virtual ~VideoCaptureControllerTest() {}
+
+ protected:
+ virtual void SetUp() {
+ message_loop_.reset(new MessageLoop(MessageLoop::TYPE_IO));
+ io_thread_.reset(new BrowserThreadImpl(BrowserThread::IO,
+ message_loop_.get()));
+ vcm_ = new MockVideoCaptureManager();
+ vcm_->Init();
+ controller_ = new VideoCaptureController(vcm_);
+ controller_handler_.reset(
+ new MockVideoCaptureControllerEventHandler(controller_.get(),
+ message_loop_.get()));
+ }
+
+ virtual void TearDown() {
+ io_thread_.reset();
+ }
+
+ scoped_ptr<MessageLoop> message_loop_;
+ scoped_ptr<BrowserThreadImpl> io_thread_;
+ scoped_refptr<MockVideoCaptureManager> vcm_;
+ scoped_ptr<MockVideoCaptureControllerEventHandler> controller_handler_;
+ scoped_refptr<VideoCaptureController> controller_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(VideoCaptureControllerTest);
+};
+
+// Try to start and stop capture.
+TEST_F(VideoCaptureControllerTest, StartAndStop) {
+ media::VideoCaptureParams capture_params;
+ capture_params.session_id = vcm_->video_session_id_;
+ capture_params.width = 320;
+ capture_params.height = 240;
+ capture_params.frame_per_second = 30;
+
+ InSequence s;
+ EXPECT_CALL(*vcm_,
+ StartCapture(capture_params.width,
+ capture_params.height,
+ controller_.get()))
+ .Times(1);
+ EXPECT_CALL(*controller_handler_,
+ DoFrameInfo(controller_handler_->controller_id_))
+ .Times(AtLeast(1));
+ EXPECT_CALL(*controller_handler_,
+ DoBufferCreated(controller_handler_->controller_id_))
+ .Times(AtLeast(1));
+ EXPECT_CALL(*controller_handler_,
+ DoBufferReady(controller_handler_->controller_id_))
+ .Times(AtLeast(1))
+ .WillOnce(StopCapture(controller_.get(),
+ controller_handler_->controller_id_,
+ controller_handler_.get(), true,
+ message_loop_.get()));
+ EXPECT_CALL(*vcm_,
+ StopCapture(vcm_->video_session_id_))
+ .Times(1);
+
+ controller_->StartCapture(controller_handler_->controller_id_,
+ controller_handler_.get(),
+ controller_handler_->process_handle_,
+ capture_params);
+ message_loop_->Run();
+}
+
+// Try to stop session before stopping capture.
+TEST_F(VideoCaptureControllerTest, StopSession) {
+ media::VideoCaptureParams capture_params;
+ capture_params.session_id = vcm_->video_session_id_;
+ capture_params.width = 320;
+ capture_params.height = 240;
+ capture_params.frame_per_second = 30;
+
+ InSequence s;
+ EXPECT_CALL(*vcm_,
+ StartCapture(capture_params.width,
+ capture_params.height,
+ controller_.get()))
+ .Times(1);
+ EXPECT_CALL(*controller_handler_,
+ DoFrameInfo(controller_handler_->controller_id_))
+ .Times(AtLeast(1));
+ EXPECT_CALL(*controller_handler_,
+ DoBufferCreated(controller_handler_->controller_id_))
+ .Times(AtLeast(1));
+ EXPECT_CALL(*controller_handler_,
+ DoBufferReady(controller_handler_->controller_id_))
+ .Times(AtLeast(1))
+ .WillOnce(StopSession(controller_.get(),
+ vcm_->video_session_id_,
+ message_loop_.get()));
+ EXPECT_CALL(*controller_handler_,
+ DoPaused(controller_handler_->controller_id_))
+ .Times(1);
+
+ controller_->StartCapture(controller_handler_->controller_id_,
+ controller_handler_.get(),
+ controller_handler_->process_handle_,
+ capture_params);
+ message_loop_->Run();
+
+ // The session is stopped now. There should be no buffer coming from
+ // controller.
+ EXPECT_CALL(*controller_handler_,
+ DoBufferReady(controller_handler_->controller_id_))
+ .Times(0);
+ message_loop_->PostDelayedTask(FROM_HERE, MessageLoop::QuitClosure(), 1000);
+ message_loop_->Run();
+
+ EXPECT_CALL(*vcm_,
+ StopCapture(vcm_->video_session_id_))
+ .Times(1);
+ controller_->StopCapture(controller_handler_->controller_id_,
+ controller_handler_.get(), true);
+}
Property changes on: content/browser/renderer_host/media/video_capture_controller_unittest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF

Powered by Google App Engine
This is Rietveld 408576698