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

Side by Side Diff: content/browser/renderer_host/media/media_devices_manager_unittest.cc

Issue 2350693002: Remove device enumeration, caching and monitoring from MediaStreamManager. (Closed)
Patch Set: Minor DCHECK fix Created 4 years, 3 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
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698