Index: content/renderer/media/video_capture_impl_manager_unittest.cc |
diff --git a/content/renderer/media/video_capture_impl_manager_unittest.cc b/content/renderer/media/video_capture_impl_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b02d81e4f5d14f662363383cbf157dffe376a521 |
--- /dev/null |
+++ b/content/renderer/media/video_capture_impl_manager_unittest.cc |
@@ -0,0 +1,149 @@ |
+// Copyright (c) 2013 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/bind.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
+#include "content/child/child_process.h" |
+#include "content/renderer/media/video_capture_impl.h" |
+#include "content/renderer/media/video_capture_impl_manager.h" |
+#include "content/renderer/media/video_capture_message_filter.h" |
+#include "media/base/bind_to_loop.h" |
+#include "media/video/capture/mock_video_capture_event_handler.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using ::testing::_; |
+using ::testing::DoAll; |
+using ::testing::SaveArg; |
+using media::BindToCurrentLoop; |
+using media::MockVideoCaptureEventHandler; |
+ |
+namespace content { |
+ |
+ACTION_P(RunClosure, closure) { |
+ closure.Run(); |
+} |
+ |
+ |
+class MockVideoCaptureImpl : public VideoCaptureImpl { |
+ public: |
+ MockVideoCaptureImpl(media::VideoCaptureSessionId session_id, |
+ VideoCaptureMessageFilter* filter) |
+ : VideoCaptureImpl(session_id, filter) { |
+ } |
+ |
+ virtual ~MockVideoCaptureImpl() { |
+ Destruct(); |
+ } |
+ |
+ MOCK_METHOD0(Destruct, void()); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImpl); |
+}; |
+ |
+class MockVideoCaptureImplManager : public VideoCaptureImplManager { |
+ public: |
+ MockVideoCaptureImplManager() {} |
+ |
+ protected: |
+ virtual VideoCaptureImpl* CreateVideoCaptureImpl( |
+ media::VideoCaptureSessionId id, |
+ VideoCaptureMessageFilter* filter) const OVERRIDE { |
+ return new MockVideoCaptureImpl(id, filter); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImplManager); |
+}; |
+ |
+class VideoCaptureImplManagerTest : public ::testing::Test { |
+ public: |
+ VideoCaptureImplManagerTest() { |
+ params_.requested_format = media::VideoCaptureFormat( |
+ gfx::Size(176, 144), 30, media::PIXEL_FORMAT_I420); |
+ child_process_.reset(new ChildProcess()); |
+ } |
+ |
+ void FakeChannelSetup() { |
+ scoped_refptr<base::MessageLoopProxy> loop = |
+ child_process_->io_message_loop_proxy(); |
+ if (!loop->BelongsToCurrentThread()) { |
+ loop->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &VideoCaptureImplManagerTest::FakeChannelSetup, |
+ base::Unretained(this))); |
+ return; |
+ } |
+ manager_.video_capture_message_filter()->OnFilterAdded(NULL); |
+ } |
+ |
+ void Quit(base::RunLoop* run_loop) { |
+ message_loop_.PostTask(FROM_HERE, run_loop->QuitClosure()); |
+ } |
+ |
+ protected: |
+ base::MessageLoop message_loop_; |
+ scoped_ptr<ChildProcess> child_process_; |
+ media::VideoCaptureParams params_; |
+ MockVideoCaptureImplManager manager_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManagerTest); |
+}; |
+ |
+// Multiple clients with the same session id. There is only one |
+// media::VideoCapture object. |
+TEST_F(VideoCaptureImplManagerTest, MultipleClients) { |
+ scoped_ptr<MockVideoCaptureEventHandler> client1( |
+ new MockVideoCaptureEventHandler); |
+ scoped_ptr<MockVideoCaptureEventHandler> client2( |
+ new MockVideoCaptureEventHandler); |
+ |
+ media::VideoCapture* device1 = NULL; |
+ media::VideoCapture* device2 = NULL; |
+ |
+ scoped_ptr<VideoCaptureHandle> handle1; |
+ scoped_ptr<VideoCaptureHandle> handle2; |
+ { |
+ base::RunLoop run_loop; |
+ base::Closure quit_closure = BindToCurrentLoop( |
+ run_loop.QuitClosure()); |
+ |
+ EXPECT_CALL(*client1, OnStarted(_)).WillOnce(SaveArg<0>(&device1)); |
+ EXPECT_CALL(*client2, OnStarted(_)).WillOnce( |
+ DoAll( |
+ SaveArg<0>(&device2), |
+ RunClosure(quit_closure))); |
+ handle1 = manager_.UseDevice(1); |
+ handle2 = manager_.UseDevice(1); |
+ handle1->StartCapture(client1.get(), params_); |
+ handle2->StartCapture(client2.get(), params_); |
+ FakeChannelSetup(); |
+ run_loop.Run(); |
+ } |
+ |
+ { |
+ base::RunLoop run_loop; |
+ base::Closure quit_closure = BindToCurrentLoop( |
+ run_loop.QuitClosure()); |
+ |
+ EXPECT_CALL(*client1, OnStopped(_)); |
+ EXPECT_CALL(*client1, OnRemoved(_)); |
+ EXPECT_CALL(*client2, OnStopped(_)); |
+ EXPECT_CALL(*client2, OnRemoved(_)).WillOnce( |
+ RunClosure(quit_closure)); |
+ handle1->StopCapture(client1.get()); |
+ handle2->StopCapture(client2.get()); |
+ run_loop.Run(); |
+ } |
+ |
+ EXPECT_TRUE(device1 == device2); |
+ EXPECT_CALL(*static_cast<MockVideoCaptureImpl*>(device1), Destruct()); |
+} |
+ |
+} // namespace content |