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

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

Issue 2443573003: Factor out AudioOutputDelegate from AudioRendererHost. (Closed)
Patch Set: . Created 4 years 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 (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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698