OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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 "content/browser/renderer_host/media/media_devices_manager.h" | |
6 | |
7 #include <memory> | |
8 #include <string> | |
9 | |
10 #include "base/bind.h" | |
11 #include "base/macros.h" | |
12 #include "base/memory/ref_counted.h" | |
13 #include "base/run_loop.h" | |
14 #include "base/strings/string_number_conversions.h" | |
15 #include "base/threading/thread_task_runner_handle.h" | |
16 #include "content/browser/renderer_host/media/video_capture_manager.h" | |
17 #include "content/public/test/test_browser_thread_bundle.h" | |
18 #include "media/audio/audio_device_name.h" | |
19 #include "media/audio/fake_audio_log_factory.h" | |
20 #include "media/audio/fake_audio_manager.h" | |
21 #include "media/capture/video/fake_video_capture_device_factory.h" | |
22 #include "testing/gmock/include/gmock/gmock.h" | |
23 #include "testing/gtest/include/gtest/gtest.h" | |
24 | |
25 using testing::_; | |
26 using testing::SaveArg; | |
27 | |
28 namespace content { | |
29 | |
30 namespace { | |
31 | |
32 const int kNumCalls = 10; | |
33 | |
34 // This class mocks the audio manager and overrides some methods to ensure that | |
35 // we can run simulate device changes. | |
36 class MockAudioManager : public media::FakeAudioManager { | |
37 public: | |
38 MockAudioManager() | |
39 : FakeAudioManager(base::ThreadTaskRunnerHandle::Get(), | |
40 base::ThreadTaskRunnerHandle::Get(), | |
41 &fake_audio_log_factory_), | |
42 num_output_devices_(2), | |
43 num_input_devices_(2) {} | |
44 ~MockAudioManager() override {} | |
45 | |
46 MOCK_METHOD1(MockGetAudioInputDeviceNames, void(media::AudioDeviceNames*)); | |
47 MOCK_METHOD1(MockGetAudioOutputDeviceNames, void(media::AudioDeviceNames*)); | |
48 | |
49 void GetAudioInputDeviceNames( | |
50 media::AudioDeviceNames* device_names) override { | |
51 DCHECK(device_names->empty()); | |
52 for (size_t i = 0; i < num_input_devices_; i++) { | |
53 device_names->push_back(media::AudioDeviceName( | |
54 std::string("fake_device_name_") + base::SizeTToString(i), | |
55 std::string("fake_device_id_") + base::SizeTToString(i))); | |
56 } | |
57 MockGetAudioInputDeviceNames(device_names); | |
58 } | |
59 | |
60 void GetAudioOutputDeviceNames( | |
61 media::AudioDeviceNames* device_names) override { | |
62 DCHECK(device_names->empty()); | |
63 for (size_t i = 0; i < num_output_devices_; i++) { | |
64 device_names->push_back(media::AudioDeviceName( | |
65 std::string("fake_device_name_") + base::SizeTToString(i), | |
66 std::string("fake_device_id_") + base::SizeTToString(i))); | |
67 } | |
68 MockGetAudioOutputDeviceNames(device_names); | |
69 } | |
70 | |
71 media::AudioParameters GetDefaultOutputStreamParameters() override { | |
72 return media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | |
73 media::CHANNEL_LAYOUT_STEREO, 48000, 16, 128); | |
74 } | |
75 | |
76 media::AudioParameters GetOutputStreamParameters( | |
77 const std::string& device_id) override { | |
78 return media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | |
79 media::CHANNEL_LAYOUT_STEREO, 48000, 16, 128); | |
80 } | |
81 | |
82 void SetNumAudioOutputDevices(size_t num_devices) { | |
83 num_output_devices_ = num_devices; | |
84 } | |
85 | |
86 void SetNumAudioInputDevices(size_t num_devices) { | |
87 num_input_devices_ = num_devices; | |
88 } | |
89 | |
90 private: | |
91 media::FakeAudioLogFactory fake_audio_log_factory_; | |
92 size_t num_output_devices_; | |
93 size_t num_input_devices_; | |
94 DISALLOW_COPY_AND_ASSIGN(MockAudioManager); | |
95 }; | |
96 | |
97 // This class mocks the video capture device factory and overrides some methods | |
98 // to ensure that we can simulate device changes. | |
99 class MockVideoCaptureDeviceFactory | |
100 : public media::FakeVideoCaptureDeviceFactory { | |
101 public: | |
102 MockVideoCaptureDeviceFactory() {} | |
103 ~MockVideoCaptureDeviceFactory() override {} | |
104 | |
105 MOCK_METHOD0(MockGetDeviceDescriptors, void()); | |
106 void GetDeviceDescriptors( | |
107 media::VideoCaptureDeviceDescriptors* device_descriptors) override { | |
108 media::FakeVideoCaptureDeviceFactory::GetDeviceDescriptors( | |
109 device_descriptors); | |
110 MockGetDeviceDescriptors(); | |
111 } | |
112 }; | |
113 | |
114 } // namespace | |
115 | |
116 class MediaDevicesManagerTest : public ::testing::Test { | |
117 public: | |
118 MediaDevicesManagerTest() | |
119 : video_capture_device_factory_(nullptr), | |
120 thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {} | |
121 ~MediaDevicesManagerTest() override {} | |
122 | |
123 MOCK_METHOD1(MockCallback, void(const MediaDeviceEnumeration&)); | |
124 | |
125 void EnumerateCallback(base::RunLoop* run_loop, | |
126 const MediaDeviceEnumeration& result) { | |
127 MockCallback(result); | |
128 run_loop->Quit(); | |
129 } | |
130 | |
131 protected: | |
132 void SetUp() override { | |
133 audio_manager_.reset(new MockAudioManager()); | |
134 video_capture_manager_ = new VideoCaptureManager( | |
135 std::unique_ptr<media::VideoCaptureDeviceFactory>( | |
136 new MockVideoCaptureDeviceFactory())); | |
137 video_capture_manager_->Register(nullptr, | |
138 base::ThreadTaskRunnerHandle::Get()); | |
139 video_capture_device_factory_ = static_cast<MockVideoCaptureDeviceFactory*>( | |
140 video_capture_manager_->video_capture_device_factory()); | |
141 media_devices_manager_.reset(new MediaDevicesManager( | |
142 audio_manager_.get(), video_capture_manager_, nullptr)); | |
143 } | |
144 | |
145 std::unique_ptr<MediaDevicesManager> media_devices_manager_; | |
146 scoped_refptr<VideoCaptureManager> video_capture_manager_; | |
147 MockVideoCaptureDeviceFactory* video_capture_device_factory_; | |
148 TestBrowserThreadBundle thread_bundle_; | |
149 std::unique_ptr<MockAudioManager, media::AudioManagerDeleter> audio_manager_; | |
150 | |
151 private: | |
152 DISALLOW_COPY_AND_ASSIGN(MediaDevicesManagerTest); | |
153 }; | |
154 | |
155 TEST_F(MediaDevicesManagerTest, EnumerateNoCacheAudioInput) { | |
156 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)) | |
157 .Times(kNumCalls); | |
158 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
159 .Times(0); | |
160 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0); | |
161 EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls); | |
162 for (int i = 0; i < kNumCalls; i++) { | |
hta - Chromium
2016/09/20 09:41:38
Why is running this loop 10 times a correct number
Guido Urdaneta
2016/09/20 13:59:27
The goal of using a relatively large number greate
| |
163 base::RunLoop run_loop; | |
164 media_devices_manager_->EnumerateDevices( | |
165 {{true, false, false}}, | |
166 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
167 base::Unretained(this), &run_loop)); | |
168 run_loop.Run(); | |
169 } | |
170 } | |
171 | |
172 TEST_F(MediaDevicesManagerTest, EnumerateNoCacheVideoInput) { | |
173 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(0); | |
174 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
175 .Times(kNumCalls); | |
176 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0); | |
177 EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls); | |
178 for (int i = 0; i < kNumCalls; i++) { | |
179 base::RunLoop run_loop; | |
180 media_devices_manager_->EnumerateDevices( | |
181 {{false, true, false}}, | |
182 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
183 base::Unretained(this), &run_loop)); | |
184 run_loop.Run(); | |
185 } | |
186 } | |
187 | |
188 TEST_F(MediaDevicesManagerTest, EnumerateNoCacheAudioOutput) { | |
189 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(0); | |
190 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
191 .Times(0); | |
192 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)) | |
193 .Times(kNumCalls); | |
194 EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls); | |
195 for (int i = 0; i < kNumCalls; i++) { | |
196 base::RunLoop run_loop; | |
197 media_devices_manager_->EnumerateDevices( | |
198 {{false, false, true}}, | |
199 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
200 base::Unretained(this), &run_loop)); | |
201 run_loop.Run(); | |
202 } | |
203 } | |
204 | |
205 TEST_F(MediaDevicesManagerTest, EnumerateNoCacheAudio) { | |
206 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)) | |
207 .Times(kNumCalls); | |
208 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)) | |
209 .Times(kNumCalls); | |
210 EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls); | |
211 for (int i = 0; i < kNumCalls; i++) { | |
212 base::RunLoop run_loop; | |
213 media_devices_manager_->EnumerateDevices( | |
214 {{true, false, true}}, | |
215 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
216 base::Unretained(this), &run_loop)); | |
217 run_loop.Run(); | |
218 } | |
219 } | |
220 | |
221 TEST_F(MediaDevicesManagerTest, EnumerateCacheAudio) { | |
222 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(1); | |
223 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
224 .Times(0); | |
225 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(1); | |
226 EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls); | |
227 media_devices_manager_->StartMonitoring(); | |
228 media_devices_manager_->SetCachePolicy( | |
229 MEDIA_DEVICE_TYPE_AUDIO_INPUT, | |
230 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
231 media_devices_manager_->SetCachePolicy( | |
232 MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, | |
233 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
234 for (int i = 0; i < kNumCalls; i++) { | |
235 base::RunLoop run_loop; | |
236 media_devices_manager_->EnumerateDevices( | |
237 {{true, false, true}}, | |
238 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
239 base::Unretained(this), &run_loop)); | |
240 run_loop.Run(); | |
241 } | |
242 } | |
243 | |
244 TEST_F(MediaDevicesManagerTest, EnumerateCacheVideo) { | |
245 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(0); | |
246 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
247 .Times(1); | |
248 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0); | |
249 EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls); | |
250 media_devices_manager_->SetCachePolicy( | |
251 MEDIA_DEVICE_TYPE_VIDEO_INPUT, | |
252 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
253 for (int i = 0; i < kNumCalls; i++) { | |
254 base::RunLoop run_loop; | |
255 media_devices_manager_->EnumerateDevices( | |
256 {{false, true, false}}, | |
257 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
258 base::Unretained(this), &run_loop)); | |
259 run_loop.Run(); | |
260 } | |
261 } | |
262 | |
263 TEST_F(MediaDevicesManagerTest, EnumerateCacheAudioWithDeviceChanges) { | |
264 MediaDeviceEnumeration enumeration; | |
265 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(2); | |
266 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
267 .Times(0); | |
268 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(2); | |
269 EXPECT_CALL(*this, MockCallback(_)) | |
270 .Times(2 * kNumCalls) | |
271 .WillRepeatedly(SaveArg<0>(&enumeration)); | |
272 | |
273 size_t num_audio_input_devices = 5; | |
274 size_t num_audio_output_devices = 3; | |
275 audio_manager_->SetNumAudioInputDevices(num_audio_input_devices); | |
276 audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices); | |
277 media_devices_manager_->SetCachePolicy( | |
278 MEDIA_DEVICE_TYPE_AUDIO_INPUT, | |
279 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
280 media_devices_manager_->SetCachePolicy( | |
281 MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, | |
282 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
283 for (int i = 0; i < kNumCalls; i++) { | |
284 base::RunLoop run_loop; | |
285 media_devices_manager_->EnumerateDevices( | |
286 {{true, false, true}}, | |
287 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
288 base::Unretained(this), &run_loop)); | |
289 run_loop.Run(); | |
290 EXPECT_EQ(num_audio_input_devices, | |
291 enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size()); | |
292 EXPECT_EQ(num_audio_output_devices, | |
293 enumeration[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size()); | |
294 } | |
295 | |
296 // Simulate device change | |
297 num_audio_input_devices = 3; | |
298 num_audio_output_devices = 4; | |
299 audio_manager_->SetNumAudioInputDevices(num_audio_input_devices); | |
300 audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices); | |
301 media_devices_manager_->OnDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO); | |
302 | |
303 for (int i = 0; i < kNumCalls; i++) { | |
304 base::RunLoop run_loop; | |
305 media_devices_manager_->EnumerateDevices( | |
306 {{true, false, true}}, | |
307 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
308 base::Unretained(this), &run_loop)); | |
309 run_loop.Run(); | |
310 EXPECT_EQ(num_audio_input_devices, | |
311 enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size()); | |
312 EXPECT_EQ(num_audio_output_devices, | |
313 enumeration[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size()); | |
314 } | |
315 } | |
316 | |
317 TEST_F(MediaDevicesManagerTest, EnumerateCacheVideoWithDeviceChanges) { | |
318 MediaDeviceEnumeration enumeration; | |
319 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0); | |
320 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
321 .Times(2); | |
322 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(0); | |
323 EXPECT_CALL(*this, MockCallback(_)) | |
324 .Times(2 * kNumCalls) | |
325 .WillRepeatedly(SaveArg<0>(&enumeration)); | |
326 | |
327 // Simulate device change | |
328 size_t num_video_input_devices = 5; | |
329 video_capture_device_factory_->set_number_of_devices(num_video_input_devices); | |
330 media_devices_manager_->SetCachePolicy( | |
331 MEDIA_DEVICE_TYPE_VIDEO_INPUT, | |
332 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
333 for (int i = 0; i < kNumCalls; i++) { | |
334 base::RunLoop run_loop; | |
335 media_devices_manager_->EnumerateDevices( | |
336 {{false, true, false}}, | |
337 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
338 base::Unretained(this), &run_loop)); | |
339 run_loop.Run(); | |
340 EXPECT_EQ(num_video_input_devices, | |
341 enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size()); | |
342 } | |
343 | |
344 // Simulate device change | |
345 num_video_input_devices = 9; | |
346 video_capture_device_factory_->set_number_of_devices(num_video_input_devices); | |
347 media_devices_manager_->OnDevicesChanged( | |
348 base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE); | |
349 | |
350 for (int i = 0; i < kNumCalls; i++) { | |
351 base::RunLoop run_loop; | |
352 media_devices_manager_->EnumerateDevices( | |
353 {{false, true, false}}, | |
354 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
355 base::Unretained(this), &run_loop)); | |
356 run_loop.Run(); | |
357 EXPECT_EQ(num_video_input_devices, | |
358 enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size()); | |
359 } | |
360 } | |
361 | |
362 TEST_F(MediaDevicesManagerTest, EnumerateCacheAllWithDeviceChanges) { | |
363 MediaDeviceEnumeration enumeration; | |
364 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(2); | |
365 EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors()) | |
366 .Times(2); | |
367 EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(2); | |
368 EXPECT_CALL(*this, MockCallback(_)) | |
369 .Times(2 * kNumCalls) | |
370 .WillRepeatedly(SaveArg<0>(&enumeration)); | |
371 | |
372 size_t num_audio_input_devices = 5; | |
373 size_t num_video_input_devices = 4; | |
374 size_t num_audio_output_devices = 3; | |
375 audio_manager_->SetNumAudioInputDevices(num_audio_input_devices); | |
376 video_capture_device_factory_->set_number_of_devices(num_video_input_devices); | |
377 audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices); | |
378 media_devices_manager_->SetCachePolicy( | |
379 MEDIA_DEVICE_TYPE_AUDIO_INPUT, | |
380 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
381 media_devices_manager_->SetCachePolicy( | |
382 MEDIA_DEVICE_TYPE_VIDEO_INPUT, | |
383 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
384 media_devices_manager_->SetCachePolicy( | |
385 MEDIA_DEVICE_TYPE_AUDIO_OUTPUT, | |
386 MediaDevicesManager::CachePolicy::SYSTEM_MONITOR); | |
387 for (int i = 0; i < kNumCalls; i++) { | |
388 base::RunLoop run_loop; | |
389 media_devices_manager_->EnumerateDevices( | |
390 {{true, true, true}}, | |
391 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
392 base::Unretained(this), &run_loop)); | |
393 run_loop.Run(); | |
394 EXPECT_EQ(num_audio_input_devices, | |
395 enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size()); | |
396 EXPECT_EQ(num_video_input_devices, | |
397 enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size()); | |
398 EXPECT_EQ(num_audio_output_devices, | |
399 enumeration[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size()); | |
400 } | |
401 | |
402 // Simulate device changes | |
403 num_audio_input_devices = 3; | |
404 num_video_input_devices = 2; | |
405 num_audio_output_devices = 4; | |
406 audio_manager_->SetNumAudioInputDevices(num_audio_input_devices); | |
407 video_capture_device_factory_->set_number_of_devices(num_video_input_devices); | |
408 audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices); | |
409 media_devices_manager_->OnDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO); | |
410 media_devices_manager_->OnDevicesChanged( | |
411 base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE); | |
412 | |
413 for (int i = 0; i < kNumCalls; i++) { | |
414 base::RunLoop run_loop; | |
415 media_devices_manager_->EnumerateDevices( | |
416 {{true, true, true}}, | |
417 base::Bind(&MediaDevicesManagerTest::EnumerateCallback, | |
418 base::Unretained(this), &run_loop)); | |
419 run_loop.Run(); | |
420 EXPECT_EQ(num_audio_input_devices, | |
421 enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size()); | |
422 EXPECT_EQ(num_video_input_devices, | |
423 enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size()); | |
424 EXPECT_EQ(num_audio_output_devices, | |
425 enumeration[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size()); | |
426 } | |
427 } | |
428 | |
429 } // namespace content | |
OLD | NEW |