OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
DaleCurtis
2016/11/29 20:31:23
No (c), 2016?
| |
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/audio_output_delegate.h" | |
6 | |
7 #include <stdint.h> | |
8 | |
9 #include <memory> | |
10 #include <utility> | |
11 | |
12 #include "base/bind.h" | |
13 #include "base/command_line.h" | |
14 #include "base/message_loop/message_loop.h" | |
15 #include "base/run_loop.h" | |
16 #include "content/browser/media/capture/audio_mirroring_manager.h" | |
17 #include "content/browser/renderer_host/media/media_stream_manager.h" | |
18 #include "content/public/browser/browser_thread.h" | |
19 #include "content/public/test/mock_render_process_host.h" | |
20 #include "content/public/test/test_browser_context.h" | |
21 #include "content/public/test/test_browser_thread_bundle.h" | |
22 #include "content/test/test_web_contents.h" | |
23 #include "media/audio/fake_audio_log_factory.h" | |
24 #include "media/audio/fake_audio_manager.h" | |
25 #include "media/base/media_switches.h" | |
26 #include "testing/gmock/include/gmock/gmock.h" | |
27 #include "testing/gtest/include/gtest/gtest.h" | |
28 | |
29 using ::testing::_; | |
30 using ::testing::InSequence; | |
31 using ::testing::NotNull; | |
32 using ::testing::StrictMock; | |
33 | |
34 // Not yet tested: | |
DaleCurtis
2016/11/29 20:31:23
TBD?
Max Morin
2016/12/01 16:08:37
Setting up TestWebContents and all the stuff aroun
DaleCurtis
2016/12/01 19:33:06
I was just asking if you were planning to fix this
| |
35 // - Interactions with AudioStreamMonitor (goes through WebContentsImpl, | |
36 // so it's a bit tricky). | |
37 // - Logging (small risk of bugs, not worth the effort). | |
38 // - That the returned socket/memory is correctly set up. | |
39 | |
40 namespace content { | |
41 | |
42 namespace { | |
43 | |
44 const int kRenderProcessId = 1; | |
45 const int kRenderFrameId = 5; | |
46 const int kStreamId = 50; | |
47 const char kDefaultDeviceId[] = ""; | |
48 | |
49 struct MockAudioMirroringManager : public AudioMirroringManager { | |
DaleCurtis
2016/11/29 20:31:23
Why use struct all over here? Seems a lie :)
miu
2016/11/29 21:36:27
This is probably my fault (circa 2012).
Max Morin
2016/12/01 16:08:37
Use of struct was just a lazy way to also say publ
| |
50 MOCK_METHOD3(AddDiverter, | |
51 void(int render_process_id, | |
52 int render_frame_id, | |
53 Diverter* diverter)); | |
54 MOCK_METHOD1(RemoveDiverter, void(Diverter* diverter)); | |
55 }; | |
56 | |
57 struct MockObserver : public content::MediaObserver { | |
58 void OnAudioCaptureDevicesChanged() override {} | |
59 void OnVideoCaptureDevicesChanged() override {} | |
60 void OnMediaRequestStateChanged(int render_process_id, | |
61 int render_frame_id, | |
62 int page_request_id, | |
63 const GURL& security_origin, | |
64 MediaStreamType stream_type, | |
65 MediaRequestState state) override {} | |
66 void OnSetCapturingLinkSecured(int render_process_id, | |
67 int render_frame_id, | |
68 int page_request_id, | |
69 MediaStreamType stream_type, | |
70 bool is_secure) override {} | |
71 | |
72 MOCK_METHOD2(OnCreatingAudioStream, | |
73 void(int render_process_id, int render_frame_id)); | |
74 }; | |
75 | |
76 struct MockEventHandler : public AudioOutputDelegate::EventHandler { | |
77 MOCK_METHOD1(OnStreamStateChanged, void(bool playing)); | |
78 MOCK_METHOD3(OnStreamCreated, | |
79 void(int stream_id, | |
80 base::SharedMemory* shared_memory, | |
81 base::CancelableSyncSocket* socket)); | |
82 MOCK_METHOD1(OnStreamError, void(int stream_id)); | |
83 }; | |
84 | |
85 struct DummyAudioOutputStream : public media::AudioOutputStream { | |
86 bool Open() override { return true; } | |
87 void Start(AudioSourceCallback* cb) override {} | |
88 void Stop() override {} | |
89 void SetVolume(double volume) override {} | |
90 void GetVolume(double* volume) override { *volume = 1; } | |
91 void Close() override {} | |
92 }; | |
93 | |
94 } // namespace | |
95 | |
96 class AudioOutputDelegateTest : public testing::Test { | |
97 public: | |
98 AudioOutputDelegateTest() { | |
99 base::CommandLine::ForCurrentProcess()->AppendSwitch( | |
100 switches::kUseFakeDeviceForMediaStream); | |
101 | |
102 // This test uses real UI, IO and audio threads. | |
103 // AudioOutputDelegate mainly interacts with the IO and audio threads, | |
104 // but interacts with UI for bad messages, so using these threads should | |
105 // approximate the real conditions of AudioOutputDelegate well. | |
106 thread_bundle_ = base::MakeUnique<TestBrowserThreadBundle>( | |
107 TestBrowserThreadBundle::Options::REAL_IO_THREAD); | |
108 audio_thread_ = base::MakeUnique<base::Thread>("AudioThread"); | |
109 | |
110 // Audio manager creation stolen from content/browser/browser_main_loop.cc. | |
DaleCurtis
2016/11/29 20:31:23
Probably don't need all this. Just use one of the
Max Morin
2016/12/01 16:08:37
:). I'd like to at least have tests when the audio
DaleCurtis
2016/12/01 19:33:06
That seems fine, but if such a class is created I
Max Morin
2016/12/02 12:07:37
Yes, I absolutely agree! I created content/browser
| |
111 #if defined(OS_WIN) | |
112 audio_thread_->init_com_with_mta(true); | |
113 #endif // defined(OS_WIN) | |
114 CHECK(audio_thread_->Start()); | |
115 | |
116 #if defined(OS_MACOSX) | |
117 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner = | |
118 base::ThreadTaskRunnerHandle::Get(); | |
119 #else | |
120 scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner = | |
121 audio_thread_->task_runner(); | |
122 #endif // defined(OS_MACOSX) | |
123 | |
124 audio_manager_.reset(new media::FakeAudioManager( | |
125 audio_task_runner, audio_thread_->task_runner(), &log_factory_)); | |
126 media_stream_manager_ = | |
127 base::MakeUnique<MediaStreamManager>(audio_manager_.get()); | |
128 } | |
129 | |
130 // Test bodies are here, so that we can run them on the IO thread. | |
131 void CreateTest(base::Closure done) { | |
132 EXPECT_CALL(media_observer_, | |
133 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
134 EXPECT_CALL(event_handler_, | |
135 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
136 EXPECT_CALL(mirroring_manager_, | |
137 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
138 | |
139 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
140 &event_handler_, audio_manager_.get(), | |
141 log_factory_.CreateAudioLog( | |
142 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
143 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
144 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
145 kDefaultDeviceId); | |
146 | |
147 SyncWithAllThreads(); | |
148 | |
149 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
150 delegate.reset(); | |
151 SyncWithAllThreads(); | |
152 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
153 } | |
154 | |
155 void PlayTest(base::Closure done) { | |
156 EXPECT_CALL(media_observer_, | |
157 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
158 EXPECT_CALL(event_handler_, | |
159 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
160 EXPECT_CALL(mirroring_manager_, | |
161 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
162 { | |
163 InSequence s; | |
164 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | |
165 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | |
166 } | |
167 | |
168 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
169 &event_handler_, audio_manager_.get(), | |
170 log_factory_.CreateAudioLog( | |
171 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
172 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
173 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
174 kDefaultDeviceId); | |
175 | |
176 delegate->OnPlayStream(); | |
177 | |
178 SyncWithAllThreads(); | |
179 | |
180 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
181 delegate.reset(); | |
182 SyncWithAllThreads(); | |
183 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
184 } | |
185 | |
186 void PauseTest(base::Closure done) { | |
187 EXPECT_CALL(media_observer_, | |
188 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
189 EXPECT_CALL(event_handler_, | |
190 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
191 EXPECT_CALL(mirroring_manager_, | |
192 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
193 | |
194 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
195 &event_handler_, audio_manager_.get(), | |
196 log_factory_.CreateAudioLog( | |
197 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
198 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
199 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
200 kDefaultDeviceId); | |
201 | |
202 delegate->OnPauseStream(); | |
203 | |
204 SyncWithAllThreads(); | |
205 | |
206 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
207 delegate.reset(); | |
208 SyncWithAllThreads(); | |
209 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
210 } | |
211 | |
212 void PlayPausePlayTest(base::Closure done) { | |
213 EXPECT_CALL(media_observer_, | |
214 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
215 EXPECT_CALL(event_handler_, | |
216 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
217 EXPECT_CALL(mirroring_manager_, | |
218 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
219 { | |
220 InSequence s; | |
221 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | |
222 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | |
223 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | |
224 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | |
225 } | |
226 | |
227 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
228 &event_handler_, audio_manager_.get(), | |
229 log_factory_.CreateAudioLog( | |
230 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
231 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
232 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
233 kDefaultDeviceId); | |
234 | |
235 delegate->OnPlayStream(); | |
236 delegate->OnPauseStream(); | |
237 delegate->OnPlayStream(); | |
238 | |
239 SyncWithAllThreads(); | |
240 | |
241 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
242 delegate.reset(); | |
243 SyncWithAllThreads(); | |
244 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
245 } | |
246 | |
247 void PlayPlayTest(base::Closure done) { | |
248 EXPECT_CALL(media_observer_, | |
249 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
250 EXPECT_CALL(event_handler_, | |
251 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
252 EXPECT_CALL(mirroring_manager_, | |
253 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
254 { | |
255 InSequence s; | |
256 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | |
257 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | |
258 } | |
259 | |
260 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
261 &event_handler_, audio_manager_.get(), | |
262 log_factory_.CreateAudioLog( | |
263 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
264 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
265 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
266 kDefaultDeviceId); | |
267 | |
268 delegate->OnPlayStream(); | |
269 delegate->OnPlayStream(); | |
270 | |
271 SyncWithAllThreads(); | |
272 | |
273 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
274 delegate.reset(); | |
275 SyncWithAllThreads(); | |
276 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
277 } | |
278 | |
279 void CreateDivertTest(base::Closure done) { | |
280 EXPECT_CALL(media_observer_, | |
281 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
282 EXPECT_CALL(event_handler_, | |
283 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
284 EXPECT_CALL(mirroring_manager_, | |
285 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
286 | |
287 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
288 &event_handler_, audio_manager_.get(), | |
289 log_factory_.CreateAudioLog( | |
290 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
291 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
292 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
293 kDefaultDeviceId); | |
294 | |
295 DummyAudioOutputStream stream; | |
296 delegate->controller()->StartDiverting(&stream); | |
297 | |
298 SyncWithAllThreads(); | |
299 | |
300 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
301 delegate.reset(); | |
302 SyncWithAllThreads(); | |
303 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
304 } | |
305 | |
306 void CreateDivertPauseTest(base::Closure done) { | |
307 EXPECT_CALL(media_observer_, | |
308 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
309 EXPECT_CALL(event_handler_, | |
310 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
311 EXPECT_CALL(mirroring_manager_, | |
312 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
313 | |
314 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
315 &event_handler_, audio_manager_.get(), | |
316 log_factory_.CreateAudioLog( | |
317 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
318 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
319 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
320 kDefaultDeviceId); | |
321 | |
322 DummyAudioOutputStream stream; | |
323 delegate->controller()->StartDiverting(&stream); | |
324 | |
325 SyncWithAllThreads(); | |
326 delegate->OnPauseStream(); | |
327 | |
328 SyncWithAllThreads(); | |
329 | |
330 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
331 delegate.reset(); | |
332 SyncWithAllThreads(); | |
333 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
334 } | |
335 | |
336 void PlayDivertTest(base::Closure done) { | |
337 EXPECT_CALL(media_observer_, | |
338 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
339 EXPECT_CALL(event_handler_, | |
340 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
341 EXPECT_CALL(mirroring_manager_, | |
342 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
343 { | |
344 InSequence s; | |
345 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | |
346 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | |
347 } | |
348 | |
349 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
350 &event_handler_, audio_manager_.get(), | |
351 log_factory_.CreateAudioLog( | |
352 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
353 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
354 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
355 kDefaultDeviceId); | |
356 | |
357 DummyAudioOutputStream stream; | |
358 delegate->OnPlayStream(); | |
359 delegate->controller()->StartDiverting(&stream); | |
360 | |
361 SyncWithAllThreads(); | |
362 | |
363 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
364 delegate.reset(); | |
365 SyncWithAllThreads(); | |
366 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
367 } | |
368 | |
369 void ErrorTest(base::Closure done) { | |
370 EXPECT_CALL(media_observer_, | |
371 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
372 EXPECT_CALL(event_handler_, | |
373 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
374 EXPECT_CALL(event_handler_, OnStreamError(kStreamId)); | |
375 EXPECT_CALL(mirroring_manager_, | |
376 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
377 | |
378 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
379 &event_handler_, audio_manager_.get(), | |
380 log_factory_.CreateAudioLog( | |
381 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
382 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
383 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
384 kDefaultDeviceId); | |
385 | |
386 delegate->controller()->OnError(nullptr); | |
387 | |
388 SyncWithAllThreads(); | |
389 | |
390 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
391 delegate.reset(); | |
392 SyncWithAllThreads(); | |
393 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
394 } | |
395 | |
396 void CreateAndDestroyTest(base::Closure done) { | |
397 EXPECT_CALL(media_observer_, | |
398 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
399 EXPECT_CALL(mirroring_manager_, | |
400 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
401 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
402 | |
403 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
404 &event_handler_, audio_manager_.get(), | |
405 log_factory_.CreateAudioLog( | |
406 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
407 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
408 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
409 kDefaultDeviceId); | |
410 | |
411 delegate.reset(); | |
412 SyncWithAllThreads(); | |
413 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
414 } | |
415 | |
416 void PlayAndDestroyTest(base::Closure done) { | |
417 EXPECT_CALL(media_observer_, | |
418 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
419 EXPECT_CALL(event_handler_, | |
420 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
421 EXPECT_CALL(mirroring_manager_, | |
422 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
423 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
424 | |
425 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
426 &event_handler_, audio_manager_.get(), | |
427 log_factory_.CreateAudioLog( | |
428 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
429 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
430 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
431 kDefaultDeviceId); | |
432 | |
433 SyncWithAllThreads(); | |
434 | |
435 delegate->OnPlayStream(); | |
436 delegate.reset(); | |
437 SyncWithAllThreads(); | |
438 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
439 } | |
440 | |
441 void ErrorAndDestroyTest(base::Closure done) { | |
442 EXPECT_CALL(media_observer_, | |
443 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | |
444 EXPECT_CALL(event_handler_, | |
445 OnStreamCreated(kStreamId, NotNull(), NotNull())); | |
446 EXPECT_CALL(mirroring_manager_, | |
447 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | |
448 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | |
449 | |
450 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | |
451 &event_handler_, audio_manager_.get(), | |
452 log_factory_.CreateAudioLog( | |
453 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | |
454 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | |
455 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | |
456 kDefaultDeviceId); | |
457 SyncWithAllThreads(); | |
458 | |
459 delegate->controller()->OnError(nullptr); | |
460 delegate.reset(); | |
461 SyncWithAllThreads(); | |
462 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | |
463 } | |
464 | |
465 protected: | |
466 // MediaStreamManager uses a DestructionObserver, so it must outlive the | |
467 // TestBrowserThreadBundle. | |
468 std::unique_ptr<MediaStreamManager> media_stream_manager_; | |
469 std::unique_ptr<TestBrowserThreadBundle> thread_bundle_; | |
470 std::unique_ptr<base::Thread> audio_thread_; | |
471 media::ScopedAudioManagerPtr audio_manager_; | |
472 StrictMock<MockAudioMirroringManager> mirroring_manager_; | |
473 StrictMock<MockEventHandler> event_handler_; | |
474 StrictMock<MockObserver> media_observer_; | |
475 media::FakeAudioLogFactory log_factory_; | |
476 | |
477 private: | |
478 void SyncWithAllThreads() { | |
479 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
480 // New tasks might be posted while we are syncing, but in every iteration at | |
481 // least one task will be run. 20 iterations should be enough for our code. | |
482 for (int i = 0; i < 20; ++i) { | |
483 { | |
484 base::MessageLoop::ScopedNestableTaskAllower allower( | |
485 base::MessageLoop::current()); | |
486 base::RunLoop().RunUntilIdle(); | |
487 } | |
488 SyncWith(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)); | |
489 SyncWith(audio_thread_->task_runner()); | |
490 } | |
491 } | |
492 | |
493 void SyncWith(scoped_refptr<base::SingleThreadTaskRunner> task_runner) { | |
494 CHECK(task_runner); | |
495 CHECK(!task_runner->BelongsToCurrentThread()); | |
496 base::WaitableEvent e = {base::WaitableEvent::ResetPolicy::MANUAL, | |
497 base::WaitableEvent::InitialState::NOT_SIGNALED}; | |
498 task_runner->PostTask(FROM_HERE, base::Bind(&base::WaitableEvent::Signal, | |
499 base::Unretained(&e))); | |
500 e.Wait(); | |
501 } | |
502 | |
503 DISALLOW_COPY_AND_ASSIGN(AudioOutputDelegateTest); | |
504 }; | |
505 | |
506 TEST_F(AudioOutputDelegateTest, Create) { | |
507 base::RunLoop l; | |
508 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
509 base::Bind(&AudioOutputDelegateTest::CreateTest, | |
510 base::Unretained(this), l.QuitClosure())); | |
511 l.Run(); | |
512 } | |
513 | |
514 TEST_F(AudioOutputDelegateTest, Play) { | |
515 base::RunLoop l; | |
516 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
517 base::Bind(&AudioOutputDelegateTest::PlayTest, | |
518 base::Unretained(this), l.QuitClosure())); | |
519 l.Run(); | |
520 } | |
521 | |
522 TEST_F(AudioOutputDelegateTest, Pause) { | |
523 base::RunLoop l; | |
524 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
525 base::Bind(&AudioOutputDelegateTest::PauseTest, | |
526 base::Unretained(this), l.QuitClosure())); | |
527 l.Run(); | |
528 } | |
529 | |
530 TEST_F(AudioOutputDelegateTest, PlayPausePlay) { | |
531 base::RunLoop l; | |
532 BrowserThread::PostTask( | |
533 BrowserThread::IO, FROM_HERE, | |
534 base::Bind(&AudioOutputDelegateTest::PlayPausePlayTest, | |
535 base::Unretained(this), l.QuitClosure())); | |
536 l.Run(); | |
537 } | |
538 | |
539 TEST_F(AudioOutputDelegateTest, PlayPlay) { | |
540 base::RunLoop l; | |
541 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
542 base::Bind(&AudioOutputDelegateTest::PlayPlayTest, | |
543 base::Unretained(this), l.QuitClosure())); | |
544 l.Run(); | |
545 } | |
546 | |
547 TEST_F(AudioOutputDelegateTest, PlayDivert) { | |
548 base::RunLoop l; | |
549 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
550 base::Bind(&AudioOutputDelegateTest::PlayDivertTest, | |
551 base::Unretained(this), l.QuitClosure())); | |
552 l.Run(); | |
553 } | |
554 | |
555 TEST_F(AudioOutputDelegateTest, CreateDivert) { | |
556 base::RunLoop l; | |
557 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
558 base::Bind(&AudioOutputDelegateTest::CreateDivertTest, | |
559 base::Unretained(this), l.QuitClosure())); | |
560 l.Run(); | |
561 } | |
562 | |
563 TEST_F(AudioOutputDelegateTest, Error) { | |
564 base::RunLoop l; | |
565 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
566 base::Bind(&AudioOutputDelegateTest::ErrorTest, | |
567 base::Unretained(this), l.QuitClosure())); | |
568 l.Run(); | |
569 } | |
570 | |
571 TEST_F(AudioOutputDelegateTest, CreateAndDestroy) { | |
572 base::RunLoop l; | |
573 BrowserThread::PostTask( | |
574 BrowserThread::IO, FROM_HERE, | |
575 base::Bind(&AudioOutputDelegateTest::CreateAndDestroyTest, | |
576 base::Unretained(this), l.QuitClosure())); | |
577 l.Run(); | |
578 } | |
579 | |
580 TEST_F(AudioOutputDelegateTest, PlayAndDestroy) { | |
581 base::RunLoop l; | |
582 BrowserThread::PostTask( | |
583 BrowserThread::IO, FROM_HERE, | |
584 base::Bind(&AudioOutputDelegateTest::PlayAndDestroyTest, | |
585 base::Unretained(this), l.QuitClosure())); | |
586 l.Run(); | |
587 } | |
588 | |
589 TEST_F(AudioOutputDelegateTest, ErrorAndDestroy) { | |
590 base::RunLoop l; | |
591 BrowserThread::PostTask( | |
592 BrowserThread::IO, FROM_HERE, | |
593 base::Bind(&AudioOutputDelegateTest::PlayAndDestroyTest, | |
594 base::Unretained(this), l.QuitClosure())); | |
595 l.Run(); | |
596 } | |
597 | |
598 } // namespace content | |
OLD | NEW |