| 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..27c51446ef80830d4f1fe50144dbcf521d05a6e7 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);
|
| +
|
| + // |device_names|'size should be |expectation|'s size plus one because of
|
| + // default device.
|
| + EXPECT_EQ(device_names.size(), expectation.size() + 1);
|
| + ++it;
|
| + // 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
|
|
|