| Index: media/audio/audio_output_proxy_unittest.cc
|
| diff --git a/media/audio/audio_output_proxy_unittest.cc b/media/audio/audio_output_proxy_unittest.cc
|
| index 66f8987a0aaf6ee6c6d8296f6794dde7f04eb2a5..b0750cc0a883558c6beda20f26b9a7287bd7a779 100644
|
| --- a/media/audio/audio_output_proxy_unittest.cc
|
| +++ b/media/audio/audio_output_proxy_unittest.cc
|
| @@ -674,4 +674,57 @@ TEST_F(AudioOutputResamplerTest, LowLatencyOpenEventuallyFails) {
|
| EXPECT_TRUE(stream2.start_called());
|
| }
|
|
|
| +// Simulate failures to open both the low latency and the fallback high latency
|
| +// stream and ensure AudioOutputResampler falls back to a fake stream. Ensure
|
| +// that after the close delay elapses, opening another stream succeeds with a
|
| +// non-fake stream.
|
| +TEST_F(AudioOutputResamplerTest, FallbackRecovery) {
|
| + MockAudioOutputStream fake_stream(&manager_, params_);
|
| +
|
| + // Trigger the fallback mechanism until a fake output stream is created.
|
| +#if defined(OS_WIN)
|
| + static const int kFallbackCount = 2;
|
| +#else
|
| + static const int kFallbackCount = 1;
|
| +#endif
|
| + EXPECT_CALL(manager(), MakeAudioOutputStream(_, _))
|
| + .Times(kFallbackCount)
|
| + .WillRepeatedly(Return(static_cast<AudioOutputStream*>(NULL)));
|
| + EXPECT_CALL(manager(),
|
| + MakeAudioOutputStream(
|
| + AllOf(testing::Property(&AudioParameters::format,
|
| + AudioParameters::AUDIO_FAKE),
|
| + testing::Property(&AudioParameters::sample_rate,
|
| + params_.sample_rate()),
|
| + testing::Property(&AudioParameters::frames_per_buffer,
|
| + params_.frames_per_buffer())),
|
| + _)).WillOnce(Return(&fake_stream));
|
| + EXPECT_CALL(fake_stream, Open()).WillOnce(Return(true));
|
| + AudioOutputProxy* proxy = new AudioOutputProxy(resampler_.get());
|
| + EXPECT_TRUE(proxy->Open());
|
| + CloseAndWaitForCloseTimer(proxy, &fake_stream);
|
| +
|
| + // Once all proxies have been closed, AudioOutputResampler will start the
|
| + // reinitialization timer and execute it after the close delay elapses.
|
| + base::RunLoop run_loop;
|
| + message_loop_.PostDelayedTask(
|
| + FROM_HERE, run_loop.QuitClosure(),
|
| + base::TimeDelta::FromMilliseconds(2 * kTestCloseDelayMs));
|
| + run_loop.Run();
|
| +
|
| + // Verify a non-fake stream can be created.
|
| + MockAudioOutputStream real_stream(&manager_, params_);
|
| + EXPECT_CALL(manager(),
|
| + MakeAudioOutputStream(
|
| + testing::Property(&AudioParameters::format,
|
| + testing::Ne(AudioParameters::AUDIO_FAKE)),
|
| + _)).WillOnce(Return(&real_stream));
|
| +
|
| + // Stream1 should be able to successfully open and start.
|
| + EXPECT_CALL(real_stream, Open()).WillOnce(Return(true));
|
| + proxy = new AudioOutputProxy(resampler_.get());
|
| + EXPECT_TRUE(proxy->Open());
|
| + CloseAndWaitForCloseTimer(proxy, &real_stream);
|
| +}
|
| +
|
| } // namespace media
|
|
|