Chromium Code Reviews| Index: media/audio/audio_manager_unittest.cc |
| diff --git a/media/audio/audio_manager_unittest.cc b/media/audio/audio_manager_unittest.cc |
| index 894f8617c5bfa963bef00bf0dfd24622ade2c357..afccc9ed5bc538c490a976e06eea4748efd4ace6 100644 |
| --- a/media/audio/audio_manager_unittest.cc |
| +++ b/media/audio/audio_manager_unittest.cc |
| @@ -6,7 +6,10 @@ |
| #include "base/environment.h" |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "base/run_loop.h" |
| #include "base/synchronization/waitable_event.h" |
| +#include "base/test/test_message_loop.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "build/build_config.h" |
| #include "media/audio/audio_manager.h" |
| #include "media/audio/audio_manager_base.h" |
| @@ -32,6 +35,41 @@ |
| namespace media { |
| +namespace { |
| +template <typename T> |
| +struct TestAudioManagerFactory { |
| + static ScopedAudioManagerPtr Create(AudioLogFactory* audio_log_factory) { |
| + return ScopedAudioManagerPtr(new T(base::ThreadTaskRunnerHandle::Get(), |
| + base::ThreadTaskRunnerHandle::Get(), |
| + audio_log_factory)); |
| + }; |
|
tommi (sloooow) - chröme
2016/04/13 07:31:51
remove semicolon (here and below)
alokp
2016/04/17 16:55:19
Done.
|
| +}; |
| + |
| +#if defined(USE_PULSEAUDIO) |
| +template <> |
| +struct TestAudioManagerFactory<AudioManagerPulse> { |
| + static ScopedAudioManagerPtr Create(AudioLogFactory* audio_log_factory) { |
| + std::unique_ptr<AudioManagerPulse, AudioManagerDeleter> manager( |
| + new AudioManagerPulse(base::ThreadTaskRunnerHandle::Get(), |
| + base::ThreadTaskRunnerHandle::Get(), |
| + audio_log_factory)); |
| + if (!manager->Init()) |
| + manager.reset(); |
| + return std::move(manager); |
| + }; |
| +}; |
| +#endif // defined(USE_PULSEAUDIO) |
| + |
| +template <> |
| +struct TestAudioManagerFactory<std::nullptr_t> { |
| + static ScopedAudioManagerPtr Create(AudioLogFactory* audio_log_factory) { |
| + return AudioManager::Create(base::ThreadTaskRunnerHandle::Get(), |
| + base::ThreadTaskRunnerHandle::Get(), nullptr, |
| + audio_log_factory); |
| + }; |
| +}; |
| +} // namespace |
| + |
| // Test fixture which allows us to override the default enumeration API on |
| // Windows. |
| class AudioManagerTest : public ::testing::Test { |
| @@ -77,14 +115,8 @@ class AudioManagerTest : public ::testing::Test { |
| } |
| protected: |
| - AudioManagerTest() : audio_manager_(AudioManager::CreateForTesting()) { |
| - // Wait for audio thread initialization to complete. Otherwise the |
| - // enumeration type may not have been set yet. |
| - base::WaitableEvent event(false, false); |
| - audio_manager_->GetTaskRunner()->PostTask(FROM_HERE, base::Bind( |
| - &base::WaitableEvent::Signal, base::Unretained(&event))); |
| - event.Wait(); |
| - } |
| + AudioManagerTest() { CreateAudioManagerForTesting(); } |
| + ~AudioManagerTest() override {} |
| #if defined(OS_WIN) |
| bool SetMMDeviceEnumeration() { |
| @@ -149,71 +181,41 @@ class AudioManagerTest : public ::testing::Test { |
| } |
| } |
| - void HasInputDevicesAvailable(bool* has_devices) { |
| - *has_devices = audio_manager_->HasAudioInputDevices(); |
| - } |
| - |
| - void HasOutputDevicesAvailable(bool* has_devices) { |
| - *has_devices = audio_manager_->HasAudioOutputDevices(); |
| - } |
| - |
| bool InputDevicesAvailable() { |
| - bool has_devices = false; |
| - RunOnAudioThread(base::Bind(&AudioManagerTest::HasInputDevicesAvailable, |
| - base::Unretained(this), &has_devices)); |
| - return has_devices; |
| + return audio_manager_->HasAudioInputDevices(); |
| } |
| - |
| bool OutputDevicesAvailable() { |
| - bool has_devices = false; |
| - RunOnAudioThread(base::Bind(&AudioManagerTest::HasOutputDevicesAvailable, |
| - base::Unretained(this), &has_devices)); |
| - return has_devices; |
| + return audio_manager_->HasAudioOutputDevices(); |
| } |
| -#if defined(USE_ALSA) || defined(USE_PULSEAUDIO) |
| - template <class T> |
| + template <typename T = std::nullptr_t> |
| void CreateAudioManagerForTesting() { |
| // Only one AudioManager may exist at a time, so destroy the one we're |
| // currently holding before creating a new one. |
| + // Flush the message loop to run any shutdown tasks posted by AudioManager. |
| audio_manager_.reset(); |
| - audio_manager_.reset(T::Create(&fake_audio_log_factory_)); |
| - } |
| -#endif |
| - |
| - // Synchronously runs the provided callback/closure on the audio thread. |
| - void RunOnAudioThread(const base::Closure& closure) { |
| - if (!audio_manager_->GetTaskRunner()->BelongsToCurrentThread()) { |
| - base::WaitableEvent event(false, false); |
| - audio_manager_->GetTaskRunner()->PostTask( |
| - FROM_HERE, |
| - base::Bind(&AudioManagerTest::RunOnAudioThreadImpl, |
| - base::Unretained(this), |
| - closure, |
| - &event)); |
| - event.Wait(); |
| - } else { |
| - closure.Run(); |
| - } |
| - } |
| - |
| - void RunOnAudioThreadImpl(const base::Closure& closure, |
| - base::WaitableEvent* event) { |
| - DCHECK(audio_manager_->GetTaskRunner()->BelongsToCurrentThread()); |
| - closure.Run(); |
| - event->Signal(); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + audio_manager_ = |
| + TestAudioManagerFactory<T>::Create(&fake_audio_log_factory_); |
| + // A few AudioManager implementations post initialization tasks to |
| + // audio thread. Flush the thread to ensure that |audio_manager_| is |
| + // initialized and ready to use before returning from this function. |
| + // TODO(alokp): We should perhaps do this in AudioManager::Create(). |
| + base::RunLoop().RunUntilIdle(); |
| } |
| + base::TestMessageLoop message_loop_; |
| FakeAudioLogFactory fake_audio_log_factory_; |
| - scoped_ptr<AudioManager> audio_manager_; |
| + ScopedAudioManagerPtr audio_manager_; |
| }; |
| TEST_F(AudioManagerTest, HandleDefaultDeviceIDs) { |
| // Use a fake manager so we can makeup device ids, this will still use the |
| // AudioManagerBase code. |
| - audio_manager_.reset(new FakeAudioManager(&fake_audio_log_factory_)); |
| - RunOnAudioThread(base::Bind(&AudioManagerTest::HandleDefaultDeviceIDsTest, |
| - base::Unretained(this))); |
| + CreateAudioManagerForTesting<FakeAudioManager>(); |
| + HandleDefaultDeviceIDsTest(); |
| + base::RunLoop().RunUntilIdle(); |
| } |
| // Test that devices can be enumerated. |
| @@ -221,10 +223,7 @@ TEST_F(AudioManagerTest, EnumerateInputDevices) { |
| ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
| AudioDeviceNames device_names; |
| - RunOnAudioThread( |
| - base::Bind(&AudioManager::GetAudioInputDeviceNames, |
| - base::Unretained(audio_manager_.get()), |
| - &device_names)); |
| + audio_manager_->GetAudioInputDeviceNames(&device_names); |
| CheckDeviceNames(device_names); |
| } |
| @@ -233,10 +232,7 @@ TEST_F(AudioManagerTest, EnumerateOutputDevices) { |
| ABORT_AUDIO_TEST_IF_NOT(OutputDevicesAvailable()); |
| AudioDeviceNames device_names; |
| - RunOnAudioThread( |
| - base::Bind(&AudioManager::GetAudioOutputDeviceNames, |
| - base::Unretained(audio_manager_.get()), |
| - &device_names)); |
| + audio_manager_->GetAudioOutputDeviceNames(&device_names); |
| CheckDeviceNames(device_names); |
| } |
| @@ -403,9 +399,7 @@ TEST_F(AudioManagerTest, GetDefaultOutputStreamParameters) { |
| ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
| AudioParameters params; |
| - RunOnAudioThread( |
| - base::Bind(&AudioManagerTest::GetDefaultOutputStreamParameters, |
| - base::Unretained(this), ¶ms)); |
| + GetDefaultOutputStreamParameters(¶ms); |
| EXPECT_TRUE(params.IsValid()); |
| #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| } |
| @@ -415,9 +409,7 @@ TEST_F(AudioManagerTest, GetAssociatedOutputDeviceID) { |
| ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable() && OutputDevicesAvailable()); |
| AudioDeviceNames device_names; |
| - RunOnAudioThread(base::Bind(&AudioManager::GetAudioInputDeviceNames, |
| - base::Unretained(audio_manager_.get()), |
| - &device_names)); |
| + audio_manager_->GetAudioInputDeviceNames(&device_names); |
| bool found_an_associated_device = false; |
| for (AudioDeviceNames::iterator it = device_names.begin(); |
| it != device_names.end(); |
| @@ -425,9 +417,7 @@ TEST_F(AudioManagerTest, GetAssociatedOutputDeviceID) { |
| EXPECT_FALSE(it->unique_id.empty()); |
| EXPECT_FALSE(it->device_name.empty()); |
| std::string output_device_id; |
| - RunOnAudioThread(base::Bind(&AudioManagerTest::GetAssociatedOutputDeviceID, |
| - base::Unretained(this), it->unique_id, |
| - &output_device_id)); |
| + GetAssociatedOutputDeviceID(it->unique_id, &output_device_id); |
| if (!output_device_id.empty()) { |
| DVLOG(2) << it->unique_id << " matches with " << output_device_id; |
| found_an_associated_device = true; |