1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "base/callback.h"
7 #include "base/memory/ref_counted.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h"
10 #include "content/child/child_process.h"
11 #include "content/renderer/media/video_capture_impl.h"
12 #include "content/renderer/media/video_capture_impl_manager.h"
13 #include "content/renderer/media/video_capture_message_filter.h"
14 #include "media/base/bind_to_current_loop.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
19 using ::testing::DoAll
;
20 using ::testing::SaveArg
;
21 using media::BindToCurrentLoop
;
25 ACTION_P(RunClosure
, closure
) {
29 class MockVideoCaptureImpl
: public VideoCaptureImpl
{
31 MockVideoCaptureImpl(media::VideoCaptureSessionId session_id
,
32 VideoCaptureMessageFilter
* filter
,
33 base::Closure destruct_callback
)
34 : VideoCaptureImpl(session_id
, filter
),
35 destruct_callback_(destruct_callback
) {
38 ~MockVideoCaptureImpl() override
{ destruct_callback_
.Run(); }
41 base::Closure destruct_callback_
;
43 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImpl
);
46 class MockVideoCaptureImplManager
: public VideoCaptureImplManager
{
48 explicit MockVideoCaptureImplManager(
49 base::Closure destruct_video_capture_callback
)
50 : destruct_video_capture_callback_(
51 destruct_video_capture_callback
) {}
52 ~MockVideoCaptureImplManager() override
{}
55 VideoCaptureImpl
* CreateVideoCaptureImplForTesting(
56 media::VideoCaptureSessionId id
,
57 VideoCaptureMessageFilter
* filter
) const override
{
58 return new MockVideoCaptureImpl(id
,
60 destruct_video_capture_callback_
);
64 base::Closure destruct_video_capture_callback_
;
66 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImplManager
);
69 class VideoCaptureImplManagerTest
: public ::testing::Test
{
71 VideoCaptureImplManagerTest()
72 : manager_(new MockVideoCaptureImplManager(
73 BindToCurrentLoop(cleanup_run_loop_
.QuitClosure()))) {
74 params_
.requested_format
= media::VideoCaptureFormat(
75 gfx::Size(176, 144), 30, media::PIXEL_FORMAT_I420
);
76 child_process_
.reset(new ChildProcess());
79 void FakeChannelSetup() {
80 scoped_refptr
<base::MessageLoopProxy
> loop
=
81 child_process_
->io_message_loop_proxy();
82 if (!loop
->BelongsToCurrentThread()) {
86 &VideoCaptureImplManagerTest::FakeChannelSetup
,
87 base::Unretained(this)));
90 manager_
->video_capture_message_filter()->OnFilterAdded(NULL
);
94 MOCK_METHOD2(OnFrameReady
,
95 void(const scoped_refptr
<media::VideoFrame
>&,
96 const base::TimeTicks
& estimated_capture_time
));
97 MOCK_METHOD0(OnStarted
, void());
98 MOCK_METHOD0(OnStopped
, void());
100 void OnStateUpdate(VideoCaptureState state
) {
102 case VIDEO_CAPTURE_STATE_STARTED
:
105 case VIDEO_CAPTURE_STATE_STOPPED
:
113 base::Closure
StartCapture(const media::VideoCaptureParams
& params
) {
114 return manager_
->StartCapture(
116 base::Bind(&VideoCaptureImplManagerTest::OnStateUpdate
,
117 base::Unretained(this)),
118 base::Bind(&VideoCaptureImplManagerTest::OnFrameReady
,
119 base::Unretained(this)));
122 base::MessageLoop message_loop_
;
123 scoped_ptr
<ChildProcess
> child_process_
;
124 media::VideoCaptureParams params_
;
125 base::RunLoop cleanup_run_loop_
;
126 scoped_ptr
<MockVideoCaptureImplManager
> manager_
;
129 DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManagerTest
);
132 // Multiple clients with the same session id. There is only one
133 // media::VideoCapture object.
134 TEST_F(VideoCaptureImplManagerTest
, MultipleClients
) {
135 base::Closure release_cb1
= manager_
->UseDevice(0);
136 base::Closure release_cb2
= manager_
->UseDevice(0);
137 base::Closure stop_cb1
, stop_cb2
;
139 base::RunLoop run_loop
;
140 base::Closure quit_closure
= BindToCurrentLoop(run_loop
.QuitClosure());
141 EXPECT_CALL(*this, OnStarted()).WillOnce(RunClosure(quit_closure
));
142 EXPECT_CALL(*this, OnStarted()).RetiresOnSaturation();
143 stop_cb1
= StartCapture(params_
);
144 stop_cb2
= StartCapture(params_
);
150 base::RunLoop run_loop
;
151 base::Closure quit_closure
= BindToCurrentLoop(run_loop
.QuitClosure());
152 EXPECT_CALL(*this, OnStopped()).WillOnce(RunClosure(quit_closure
));
153 EXPECT_CALL(*this, OnStopped()).RetiresOnSaturation();
161 cleanup_run_loop_
.Run();
164 TEST_F(VideoCaptureImplManagerTest
, NoLeak
) {
165 manager_
->UseDevice(0).Reset();
167 cleanup_run_loop_
.Run();
170 } // namespace content