#include "media/audio/mac/audio_manager_mac.h"
#include "base/run_loop.h"
#include "base/test/test_message_loop.h"
#include "media/audio/audio_unittest_util.h"
#include "media/audio/fake_audio_log_factory.h"
#include "media/audio/fake_audio_manager.h"
#include "media/audio/test_audio_thread.h"
#include "testing/gmock/include/gmock/gmock.h"
using testing::Return;
namespace media {
class AudioManagerMacUnderTest final : public AudioManagerMac {
public:
AudioManagerMacUnderTest(std::unique_ptr<AudioThread> audio_thread,
AudioLogFactory* audio_log_factory)
: AudioManagerMac(std::move(audio_thread), audio_log_factory) {}
MOCK_METHOD0(GetAllAudioDeviceIDs, std::vector<AudioObjectID>());
MOCK_METHOD1(GetDeviceTransportType, std::optional<uint32_t>(AudioObjectID));
MOCK_METHOD1(GetDeviceUniqueID, std::optional<std::string>(AudioObjectID));
MOCK_METHOD1(GetRelatedNonBluetoothDeviceIDs,
std::vector<AudioObjectID>(AudioObjectID));
};
class AudioManagerMacTest : public ::testing::Test {
protected:
AudioManagerMacTest() : message_loop_(base::MessagePumpType::IO) {
audio_manager_ = std::make_unique<AudioManagerMacUnderTest>(
std::make_unique<TestAudioThread>(), &fake_audio_log_factory_);
base::RunLoop().RunUntilIdle();
}
~AudioManagerMacTest() override { audio_manager_->Shutdown(); }
base::TestMessageLoop message_loop_;
FakeAudioLogFactory fake_audio_log_factory_;
std::unique_ptr<AudioManagerMacUnderTest> audio_manager_;
};
TEST_F(AudioManagerMacTest, SameGroupIdForBluetoothInputAndOutputDevice) {
AudioManagerMacUnderTest& audio_manager_mock = *audio_manager_.get();
EXPECT_CALL(audio_manager_mock, GetAllAudioDeviceIDs())
.WillRepeatedly(Return(std::vector<AudioObjectID>{1, 2}));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(1))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBluetooth));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(1))
.WillRepeatedly(Return("F3-A2-14-A9-1D-F8:input"));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(2))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBluetooth));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(2))
.WillRepeatedly(Return("F3-A2-14-A9-1D-F8:output"));
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(1),
std::vector<AudioObjectID>({1, 2}));
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(2),
std::vector<AudioObjectID>({1, 2}));
}
TEST_F(AudioManagerMacTest, SameGroupIdForNonBluetoothInputAndOutputDevice) {
AudioManagerMacUnderTest& audio_manager_mock = *audio_manager_.get();
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(1))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBuiltIn));
EXPECT_CALL(audio_manager_mock,
GetRelatedNonBluetoothDeviceIDs(1))
.WillRepeatedly(Return(std::vector<AudioObjectID>{1, 2}));
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(1),
std::vector<AudioObjectID>({1, 2}));
}
TEST_F(AudioManagerMacTest,
DifferentGroupIdForDifferentBluetoothInputAndOutputDevice) {
AudioManagerMacUnderTest& audio_manager_mock = *audio_manager_.get();
EXPECT_CALL(audio_manager_mock, GetAllAudioDeviceIDs())
.WillRepeatedly(Return(std::vector<AudioObjectID>{1, 2}));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(1))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBluetooth));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(1))
.WillRepeatedly(Return("A3-C2-E3-19-D3-81:input"));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(2))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBluetooth));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(2))
.WillRepeatedly(Return("F3-A2-14-A9-1D-F8:output"));
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(1),
std::vector<AudioObjectID>{1});
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(2),
std::vector<AudioObjectID>{2});
}
TEST_F(AudioManagerMacTest, DifferentGroupIdForDifferentInputAndOutputDevices) {
AudioManagerMacUnderTest& audio_manager_mock = *audio_manager_.get();
EXPECT_CALL(audio_manager_mock, GetAllAudioDeviceIDs())
.WillRepeatedly(Return(std::vector<AudioObjectID>{1, 2, 3}));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(1))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBluetooth));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(1))
.WillRepeatedly(Return("A3-C2-E3-19-D3-81:input"));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(2))
.WillRepeatedly(Return(kAudioDeviceTransportTypeBuiltIn));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(2))
.WillRepeatedly(Return("default_input_device"));
EXPECT_CALL(audio_manager_mock,
GetRelatedNonBluetoothDeviceIDs(2))
.WillRepeatedly(Return(std::vector<AudioObjectID>{2}));
EXPECT_CALL(audio_manager_mock, GetDeviceTransportType(3))
.WillRepeatedly(Return(std::nullopt));
EXPECT_CALL(audio_manager_mock, GetDeviceUniqueID(3))
.WillRepeatedly(Return("inbuilt_output_device"));
EXPECT_CALL(audio_manager_mock,
GetRelatedNonBluetoothDeviceIDs(3))
.WillRepeatedly(Return(std::vector<AudioObjectID>{3}));
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(1),
std::vector<AudioObjectID>{1});
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(2),
std::vector<AudioObjectID>{2});
EXPECT_EQ(audio_manager_->GetRelatedDeviceIDs(3),
std::vector<AudioObjectID>{3});
}
}