| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <array> | 5 #include <array> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 virtual void OnPaused(media::VideoCaptureSessionId session_id) = 0; | 44 virtual void OnPaused(media::VideoCaptureSessionId session_id) = 0; |
| 45 virtual void OnResumed(media::VideoCaptureSessionId session_id) = 0; | 45 virtual void OnResumed(media::VideoCaptureSessionId session_id) = 0; |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 class MockVideoCaptureImpl : public VideoCaptureImpl { | 48 class MockVideoCaptureImpl : public VideoCaptureImpl { |
| 49 public: | 49 public: |
| 50 MockVideoCaptureImpl(media::VideoCaptureSessionId session_id, | 50 MockVideoCaptureImpl(media::VideoCaptureSessionId session_id, |
| 51 VideoCaptureMessageFilter* filter, | 51 VideoCaptureMessageFilter* filter, |
| 52 PauseResumeCallback* pause_callback, | 52 PauseResumeCallback* pause_callback, |
| 53 base::Closure destruct_callback) | 53 base::Closure destruct_callback) |
| 54 : VideoCaptureImpl(session_id, filter), | 54 : VideoCaptureImpl(session_id, |
| 55 pause_callback_(pause_callback), destruct_callback_(destruct_callback) { | 55 filter, |
| 56 } | 56 ChildProcess::current()->io_task_runner()), |
| 57 pause_callback_(pause_callback), |
| 58 destruct_callback_(destruct_callback) {} |
| 57 | 59 |
| 58 ~MockVideoCaptureImpl() override { destruct_callback_.Run(); } | 60 ~MockVideoCaptureImpl() override { destruct_callback_.Run(); } |
| 59 | 61 |
| 60 void Send(IPC::Message* message) override { | 62 void Send(IPC::Message* message) override { |
| 61 IPC_BEGIN_MESSAGE_MAP(MockVideoCaptureImpl, *message) | 63 IPC_BEGIN_MESSAGE_MAP(MockVideoCaptureImpl, *message) |
| 62 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Pause, DevicePauseCapture) | 64 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Pause, DevicePauseCapture) |
| 63 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Resume, DeviceResumeCapture) | 65 IPC_MESSAGE_HANDLER(VideoCaptureHostMsg_Resume, DeviceResumeCapture) |
| 64 default: | 66 default: |
| 65 VideoCaptureImpl::Send(message); | 67 VideoCaptureImpl::Send(message); |
| 66 return; | 68 return; |
| 67 IPC_END_MESSAGE_MAP() | 69 IPC_END_MESSAGE_MAP() |
| 68 delete message; | 70 delete message; |
| 69 } | 71 } |
| 70 | 72 |
| 71 private: | 73 private: |
| 72 void DevicePauseCapture(int device_id) { | 74 void DevicePauseCapture(int device_id) { |
| 73 pause_callback_->OnPaused(session_id()); | 75 pause_callback_->OnPaused(session_id()); |
| 74 } | 76 } |
| 75 | 77 |
| 76 void DeviceResumeCapture(int device_id, | 78 void DeviceResumeCapture(int device_id, |
| 77 media::VideoCaptureSessionId session_id, | 79 media::VideoCaptureSessionId session_id, |
| 78 const media::VideoCaptureParams& params) { | 80 const media::VideoCaptureParams& params) { |
| 79 pause_callback_->OnResumed(session_id); | 81 pause_callback_->OnResumed(session_id); |
| 80 } | 82 } |
| 81 | 83 |
| 82 PauseResumeCallback* const pause_callback_; | 84 PauseResumeCallback* const pause_callback_; |
| 83 base::Closure destruct_callback_; | 85 const base::Closure destruct_callback_; |
| 84 | 86 |
| 85 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImpl); | 87 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImpl); |
| 86 }; | 88 }; |
| 87 | 89 |
| 88 class MockVideoCaptureImplManager : public VideoCaptureImplManager { | 90 class MockVideoCaptureImplManager : public VideoCaptureImplManager { |
| 89 public: | 91 public: |
| 90 MockVideoCaptureImplManager(PauseResumeCallback* pause_callback, | 92 MockVideoCaptureImplManager(PauseResumeCallback* pause_callback, |
| 91 base::Closure destruct_video_capture_callback) | 93 base::Closure destruct_video_capture_callback) |
| 92 : pause_callback_(pause_callback), | 94 : pause_callback_(pause_callback), |
| 93 destruct_video_capture_callback_( | 95 destruct_video_capture_callback_(destruct_video_capture_callback) {} |
| 94 destruct_video_capture_callback) {} | |
| 95 ~MockVideoCaptureImplManager() override {} | 96 ~MockVideoCaptureImplManager() override {} |
| 96 | 97 |
| 97 protected: | 98 protected: |
| 98 std::unique_ptr<VideoCaptureImpl> CreateVideoCaptureImplForTesting( | 99 std::unique_ptr<VideoCaptureImpl> CreateVideoCaptureImplForTesting( |
| 99 media::VideoCaptureSessionId id, | 100 media::VideoCaptureSessionId id, |
| 100 VideoCaptureMessageFilter* filter) const override { | 101 VideoCaptureMessageFilter* filter) const override { |
| 101 return base::MakeUnique<MockVideoCaptureImpl>( | 102 return base::MakeUnique<MockVideoCaptureImpl>( |
| 102 id, filter, pause_callback_, destruct_video_capture_callback_); | 103 id, filter, pause_callback_, destruct_video_capture_callback_); |
| 103 } | 104 } |
| 104 | 105 |
| 105 private: | 106 private: |
| 106 PauseResumeCallback* const pause_callback_; | 107 PauseResumeCallback* const pause_callback_; |
| 107 base::Closure destruct_video_capture_callback_; | 108 const base::Closure destruct_video_capture_callback_; |
| 108 | 109 |
| 109 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImplManager); | 110 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureImplManager); |
| 110 }; | 111 }; |
| 111 | 112 |
| 112 } // namespace | 113 } // namespace |
| 113 | 114 |
| 114 class VideoCaptureImplManagerTest | 115 class VideoCaptureImplManagerTest : public ::testing::Test, |
| 115 : public ::testing::Test, public PauseResumeCallback { | 116 public PauseResumeCallback { |
| 116 public: | 117 public: |
| 117 VideoCaptureImplManagerTest() | 118 VideoCaptureImplManagerTest() |
| 118 : manager_(new MockVideoCaptureImplManager( | 119 : child_process_(new ChildProcess()), |
| 119 this, BindToCurrentLoop(cleanup_run_loop_.QuitClosure()))) { | 120 manager_(new MockVideoCaptureImplManager( |
| 120 params_.requested_format = media::VideoCaptureFormat( | 121 this, |
| 121 gfx::Size(176, 144), 30, media::PIXEL_FORMAT_I420); | 122 BindToCurrentLoop(cleanup_run_loop_.QuitClosure()))) {} |
| 122 child_process_.reset(new ChildProcess()); | |
| 123 } | |
| 124 | |
| 125 void FakeChannelSetup() { | |
| 126 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | |
| 127 child_process_->io_task_runner(); | |
| 128 if (!task_runner->BelongsToCurrentThread()) { | |
| 129 task_runner->PostTask( | |
| 130 FROM_HERE, base::Bind(&VideoCaptureImplManagerTest::FakeChannelSetup, | |
| 131 base::Unretained(this))); | |
| 132 return; | |
| 133 } | |
| 134 manager_->video_capture_message_filter()->OnFilterAdded(NULL); | |
| 135 } | |
| 136 | 123 |
| 137 protected: | 124 protected: |
| 138 static constexpr size_t kNumClients = 3; | 125 static constexpr size_t kNumClients = 3; |
| 139 | 126 |
| 140 std::array<base::Closure, kNumClients> StartCaptureForAllClients( | 127 std::array<base::Closure, kNumClients> StartCaptureForAllClients( |
| 141 bool same_session_id) { | 128 bool same_session_id) { |
| 142 base::RunLoop run_loop; | 129 base::RunLoop run_loop; |
| 143 base::Closure quit_closure = BindToCurrentLoop(run_loop.QuitClosure()); | 130 base::Closure quit_closure = BindToCurrentLoop(run_loop.QuitClosure()); |
| 144 EXPECT_CALL(*this, OnStarted(_)).Times(kNumClients - 1) | 131 EXPECT_CALL(*this, OnStarted(_)).Times(kNumClients - 1) |
| 145 .RetiresOnSaturation(); | 132 .RetiresOnSaturation(); |
| 146 EXPECT_CALL(*this, OnStarted(_)).WillOnce(RunClosure(quit_closure)) | 133 EXPECT_CALL(*this, OnStarted(_)).WillOnce(RunClosure(quit_closure)) |
| 147 .RetiresOnSaturation(); | 134 .RetiresOnSaturation(); |
| 148 std::array<base::Closure, kNumClients> stop_callbacks; | 135 std::array<base::Closure, kNumClients> stop_callbacks; |
| 149 for (size_t i = 0; i < kNumClients; ++i) | 136 media::VideoCaptureParams params; |
| 137 params.requested_format = media::VideoCaptureFormat( |
| 138 gfx::Size(176, 144), 30, media::PIXEL_FORMAT_I420); |
| 139 for (size_t i = 0; i < kNumClients; ++i) { |
| 150 stop_callbacks[i] = StartCapture( | 140 stop_callbacks[i] = StartCapture( |
| 151 same_session_id ? 0 : static_cast<media::VideoCaptureSessionId>(i), | 141 same_session_id ? 0 : static_cast<media::VideoCaptureSessionId>(i), |
| 152 params_); | 142 params); |
| 153 FakeChannelSetup(); | 143 } |
| 144 child_process_->io_task_runner()->PostTask( |
| 145 FROM_HERE, |
| 146 base::Bind(&VideoCaptureMessageFilter::OnFilterAdded, |
| 147 base::Unretained(manager_->video_capture_message_filter()), |
| 148 nullptr)); |
| 154 run_loop.Run(); | 149 run_loop.Run(); |
| 155 return stop_callbacks; | 150 return stop_callbacks; |
| 156 } | 151 } |
| 157 | 152 |
| 158 void StopCaptureForAllClients( | 153 void StopCaptureForAllClients( |
| 159 std::array<base::Closure, kNumClients>* stop_callbacks) { | 154 std::array<base::Closure, kNumClients>* stop_callbacks) { |
| 160 base::RunLoop run_loop; | 155 base::RunLoop run_loop; |
| 161 base::Closure quit_closure = BindToCurrentLoop(run_loop.QuitClosure()); | 156 base::Closure quit_closure = BindToCurrentLoop(run_loop.QuitClosure()); |
| 162 EXPECT_CALL(*this, OnStopped(_)).Times(kNumClients - 1) | 157 EXPECT_CALL(*this, OnStopped(_)).Times(kNumClients - 1) |
| 163 .RetiresOnSaturation(); | 158 .RetiresOnSaturation(); |
| 164 EXPECT_CALL(*this, OnStopped(_)).WillOnce(RunClosure(quit_closure)) | 159 EXPECT_CALL(*this, OnStopped(_)).WillOnce(RunClosure(quit_closure)) |
| 165 .RetiresOnSaturation(); | 160 .RetiresOnSaturation(); |
| 166 for (size_t i = 0; i < kNumClients; ++i) | 161 for (size_t i = 0; i < kNumClients; ++i) |
| 167 (*stop_callbacks)[i].Run(); | 162 (*stop_callbacks)[i].Run(); |
| 168 run_loop.Run(); | 163 run_loop.Run(); |
| 169 } | 164 } |
| 170 | 165 |
| 171 MOCK_METHOD2(OnFrameReady, | 166 MOCK_METHOD2(OnFrameReady, |
| 172 void(const scoped_refptr<media::VideoFrame>&, | 167 void(const scoped_refptr<media::VideoFrame>&, |
| 173 base::TimeTicks estimated_capture_time)); | 168 base::TimeTicks estimated_capture_time)); |
| 174 MOCK_METHOD1(OnStarted, void(media::VideoCaptureSessionId id)); | 169 MOCK_METHOD1(OnStarted, void(media::VideoCaptureSessionId id)); |
| 175 MOCK_METHOD1(OnStopped, void(media::VideoCaptureSessionId id)); | 170 MOCK_METHOD1(OnStopped, void(media::VideoCaptureSessionId id)); |
| 176 MOCK_METHOD1(OnPaused, void(media::VideoCaptureSessionId id)); | 171 MOCK_METHOD1(OnPaused, void(media::VideoCaptureSessionId id)); |
| 177 MOCK_METHOD1(OnResumed, void(media::VideoCaptureSessionId id)); | 172 MOCK_METHOD1(OnResumed, void(media::VideoCaptureSessionId id)); |
| 178 | 173 |
| 179 void OnStateUpdate(media::VideoCaptureSessionId id, VideoCaptureState state) { | 174 void OnStateUpdate(media::VideoCaptureSessionId id, VideoCaptureState state) { |
| 180 switch (state) { | 175 if (state == VIDEO_CAPTURE_STATE_STARTED) |
| 181 case VIDEO_CAPTURE_STATE_STARTED: | 176 OnStarted(id); |
| 182 OnStarted(id); | 177 else if (state == VIDEO_CAPTURE_STATE_STOPPED) |
| 183 break; | 178 OnStopped(id); |
| 184 case VIDEO_CAPTURE_STATE_STOPPED: | 179 else |
| 185 OnStopped(id); | 180 NOTREACHED(); |
| 186 break; | |
| 187 default: | |
| 188 NOTREACHED(); | |
| 189 } | |
| 190 } | 181 } |
| 191 | 182 |
| 192 base::Closure StartCapture(media::VideoCaptureSessionId id, | 183 base::Closure StartCapture(media::VideoCaptureSessionId id, |
| 193 const media::VideoCaptureParams& params) { | 184 const media::VideoCaptureParams& params) { |
| 194 return manager_->StartCapture( | 185 return manager_->StartCapture( |
| 195 id, params, base::Bind(&VideoCaptureImplManagerTest::OnStateUpdate, | 186 id, params, base::Bind(&VideoCaptureImplManagerTest::OnStateUpdate, |
| 196 base::Unretained(this), id), | 187 base::Unretained(this), id), |
| 197 base::Bind(&VideoCaptureImplManagerTest::OnFrameReady, | 188 base::Bind(&VideoCaptureImplManagerTest::OnFrameReady, |
| 198 base::Unretained(this))); | 189 base::Unretained(this))); |
| 199 } | 190 } |
| 200 | 191 |
| 201 base::MessageLoop message_loop_; | 192 const base::MessageLoop message_loop_; |
| 202 std::unique_ptr<ChildProcess> child_process_; | 193 const std::unique_ptr<ChildProcess> child_process_; |
| 203 media::VideoCaptureParams params_; | |
| 204 base::RunLoop cleanup_run_loop_; | 194 base::RunLoop cleanup_run_loop_; |
| 205 std::unique_ptr<MockVideoCaptureImplManager> manager_; | 195 std::unique_ptr<MockVideoCaptureImplManager> manager_; |
| 206 | 196 |
| 207 private: | 197 private: |
| 208 DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManagerTest); | 198 DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManagerTest); |
| 209 }; | 199 }; |
| 210 | 200 |
| 211 // Multiple clients with the same session id. There is only one | 201 // Multiple clients with the same session id. There is only one |
| 212 // media::VideoCapture object. | 202 // media::VideoCapture object. |
| 213 TEST_F(VideoCaptureImplManagerTest, MultipleClients) { | 203 TEST_F(VideoCaptureImplManagerTest, MultipleClients) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 run_loop.Run(); | 294 run_loop.Run(); |
| 305 } | 295 } |
| 306 | 296 |
| 307 StopCaptureForAllClients(&stop_callbacks); | 297 StopCaptureForAllClients(&stop_callbacks); |
| 308 for (size_t i = 0; i < kNumClients; ++i) | 298 for (size_t i = 0; i < kNumClients; ++i) |
| 309 release_callbacks[i].Run(); | 299 release_callbacks[i].Run(); |
| 310 cleanup_run_loop_.Run(); | 300 cleanup_run_loop_.Run(); |
| 311 } | 301 } |
| 312 | 302 |
| 313 } // namespace content | 303 } // namespace content |
| OLD | NEW |