Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: content/renderer/media/video_capture_impl_manager_unittest.cc

Issue 2377163002: VideoCaptureImpl cleanup: merge ctor+Init() and DeInit()+dtor. (Closed)
Patch Set: miu@s comment on passing |io_task_runner| argument Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/media/video_capture_impl_manager.cc ('k') | content/renderer/media/video_capture_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698