15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_process.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/video_capture_messages.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/video_capture_impl.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bind_to_current_loop.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AtLeast; 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::testing::InvokeWithoutArgs; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using ::testing::SaveArg; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockVideoCaptureMessageFilter : public VideoCaptureMessageFilter { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoCaptureMessageFilter() : VideoCaptureMessageFilter() {} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter implementation. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(Send, bool(IPC::Message* message)); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockVideoCaptureMessageFilter() {} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureMessageFilter); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoCaptureImplTest : public ::testing::Test { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockVideoCaptureImpl : public VideoCaptureImpl { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockVideoCaptureImpl(const media::VideoCaptureSessionId id, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoCaptureMessageFilter* filter) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : VideoCaptureImpl(id, filter) { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockVideoCaptureImpl() {} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override Send() to mimic device to send events. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Send(IPC::Message* message) OVERRIDE { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(message); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In this method, messages are sent to the according handlers as if 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we are the device. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(MockVideoCaptureImpl, *message) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Start, DeviceStartCapture) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Pause, DevicePauseCapture) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Stop, DeviceStopCapture) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_BufferReady, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeviceReceiveEmptyBuffer) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceSupportedFormats, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeviceGetSupportedFormats) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_GetDeviceFormatsInUse, 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DeviceGetFormatsInUse) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(handled); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete message; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeviceStartCapture(int device_id, 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) media::VideoCaptureSessionId session_id, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const media::VideoCaptureParams& params) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStateChanged(VIDEO_CAPTURE_STATE_STARTED); 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu capture_params_ = params; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DevicePauseCapture(int device_id) {} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeviceStopCapture(int device_id) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStateChanged(VIDEO_CAPTURE_STATE_STOPPED); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void DeviceReceiveEmptyBuffer(int device_id, 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int buffer_id, 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32 sync_point) {} 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DeviceGetSupportedFormats(int device_id, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoCaptureSessionId session_id) { 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // When the mock message filter receives a request for the device 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // supported formats, replies immediately with an empty format list. 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDeviceSupportedFormatsEnumerated( 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoCaptureFormats()); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DeviceGetFormatsInUse(int device_id, 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoCaptureSessionId session_id) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnDeviceFormatsInUseReceived(media::VideoCaptureFormats()); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void ReceiveStateChangeMessage(VideoCaptureState state) { 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) OnStateChanged(state); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const media::VideoCaptureParams& capture_params() const { 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return capture_params_; 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu media::VideoCaptureParams capture_params_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) VideoCaptureImplTest() { 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) params_small_.requested_format = media::VideoCaptureFormat( 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(176, 144), 30, media::PIXEL_FORMAT_I420); 1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) params_large_.requested_format = media::VideoCaptureFormat( 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Size(320, 240), 30, media::PIXEL_FORMAT_I420); 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_process_.reset(new ChildProcess()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_filter_ = new MockVideoCaptureMessageFilter; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_id_ = 1; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_.reset(new MockVideoCaptureImpl( 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu session_id_, message_filter_.get())); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_capture_impl_->device_id_ = 2; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VideoCaptureImplTest() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MOCK_METHOD3(OnFrameReady, 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void(const scoped_refptr<media::VideoFrame>&, 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const media::VideoCaptureFormat&, 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::TimeTicks&)); 1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD1(OnStateUpdate, void(VideoCaptureState)); 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD1(OnDeviceFormatsInUse, 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void(const media::VideoCaptureFormats&)); 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD1(OnDeviceSupportedFormats, 1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void(const media::VideoCaptureFormats&)); 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void Init() { 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_->Init(); 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void StartCapture(int client_id, 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const media::VideoCaptureParams& params) { 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_->StartCapture( 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu client_id, params, 1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&VideoCaptureImplTest::OnStateUpdate, 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this)), 1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&VideoCaptureImplTest::OnFrameReady, 1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this))); 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void StopCapture(int client_id) { 1575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_->StopCapture(client_id); 1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void DeInit() { 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_->DeInit(); 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void GetDeviceSupportedFormats() { 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Callback<void(const media::VideoCaptureFormats&)> 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback = base::Bind( 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &VideoCaptureImplTest::OnDeviceSupportedFormats, 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this)); 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_->GetDeviceSupportedFormats(callback); 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void GetDeviceFormatsInUse() { 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::Callback<void(const media::VideoCaptureFormats&)> 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback = base::Bind( 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &VideoCaptureImplTest::OnDeviceFormatsInUse, 1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Unretained(this)); 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu video_capture_impl_->GetDeviceFormatsInUse(callback); 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::MessageLoop message_loop_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ChildProcess> child_process_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockVideoCaptureMessageFilter> message_filter_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) media::VideoCaptureSessionId session_id_; 1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<MockVideoCaptureImpl> video_capture_impl_; 1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) media::VideoCaptureParams params_small_; 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) media::VideoCaptureParams params_large_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplTest); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VideoCaptureImplTest, Simple) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute SetCapture() and StopCapture() for one client. 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)); 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(0, params_small_); 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(0); 2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VideoCaptureImplTest, TwoClientsInSequence) { 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(2); 2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(2); 2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(0, params_small_); 2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(0); 2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(1, params_small_); 2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(1); 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VideoCaptureImplTest, LargeAndSmall) { 2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(2); 2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(2); 2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(0, params_large_); 2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(0); 2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(1, params_small_); 2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(1); 2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VideoCaptureImplTest, SmallAndLarge) { 2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(2); 2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(2); 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(0, params_small_); 2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(0); 2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(1, params_large_); 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(1); 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Check that a request to GetDeviceSupportedFormats() ends up eventually in the 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// provided callback. 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(VideoCaptureImplTest, GetDeviceFormats) { 2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnDeviceSupportedFormats(_)); 2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetDeviceSupportedFormats(); 2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Check that two requests to GetDeviceSupportedFormats() end up eventually 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// calling the provided callbacks. 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(VideoCaptureImplTest, TwoClientsGetDeviceFormats) { 2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnDeviceSupportedFormats(_)).Times(2); 2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetDeviceSupportedFormats(); 2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetDeviceSupportedFormats(); 2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Check that a request to GetDeviceFormatsInUse() ends up eventually in the 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// provided callback. 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(VideoCaptureImplTest, GetDeviceFormatsInUse) { 2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnDeviceFormatsInUse(_)); 2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GetDeviceFormatsInUse(); 2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(VideoCaptureImplTest, AlreadyStarted) { 2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)).Times(2); 2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)).Times(2); 2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Init(); 2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(0, params_small_); 2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StartCapture(1, params_large_); 2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(0); 2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu StopCapture(1); 2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeInit(); 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(video_capture_impl_->capture_params().requested_format 2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu .frame_size == 2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params_small_.requested_format.frame_size); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(VideoCaptureImplTest, EndedBeforeStop) { 286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); 287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STOPPED)); 288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Init(); 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StartCapture(0, params_small_); 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Receive state change message from browser. 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) video_capture_impl_->ReceiveStateChangeMessage(VIDEO_CAPTURE_STATE_ENDED); 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StopCapture(0); 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeInit(); 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(VideoCaptureImplTest, ErrorBeforeStop) { 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_STARTED)); 301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_CALL(*this, OnStateUpdate(VIDEO_CAPTURE_STATE_ERROR)); 302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Init(); 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StartCapture(0, params_small_); 305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Receive state change message from browser. 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) video_capture_impl_->ReceiveStateChangeMessage(VIDEO_CAPTURE_STATE_ERROR); 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StopCapture(0); 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DeInit(); 311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 314