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 0f9e37a22348031449f64bf5596207536bfe2e0b..1298d104b9e0f34445af8a3102249a73046c8089 100644 |
| --- a/media/audio/audio_manager_unittest.cc |
| +++ b/media/audio/audio_manager_unittest.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/environment.h" |
| #include "base/logging.h" |
| #include "base/run_loop.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/test/test_message_loop.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| @@ -36,6 +37,14 @@ |
| #include "media/audio/pulse/audio_manager_pulse.h" |
| #endif // defined(USE_PULSEAUDIO) |
| +#if defined(USE_CRAS) |
| +#include "chromeos/audio/audio_devices_pref_handler_stub.h" |
| +#include "chromeos/audio/cras_audio_handler.h" |
| +#include "chromeos/dbus/dbus_thread_manager.h" |
| +#include "chromeos/dbus/fake_cras_audio_client.h" |
| +#include "media/audio/cras/audio_manager_cras.h" |
| +#endif // defined(USE_CRAS) |
| + |
| namespace media { |
| namespace { |
| @@ -69,6 +78,79 @@ struct TestAudioManagerFactory<std::nullptr_t> { |
| return AudioManager::CreateForTesting(base::ThreadTaskRunnerHandle::Get()); |
| } |
| }; |
| + |
| +#if defined(USE_CRAS) |
| +using chromeos::AudioNode; |
| +using chromeos::AudioNodeList; |
| + |
| +const uint64_t kJabraSpeaker1Id = 30001; |
| +const uint64_t kJabraSpeaker1StableDeviceId = 80001; |
| +const uint64_t kJabraSpeaker2Id = 30002; |
| +const uint64_t kJabraSpeaker2StableDeviceId = 80002; |
| +const uint64_t kHDMIOutputId = 30003; |
| +const uint64_t kHDMIOutputStabeDevicelId = 80003; |
| +const uint64_t kJabraMic1Id = 40001; |
| +const uint64_t kJabraMic1StableDeviceId = 90001; |
| +const uint64_t kJabraMic2Id = 40002; |
| +const uint64_t kJabraMic2StableDeviceId = 90002; |
| +const uint64_t kWebcamMicId = 40003; |
| +const uint64_t kWebcamMicStableDeviceId = 90003; |
| + |
| +const AudioNode kJabraSpeaker1(false, |
| + kJabraSpeaker1Id, |
| + kJabraSpeaker1StableDeviceId, |
| + "Jabra Speaker", |
| + "USB", |
| + "Jabra Speaker 1", |
| + false, |
| + 0); |
| + |
| +const AudioNode kJabraSpeaker2(false, |
| + kJabraSpeaker2Id, |
| + kJabraSpeaker2StableDeviceId, |
| + "Jabra Speaker", |
| + "USB", |
| + "Jabra Speaker 2", |
| + false, |
| + 0); |
| + |
| +const AudioNode kHDMIOutput(false, |
| + kHDMIOutputId, |
| + kHDMIOutputStabeDevicelId, |
| + "HDMI output", |
| + "HDMI", |
| + "HDA Intel MID", |
| + false, |
| + 0); |
| + |
| +const AudioNode kJabraMic1(true, |
| + kJabraMic1Id, |
| + kJabraMic1StableDeviceId, |
| + "Jabra Mic", |
| + "USB", |
| + "Jabra Mic 1", |
| + false, |
| + 0); |
| + |
| +const AudioNode kJabraMic2(true, |
| + kJabraMic2Id, |
| + kJabraMic2StableDeviceId, |
| + "Jabra Mic", |
| + "USB", |
| + "Jabra Mic 2", |
| + false, |
| + 0); |
| + |
| +const AudioNode kUSBCameraMic(true, |
| + kWebcamMicId, |
| + kWebcamMicStableDeviceId, |
| + "Webcam Mic", |
| + "USB", |
| + "Logitech Webcam", |
| + false, |
| + 0); |
| +#endif // defined(USE_CRAS) |
| + |
| } // namespace |
| // Test fixture which allows us to override the default enumeration API on |
| @@ -115,6 +197,25 @@ class AudioManagerTest : public ::testing::Test { |
| audio_manager_->GetAssociatedOutputDeviceID(input_device_id); |
| } |
| +#if defined(USE_CRAS) |
| + void TearDown() override { |
| + chromeos::CrasAudioHandler::Shutdown(); |
| + audio_pref_handler_ = nullptr; |
| + chromeos::DBusThreadManager::Shutdown(); |
| + } |
| + |
| + void SetUpCrasAudioHandlerWithTestingNodes(const AudioNodeList& audio_nodes) { |
| + chromeos::DBusThreadManager::Initialize(); |
| + audio_client_ = static_cast<chromeos::FakeCrasAudioClient*>( |
| + chromeos::DBusThreadManager::Get()->GetCrasAudioClient()); |
| + audio_client_->SetAudioNodesForTesting(audio_nodes); |
| + audio_pref_handler_ = new chromeos::AudioDevicesPrefHandlerStub(); |
| + chromeos::CrasAudioHandler::Initialize(audio_pref_handler_); |
| + cras_audio_handler_ = chromeos::CrasAudioHandler::Get(); |
| + base::RunLoop().RunUntilIdle(); |
| + } |
| +#endif // defined(USE_CRAS) |
| + |
| protected: |
| AudioManagerTest() { CreateAudioManagerForTesting(); } |
| ~AudioManagerTest() override {} |
| @@ -185,6 +286,48 @@ class AudioManagerTest : public ::testing::Test { |
| } |
| } |
| +#if defined(USE_CRAS) |
| + // Helper method for (USE_CRAS) which verifies that the device list starts |
| + // with a valid default record followed by physical device names. |
| + static void CheckDeviceNamesCras( |
| + const AudioDeviceNames& device_names, |
| + const std::map<uint64_t, std::string>& expectation) { |
| + DVLOG(2) << "Got " << device_names.size() << " audio devices."; |
| + if (!device_names.empty()) { |
| + AudioDeviceNames::const_iterator it = device_names.begin(); |
| + |
| + // The first device in the list should always be the default device. |
| + EXPECT_EQ(AudioDeviceDescription::GetDefaultDeviceName(), |
| + it->device_name); |
| + EXPECT_EQ(std::string(AudioDeviceDescription::kDefaultDeviceId), |
| + it->unique_id); |
| + ++it; |
|
tommi (sloooow) - chröme
2016/06/18 14:00:37
nit: move this to just above the loop. As is, it l
Qiang(Joe) Xu
2016/07/06 16:27:02
Done.
|
| + |
| + // |device_names|'size should be |expectation|'s size plus one because of |
| + // default device. |
| + EXPECT_EQ(device_names.size(), expectation.size() + 1); |
| + // Check other devices that should have non-empty name and id, and should |
| + // be contained in expectation. |
| + while (it != device_names.end()) { |
| + EXPECT_FALSE(it->device_name.empty()); |
| + EXPECT_FALSE(it->unique_id.empty()); |
| + DVLOG(2) << "Device ID(" << it->unique_id |
| + << "), label: " << it->device_name; |
| + uint64_t key; |
| + EXPECT_TRUE(base::StringToUint64(it->unique_id, &key)); |
| + EXPECT_TRUE(expectation.find(key) != expectation.end()); |
| + EXPECT_EQ(expectation.find(key)->second, it->device_name); |
| + ++it; |
| + } |
| + } else { |
| + // Log a warning so we can see the status on the build bots. No need to |
| + // break the test though since this does successfully test the code and |
| + // some failure cases. |
| + LOG(WARNING) << "No input devices detected"; |
| + } |
| + } |
| +#endif // defined(USE_CRAS) |
| + |
| bool InputDevicesAvailable() { |
| return audio_manager_->HasAudioInputDevices(); |
| } |
| @@ -212,8 +355,67 @@ class AudioManagerTest : public ::testing::Test { |
| base::TestMessageLoop message_loop_; |
| FakeAudioLogFactory fake_audio_log_factory_; |
| ScopedAudioManagerPtr audio_manager_; |
| + |
| +#if defined(USE_CRAS) |
| + chromeos::CrasAudioHandler* cras_audio_handler_ = nullptr; // Not owned. |
| + chromeos::FakeCrasAudioClient* audio_client_ = nullptr; // Not owned. |
| + scoped_refptr<chromeos::AudioDevicesPrefHandlerStub> audio_pref_handler_; |
| +#endif // defined(USE_CRAS) |
| }; |
| +#if defined(USE_CRAS) |
| +TEST_F(AudioManagerTest, EnumerateInputDevicesCras) { |
| + // Setup the devices without internal mic, so that it doesn't exist |
| + // beamforming capable mic. |
| + AudioNodeList audio_nodes; |
| + audio_nodes.push_back(kJabraMic1); |
| + audio_nodes.push_back(kJabraMic2); |
| + audio_nodes.push_back(kUSBCameraMic); |
| + audio_nodes.push_back(kHDMIOutput); |
| + audio_nodes.push_back(kJabraSpeaker1); |
| + SetUpCrasAudioHandlerWithTestingNodes(audio_nodes); |
| + |
| + ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
| + |
| + // Setup expectation with physical devices. |
| + std::map<uint64_t, std::string> expectation; |
| + expectation[kJabraMic1.id] = kJabraMic1.device_name; |
| + expectation[kJabraMic2.id] = kJabraMic2.device_name; |
| + expectation[kUSBCameraMic.id] = kUSBCameraMic.device_name; |
| + |
| + DVLOG(2) << "Testing AudioManagerCras."; |
| + CreateAudioManagerForTesting<AudioManagerCras>(); |
| + AudioDeviceNames device_names; |
| + audio_manager_->GetAudioInputDeviceNames(&device_names); |
| + CheckDeviceNamesCras(device_names, expectation); |
| +} |
| + |
| +TEST_F(AudioManagerTest, EnumerateOutputDevicesCras) { |
| + // Setup the devices without internal mic, so that it doesn't exist |
| + // beamforming capable mic. |
| + AudioNodeList audio_nodes; |
| + audio_nodes.push_back(kJabraMic1); |
| + audio_nodes.push_back(kJabraMic2); |
| + audio_nodes.push_back(kUSBCameraMic); |
| + audio_nodes.push_back(kHDMIOutput); |
| + audio_nodes.push_back(kJabraSpeaker1); |
| + SetUpCrasAudioHandlerWithTestingNodes(audio_nodes); |
| + |
| + ABORT_AUDIO_TEST_IF_NOT(OutputDevicesAvailable()); |
| + |
| + // Setup expectation with physical devices. |
| + std::map<uint64_t, std::string> expectation; |
| + expectation[kHDMIOutput.id] = kHDMIOutput.device_name; |
| + expectation[kJabraSpeaker1.id] = kJabraSpeaker1.device_name; |
| + |
| + DVLOG(2) << "Testing AudioManagerCras."; |
| + CreateAudioManagerForTesting<AudioManagerCras>(); |
| + AudioDeviceNames device_names; |
| + audio_manager_->GetAudioOutputDeviceNames(&device_names); |
| + CheckDeviceNamesCras(device_names, expectation); |
| +} |
| +#else // !defined(USE_CRAS) |
| + |
| TEST_F(AudioManagerTest, HandleDefaultDeviceIDs) { |
| // Use a fake manager so we can makeup device ids, this will still use the |
| // AudioManagerBase code. |
| @@ -431,5 +633,6 @@ TEST_F(AudioManagerTest, GetAssociatedOutputDeviceID) { |
| EXPECT_TRUE(found_an_associated_device); |
| #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| } |
| +#endif // defined(USE_CRAS) |
| } // namespace media |