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

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

Powered by Google App Engine
This is Rietveld 408576698