1 // Copyright (c) 2012 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.
5 #include "base/memory/shared_memory.h"
6 #include "content/common/media/video_capture_messages.h"
7 #include "content/renderer/media/video_capture_message_filter.h"
8 #include "ipc/ipc_test_sink.h"
9 #include "media/video/capture/video_capture_types.h"
10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h"
14 using ::testing::AnyNumber
;
15 using ::testing::Mock
;
16 using ::testing::Return
;
17 using ::testing::SaveArg
;
18 using ::testing::StrictMock
;
23 class MockVideoCaptureDelegate
: public VideoCaptureMessageFilter::Delegate
{
25 MockVideoCaptureDelegate() : device_id_(0) {}
27 // VideoCaptureMessageFilter::Delegate implementation.
28 MOCK_METHOD3(OnBufferCreated
, void(base::SharedMemoryHandle handle
,
31 MOCK_METHOD1(OnBufferDestroyed
, void(int buffer_id
));
32 MOCK_METHOD3(OnBufferReceived
,
34 const media::VideoCaptureFormat
& format
,
35 base::TimeTicks timestamp
));
36 MOCK_METHOD4(OnMailboxBufferReceived
,
38 const gpu::MailboxHolder
& mailbox_holder
,
39 const media::VideoCaptureFormat
& format
,
40 base::TimeTicks timestamp
));
41 MOCK_METHOD1(OnStateChanged
, void(VideoCaptureState state
));
42 MOCK_METHOD1(OnDeviceSupportedFormatsEnumerated
,
43 void(const media::VideoCaptureFormats
& formats
));
44 MOCK_METHOD1(OnDeviceFormatsInUseReceived
,
45 void(const media::VideoCaptureFormats
& formats_in_use
));
47 virtual void OnDelegateAdded(int32 device_id
) OVERRIDE
{
48 ASSERT_TRUE(device_id
!= 0);
49 ASSERT_TRUE(device_id_
== 0);
50 device_id_
= device_id
;
53 int device_id() { return device_id_
; }
61 TEST(VideoCaptureMessageFilterTest
, Basic
) {
62 scoped_refptr
<VideoCaptureMessageFilter
> filter(
63 new VideoCaptureMessageFilter());
65 IPC::TestSink channel
;
66 filter
->OnFilterAdded(&channel
);
67 MockVideoCaptureDelegate delegate
;
68 filter
->AddDelegate(&delegate
);
69 ASSERT_EQ(1, delegate
.device_id());
71 // VideoCaptureMsg_StateChanged
72 EXPECT_CALL(delegate
, OnStateChanged(VIDEO_CAPTURE_STATE_STARTED
));
73 filter
->OnMessageReceived(
74 VideoCaptureMsg_StateChanged(delegate
.device_id(),
75 VIDEO_CAPTURE_STATE_STARTED
));
76 Mock::VerifyAndClearExpectations(&delegate
);
78 // VideoCaptureMsg_NewBuffer
79 const base::SharedMemoryHandle handle
=
81 reinterpret_cast<base::SharedMemoryHandle
>(10);
83 base::SharedMemoryHandle(10, true);
85 EXPECT_CALL(delegate
, OnBufferCreated(handle
, 100, 1));
86 filter
->OnMessageReceived(VideoCaptureMsg_NewBuffer(
87 delegate
.device_id(), handle
, 100, 1));
88 Mock::VerifyAndClearExpectations(&delegate
);
90 // VideoCaptureMsg_BufferReady
92 base::TimeTicks timestamp
= base::TimeTicks::FromInternalValue(1);
94 const media::VideoCaptureFormat
shm_format(
95 gfx::Size(234, 512), 30, media::PIXEL_FORMAT_I420
);
96 media::VideoCaptureFormat saved_format
;
97 EXPECT_CALL(delegate
, OnBufferReceived(buffer_id
, _
, timestamp
))
98 .WillRepeatedly(SaveArg
<1>(&saved_format
));
99 filter
->OnMessageReceived(VideoCaptureMsg_BufferReady(
100 delegate
.device_id(), buffer_id
, shm_format
, timestamp
));
101 Mock::VerifyAndClearExpectations(&delegate
);
102 EXPECT_EQ(shm_format
.frame_size
, saved_format
.frame_size
);
103 EXPECT_EQ(shm_format
.frame_rate
, saved_format
.frame_rate
);
104 EXPECT_EQ(shm_format
.pixel_format
, saved_format
.pixel_format
);
106 // VideoCaptureMsg_MailboxBufferReady
108 timestamp
= base::TimeTicks::FromInternalValue(2);
110 const media::VideoCaptureFormat
mailbox_format(
111 gfx::Size(234, 512), 30, media::PIXEL_FORMAT_TEXTURE
);
112 gpu::Mailbox mailbox
;
113 const int8 mailbox_name
[arraysize(mailbox
.name
)] = "TEST MAILBOX";
114 mailbox
.SetName(mailbox_name
);
115 unsigned int syncpoint
= 44;
116 gpu::MailboxHolder saved_mailbox_holder
;
117 EXPECT_CALL(delegate
, OnMailboxBufferReceived(buffer_id
, _
, _
, timestamp
))
119 DoAll(SaveArg
<1>(&saved_mailbox_holder
), SaveArg
<2>(&saved_format
)));
120 gpu::MailboxHolder
mailbox_holder(mailbox
, 0, syncpoint
);
121 filter
->OnMessageReceived(
122 VideoCaptureMsg_MailboxBufferReady(delegate
.device_id(),
127 Mock::VerifyAndClearExpectations(&delegate
);
128 EXPECT_EQ(mailbox_format
.frame_size
, saved_format
.frame_size
);
129 EXPECT_EQ(mailbox_format
.frame_rate
, saved_format
.frame_rate
);
130 EXPECT_EQ(mailbox_format
.pixel_format
, saved_format
.pixel_format
);
131 EXPECT_EQ(memcmp(mailbox
.name
,
132 saved_mailbox_holder
.mailbox
.name
,
133 sizeof(mailbox
.name
)),
136 // VideoCaptureMsg_FreeBuffer
137 EXPECT_CALL(delegate
, OnBufferDestroyed(buffer_id
));
138 filter
->OnMessageReceived(VideoCaptureMsg_FreeBuffer(
139 delegate
.device_id(), buffer_id
));
140 Mock::VerifyAndClearExpectations(&delegate
);
143 TEST(VideoCaptureMessageFilterTest
, Delegates
) {
144 scoped_refptr
<VideoCaptureMessageFilter
> filter(
145 new VideoCaptureMessageFilter());
147 IPC::TestSink channel
;
148 filter
->OnFilterAdded(&channel
);
150 StrictMock
<MockVideoCaptureDelegate
> delegate1
;
151 StrictMock
<MockVideoCaptureDelegate
> delegate2
;
153 filter
->AddDelegate(&delegate1
);
154 filter
->AddDelegate(&delegate2
);
155 ASSERT_EQ(1, delegate1
.device_id());
156 ASSERT_EQ(2, delegate2
.device_id());
158 // Send an IPC message. Make sure the correct delegate gets called.
159 EXPECT_CALL(delegate1
, OnStateChanged(VIDEO_CAPTURE_STATE_STARTED
));
160 filter
->OnMessageReceived(
161 VideoCaptureMsg_StateChanged(delegate1
.device_id(),
162 VIDEO_CAPTURE_STATE_STARTED
));
163 Mock::VerifyAndClearExpectations(&delegate1
);
165 EXPECT_CALL(delegate2
, OnStateChanged(VIDEO_CAPTURE_STATE_STARTED
));
166 filter
->OnMessageReceived(
167 VideoCaptureMsg_StateChanged(delegate2
.device_id(),
168 VIDEO_CAPTURE_STATE_STARTED
));
169 Mock::VerifyAndClearExpectations(&delegate2
);
171 // Remove the delegates. Make sure they won't get called.
172 filter
->RemoveDelegate(&delegate1
);
173 filter
->OnMessageReceived(
174 VideoCaptureMsg_StateChanged(delegate1
.device_id(),
175 VIDEO_CAPTURE_STATE_ENDED
));
177 filter
->RemoveDelegate(&delegate2
);
178 filter
->OnMessageReceived(
179 VideoCaptureMsg_StateChanged(delegate2
.device_id(),
180 VIDEO_CAPTURE_STATE_ENDED
));
183 TEST(VideoCaptureMessageFilterTest
, GetSomeDeviceSupportedFormats
) {
184 scoped_refptr
<VideoCaptureMessageFilter
> filter(
185 new VideoCaptureMessageFilter());
187 IPC::TestSink channel
;
188 filter
->OnFilterAdded(&channel
);
189 MockVideoCaptureDelegate delegate
;
190 filter
->AddDelegate(&delegate
);
191 ASSERT_EQ(1, delegate
.device_id());
193 EXPECT_CALL(delegate
, OnDeviceSupportedFormatsEnumerated(_
));
194 media::VideoCaptureFormats supported_formats
;
195 filter
->OnMessageReceived(VideoCaptureMsg_DeviceSupportedFormatsEnumerated(
196 delegate
.device_id(), supported_formats
));
199 TEST(VideoCaptureMessageFilterTest
, GetSomeDeviceFormatInUse
) {
200 scoped_refptr
<VideoCaptureMessageFilter
> filter(
201 new VideoCaptureMessageFilter());
203 IPC::TestSink channel
;
204 filter
->OnFilterAdded(&channel
);
205 MockVideoCaptureDelegate delegate
;
206 filter
->AddDelegate(&delegate
);
207 ASSERT_EQ(1, delegate
.device_id());
209 EXPECT_CALL(delegate
, OnDeviceFormatsInUseReceived(_
));
210 media::VideoCaptureFormats formats_in_use
;
211 filter
->OnMessageReceived(VideoCaptureMsg_DeviceFormatsInUseReceived(
212 delegate
.device_id(), formats_in_use
));
214 } // namespace content