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