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. 4 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" 12 13 using ::testing::_; 14 using ::testing::AnyNumber; 15 using ::testing::Mock; 16 using ::testing::Return; 17 using ::testing::SaveArg; 18 using ::testing::StrictMock; 19 20 namespace content { 21 namespace { 22 23 class MockVideoCaptureDelegate : public VideoCaptureMessageFilter::Delegate { 24 public: 25 MockVideoCaptureDelegate() : device_id_(0) {} 26 27 // VideoCaptureMessageFilter::Delegate implementation. 28 MOCK_METHOD3(OnBufferCreated, void(base::SharedMemoryHandle handle, 29 int length, 30 int buffer_id)); 31 MOCK_METHOD1(OnBufferDestroyed, void(int buffer_id)); 32 MOCK_METHOD3(OnBufferReceived, 33 void(int buffer_id, 34 const media::VideoCaptureFormat& format, 35 base::TimeTicks timestamp)); 36 MOCK_METHOD4(OnMailboxBufferReceived, 37 void(int buffer_id, 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)); 46 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; 51 } 52 53 int device_id() { return device_id_; } 54 55 private: 56 int device_id_; 57 }; 58 59 } // namespace 60 61 TEST(VideoCaptureMessageFilterTest, Basic) { 62 scoped_refptr<VideoCaptureMessageFilter> filter( 63 new VideoCaptureMessageFilter()); 64 65 IPC::TestSink channel; 66 filter->OnFilterAdded(&channel); 67 MockVideoCaptureDelegate delegate; 68 filter->AddDelegate(&delegate); 69 ASSERT_EQ(1, delegate.device_id()); 70 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); 77 78 // VideoCaptureMsg_NewBuffer 79 const base::SharedMemoryHandle handle = 80 #if defined(OS_WIN) 81 reinterpret_cast<base::SharedMemoryHandle>(10); 82 #else 83 base::SharedMemoryHandle(10, true); 84 #endif 85 EXPECT_CALL(delegate, OnBufferCreated(handle, 100, 1)); 86 filter->OnMessageReceived(VideoCaptureMsg_NewBuffer( 87 delegate.device_id(), handle, 100, 1)); 88 Mock::VerifyAndClearExpectations(&delegate); 89 90 // VideoCaptureMsg_BufferReady 91 int buffer_id = 22; 92 base::TimeTicks timestamp = base::TimeTicks::FromInternalValue(1); 93 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); 105 106 // VideoCaptureMsg_MailboxBufferReady 107 buffer_id = 33; 108 timestamp = base::TimeTicks::FromInternalValue(2); 109 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)) 118 .WillRepeatedly( 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(), 123 buffer_id, 124 mailbox_holder, 125 mailbox_format, 126 timestamp)); 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)), 134 0); 135 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); 141 } 142 143 TEST(VideoCaptureMessageFilterTest, Delegates) { 144 scoped_refptr<VideoCaptureMessageFilter> filter( 145 new VideoCaptureMessageFilter()); 146 147 IPC::TestSink channel; 148 filter->OnFilterAdded(&channel); 149 150 StrictMock<MockVideoCaptureDelegate> delegate1; 151 StrictMock<MockVideoCaptureDelegate> delegate2; 152 153 filter->AddDelegate(&delegate1); 154 filter->AddDelegate(&delegate2); 155 ASSERT_EQ(1, delegate1.device_id()); 156 ASSERT_EQ(2, delegate2.device_id()); 157 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); 164 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); 170 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)); 176 177 filter->RemoveDelegate(&delegate2); 178 filter->OnMessageReceived( 179 VideoCaptureMsg_StateChanged(delegate2.device_id(), 180 VIDEO_CAPTURE_STATE_ENDED)); 181 } 182 183 TEST(VideoCaptureMessageFilterTest, GetSomeDeviceSupportedFormats) { 184 scoped_refptr<VideoCaptureMessageFilter> filter( 185 new VideoCaptureMessageFilter()); 186 187 IPC::TestSink channel; 188 filter->OnFilterAdded(&channel); 189 MockVideoCaptureDelegate delegate; 190 filter->AddDelegate(&delegate); 191 ASSERT_EQ(1, delegate.device_id()); 192 193 EXPECT_CALL(delegate, OnDeviceSupportedFormatsEnumerated(_)); 194 media::VideoCaptureFormats supported_formats; 195 filter->OnMessageReceived(VideoCaptureMsg_DeviceSupportedFormatsEnumerated( 196 delegate.device_id(), supported_formats)); 197 } 198 199 TEST(VideoCaptureMessageFilterTest, GetSomeDeviceFormatInUse) { 200 scoped_refptr<VideoCaptureMessageFilter> filter( 201 new VideoCaptureMessageFilter()); 202 203 IPC::TestSink channel; 204 filter->OnFilterAdded(&channel); 205 MockVideoCaptureDelegate delegate; 206 filter->AddDelegate(&delegate); 207 ASSERT_EQ(1, delegate.device_id()); 208 209 EXPECT_CALL(delegate, OnDeviceFormatsInUseReceived(_)); 210 media::VideoCaptureFormats formats_in_use; 211 filter->OnMessageReceived(VideoCaptureMsg_DeviceFormatsInUseReceived( 212 delegate.device_id(), formats_in_use)); 213 } 214 } // namespace content 215