| Index: chromeos/audio/cras_audio_handler_unittest.cc
|
| diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc
|
| index 7472a7f16341c747967c360ef48862b287866090..8b58f0383a207779890947da19fba39713a8b520 100644
|
| --- a/chromeos/audio/cras_audio_handler_unittest.cc
|
| +++ b/chromeos/audio/cras_audio_handler_unittest.cc
|
| @@ -15,8 +15,12 @@
|
| #include "chromeos/dbus/audio_node.h"
|
| #include "chromeos/dbus/dbus_thread_manager.h"
|
| #include "chromeos/dbus/fake_cras_audio_client.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +using testing::NiceMock;
|
| +using testing::StrictMock;
|
| +
|
| namespace chromeos {
|
|
|
| const uint64 kInternalSpeakerId = 10001;
|
| @@ -24,11 +28,15 @@ const uint64 kHeadphoneId = 10002;
|
| const uint64 kInternalMicId = 10003;
|
| const uint64 kUSBMicId = 10004;
|
| const uint64 kBluetoothHeadsetId = 10005;
|
| -const uint64 kHDMIOutputId = 10006;
|
| -const uint64 kUSBHeadphoneId1 = 10007;
|
| -const uint64 kUSBHeadphoneId2 = 10008;
|
| -const uint64 kMicJackId = 10009;
|
| -const uint64 kKeyboardMicId = 10010;
|
| +const uint64 kBluetoothHeadsetMicId = 10006;
|
| +const uint64 kHDMIOutputId = 10007;
|
| +const uint64 kUSBHeadphoneId1 = 10008;
|
| +const uint64 kUSBHeadphoneId2 = 10009;
|
| +const uint64 kMicJackId = 10010;
|
| +const uint64 kKeyboardMicId = 10011;
|
| +const uint64 kPostMixLoopbackId = 10012;
|
| +const uint64 kPostDSPLoopbackId = 10013;
|
| +const uint64 kAOKRId = 10014;
|
| const uint64 kOtherTypeOutputId = 90001;
|
| const uint64 kOtherTypeInputId = 90002;
|
| const uint64 kUSBJabraSpeakerOutputId1 = 90003;
|
| @@ -117,6 +125,30 @@ const AudioNode kOtherTypeInput(
|
| 0
|
| );
|
|
|
| +const AudioNode kPostMixLoopback(false,
|
| + kPostMixLoopbackId,
|
| + "Fake Post Mix Loopback",
|
| + "POST_MIX_LOOPBACK",
|
| + "Post Mix Loopback",
|
| + false,
|
| + 0);
|
| +
|
| +const AudioNode kPostDSPLoopback(false,
|
| + kPostDSPLoopbackId,
|
| + "Fake Post DSP Loopback",
|
| + "POST_DSP_LOOPBACK",
|
| + "Post DSP Loopback",
|
| + false,
|
| + 0);
|
| +
|
| +const AudioNode kAOKR(true,
|
| + kAOKRId,
|
| + "Fake AOKR Mic",
|
| + "AOKR",
|
| + "AOKR Mic",
|
| + false,
|
| + 0);
|
| +
|
| const AudioNode kBluetoothHeadset(false,
|
| kBluetoothHeadsetId,
|
| "Bluetooth Headset",
|
| @@ -125,6 +157,14 @@ const AudioNode kBluetoothHeadset(false,
|
| false,
|
| 0);
|
|
|
| +const AudioNode kBluetoothHeadsetMic(true,
|
| + kBluetoothHeadsetMicId,
|
| + "Bluetooth Headset",
|
| + "BLUETOOTH",
|
| + "Bluetooth Headset 1",
|
| + false,
|
| + 0);
|
| +
|
| const AudioNode kHDMIOutput(false,
|
| kHDMIOutputId,
|
| "HDMI output",
|
| @@ -279,11 +319,21 @@ class TestObserver : public chromeos::CrasAudioHandler::AudioObserver {
|
| DISALLOW_COPY_AND_ASSIGN(TestObserver);
|
| };
|
|
|
| +// AudioManagerWrapper is mocked in unittest because unittest is run in an
|
| +// environment without AudioManagerCras.
|
| +class MockAudioManagerWrapper : public CrasAudioHandler::AudioManagerWrapper {
|
| + public:
|
| + MockAudioManagerWrapper() {}
|
| + ~MockAudioManagerWrapper() override {}
|
| + MOCK_METHOD1(SetHasInputDevices, void(bool has_input_devices));
|
| +};
|
| +
|
| class CrasAudioHandlerTest : public testing::Test {
|
| public:
|
| - CrasAudioHandlerTest() : cras_audio_handler_(NULL),
|
| - fake_cras_audio_client_(NULL) {
|
| - }
|
| + CrasAudioHandlerTest()
|
| + : cras_audio_handler_(NULL),
|
| + fake_cras_audio_client_(NULL),
|
| + use_nice_mock_audio_manager_(true) {}
|
| ~CrasAudioHandlerTest() override {}
|
|
|
| void SetUp() override {}
|
| @@ -296,13 +346,33 @@ class CrasAudioHandlerTest : public testing::Test {
|
| DBusThreadManager::Shutdown();
|
| }
|
|
|
| + // This is for the cases where the test does not care
|
| + // audio manager behavior.
|
| + void SetUpDefaultNiceMockAudioManagerIfNeeded() {
|
| + if (use_nice_mock_audio_manager_)
|
| + mock_audio_manager_ = new NiceMock<MockAudioManagerWrapper>();
|
| + }
|
| +
|
| + // Set the expected method and arguments on mock_audio_manager_ to
|
| + // check that SetHasInputDevices is called with correct argument when a
|
| + // list of audio nodes present in CrasAudioHandler.
|
| + void CheckSetHasInputDevices(AudioNodeList audio_nodes,
|
| + bool has_input_devices) {
|
| + use_nice_mock_audio_manager_ = false;
|
| + mock_audio_manager_ = new StrictMock<MockAudioManagerWrapper>();
|
| + EXPECT_CALL(*mock_audio_manager_, SetHasInputDevices(has_input_devices));
|
| + SetUpCrasAudioHandler(audio_nodes);
|
| + }
|
| +
|
| void SetUpCrasAudioHandler(const AudioNodeList& audio_nodes) {
|
| DBusThreadManager::Initialize();
|
| fake_cras_audio_client_ = static_cast<FakeCrasAudioClient*>(
|
| DBusThreadManager::Get()->GetCrasAudioClient());
|
| fake_cras_audio_client_->SetAudioNodesForTesting(audio_nodes);
|
| audio_pref_handler_ = new AudioDevicesPrefHandlerStub();
|
| - CrasAudioHandler::Initialize(audio_pref_handler_);
|
| + SetUpDefaultNiceMockAudioManagerIfNeeded();
|
| + CrasAudioHandler::Initialize(audio_pref_handler_,
|
| + make_scoped_ptr(mock_audio_manager_));
|
| cras_audio_handler_ = CrasAudioHandler::Get();
|
| test_observer_.reset(new TestObserver);
|
| cras_audio_handler_->AddAudioObserver(test_observer_.get());
|
| @@ -318,7 +388,9 @@ class CrasAudioHandlerTest : public testing::Test {
|
| fake_cras_audio_client_->SetAudioNodesForTesting(audio_nodes);
|
| fake_cras_audio_client_->SetActiveOutputNode(primary_active_node.id),
|
| audio_pref_handler_ = new AudioDevicesPrefHandlerStub();
|
| - CrasAudioHandler::Initialize(audio_pref_handler_);
|
| + SetUpDefaultNiceMockAudioManagerIfNeeded();
|
| + CrasAudioHandler::Initialize(audio_pref_handler_,
|
| + make_scoped_ptr(mock_audio_manager_));
|
| cras_audio_handler_ = CrasAudioHandler::Get();
|
| test_observer_.reset(new TestObserver);
|
| cras_audio_handler_->AddAudioObserver(test_observer_.get());
|
| @@ -364,6 +436,8 @@ class CrasAudioHandlerTest : public testing::Test {
|
| FakeCrasAudioClient* fake_cras_audio_client_; // Not owned.
|
| scoped_ptr<TestObserver> test_observer_;
|
| scoped_refptr<AudioDevicesPrefHandlerStub> audio_pref_handler_;
|
| + MockAudioManagerWrapper* mock_audio_manager_;
|
| + bool use_nice_mock_audio_manager_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(CrasAudioHandlerTest);
|
| @@ -2597,4 +2671,78 @@ TEST_F(CrasAudioHandlerTest, HDMIOutputRediscover) {
|
| EXPECT_FALSE(cras_audio_handler_->IsOutputMuted());
|
| }
|
|
|
| +// Test the case where there is no input device in the beginning.
|
| +// SetHasInputDevices on AudioManagerWrapper is called with argument false.
|
| +// After a mic jack is plugged, CrasAudioHandler calls SetHasInputDevices on
|
| +// AudioManagerWrapper with argument true.
|
| +TEST_F(CrasAudioHandlerTest, PlugMicJackAndUpdateAudioManager) {
|
| + use_nice_mock_audio_manager_ = false;
|
| + mock_audio_manager_ = new StrictMock<MockAudioManagerWrapper>();
|
| +
|
| + // Set up audio handler with output nodes and input nodes for loopback.
|
| + // SetHasInputAudioDevices should be called with argument false.
|
| + AudioNodeList audio_nodes;
|
| + audio_nodes.push_back(kInternalSpeaker);
|
| + audio_nodes.push_back(kPostMixLoopback);
|
| + audio_nodes.push_back(kPostDSPLoopback);
|
| + EXPECT_CALL(*mock_audio_manager_, SetHasInputDevices(false));
|
| + SetUpCrasAudioHandler(audio_nodes);
|
| +
|
| + // Plug the Mic Jack. SetHasInputAudioDevices should get called with argument
|
| + // true.
|
| + audio_nodes.push_back(kMicJack);
|
| + EXPECT_CALL(*mock_audio_manager_, SetHasInputDevices(true));
|
| + ChangeAudioNodes(audio_nodes);
|
| +}
|
| +
|
| +// Test the case where there is no input device for simple usage.
|
| +// SetHasInputDevices on AudioManagerWrapper is called with argument false.
|
| +TEST_F(CrasAudioHandlerTest, SetHasInputDeviceToFalse) {
|
| + AudioNodeList audio_nodes;
|
| + audio_nodes.push_back(kHeadphone);
|
| + audio_nodes.push_back(kUSBHeadphone1);
|
| + audio_nodes.push_back(kBluetoothHeadset);
|
| + audio_nodes.push_back(kHDMIOutput);
|
| + audio_nodes.push_back(kInternalSpeaker);
|
| + audio_nodes.push_back(kKeyboardMic);
|
| + audio_nodes.push_back(kAOKR);
|
| + audio_nodes.push_back(kPostMixLoopback);
|
| + audio_nodes.push_back(kPostDSPLoopback);
|
| + audio_nodes.push_back(kOtherTypeOutput);
|
| + audio_nodes.push_back(kOtherTypeInput);
|
| + CheckSetHasInputDevices(audio_nodes, false);
|
| +}
|
| +
|
| +// Test the case where there is an internal mic.
|
| +// SetHasInputDevices on AudioManagerWrapper is called with argument true.
|
| +TEST_F(CrasAudioHandlerTest, SetHasInputDeviceToTrueForInternalMic) {
|
| + AudioNodeList audio_nodes;
|
| + audio_nodes.push_back(kInternalMic);
|
| + CheckSetHasInputDevices(audio_nodes, true);
|
| +}
|
| +
|
| +// Test the case where there is an external mic.
|
| +// SetHasInputDevices on AudioManagerWrapper is called with argument true.
|
| +TEST_F(CrasAudioHandlerTest, SetHasInputDeviceToTrueForMicJack) {
|
| + AudioNodeList audio_nodes;
|
| + audio_nodes.push_back(kMicJack);
|
| + CheckSetHasInputDevices(audio_nodes, true);
|
| +}
|
| +
|
| +// Test the case where there is a USB mic.
|
| +// SetHasInputDevices on AudioManagerWrapper is called with argument true.
|
| +TEST_F(CrasAudioHandlerTest, SetHasInputDeviceToTrueForUSBMic) {
|
| + AudioNodeList audio_nodes;
|
| + audio_nodes.push_back(kUSBMic);
|
| + CheckSetHasInputDevices(audio_nodes, true);
|
| +}
|
| +
|
| +// Test the case where there is a bluetooth mic.
|
| +// SetHasInputDevices on AudioManagerWrapper is called with argument true.
|
| +TEST_F(CrasAudioHandlerTest, SetHasInputDeviceToTrueForBluetoothMic) {
|
| + AudioNodeList audio_nodes;
|
| + audio_nodes.push_back(kBluetoothHeadsetMic);
|
| + CheckSetHasInputDevices(audio_nodes, true);
|
| +}
|
| +
|
| } // namespace chromeos
|
|
|