/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "AudioDeviceInfo.h"
#include "MediaManager.h"
#include "gmock/gmock.h"
#include "gtest/gtest-printers.h"
#include "gtest/gtest.h"
#include "mozilla/Attributes.h"
#include "mozilla/UniquePtr.h"
#include "nsTArray.h"
#include "webrtc/MediaEngineFake.h"
using ::testing::
Return;
using namespace mozilla;
void PrintTo(
const nsString& aValue, ::std::ostream* aStream) {
NS_ConvertUTF16toUTF8 str(aValue);
(*aStream) << str.get();
}
void PrintTo(
const nsCString& aValue, ::std::ostream* aStream) {
(*aStream) << aValue.get();
}
RefPtr<AudioDeviceInfo> MakeAudioDeviceInfo(
const nsAString& aName,
const nsAString& aGroupId,
uint16_t aType) {
return MakeRefPtr<AudioDeviceInfo>(
nullptr, aName, aGroupId, u
"Vendor"_ns, aType,
AudioDeviceInfo::STATE_ENABLED, AudioDeviceInfo::PREF_NONE,
AudioDeviceInfo::FMT_F32LE, AudioDeviceInfo::FMT_F32LE, 2u, 44100u,
44100u, 44100u, 0, 0);
}
RefPtr<MediaDevice> MakeCameraDevice(
const nsString& aName,
const nsString& aGroupId) {
return new MediaDevice(
new MediaEngineFake(), dom::MediaSourceEnum::Camera,
aName, u
""_ns, aGroupId, MediaDevice::IsScary::No,
MediaDevice::OsPromptable::No);
}
RefPtr<MediaDevice> MakeMicDevice(
const nsString& aName,
const nsString& aGroupId) {
return new MediaDevice(
new MediaEngineFake(),
MakeAudioDeviceInfo(aName, aGroupId, AudioDeviceInfo::TYPE_INPUT),
u
""_ns);
}
RefPtr<MediaDevice> MakeSpeakerDevice(
const nsString& aName,
const nsString& aGroupId) {
return new MediaDevice(
new MediaEngineFake(),
MakeAudioDeviceInfo(aName, aGroupId, AudioDeviceInfo::TYPE_OUTPUT),
u
"ID"_ns);
}
/* Verify that when an audio input device name contains the video input device
* name the video device group id is updated to become equal to the audio
* device group id. */
TEST(TestGroupId, MatchInput_PartOfName)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, u
"Cam-Model-GroupId"_ns));
auto mic =
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns);
devices.AppendElement(mic);
audios.AppendElement(mic);
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, devices[1]->mRawGroupID)
<<
"Video group id is the same as audio input group id.";
}
/* Verify that when an audio input device name is the same as the video input
* device name the video device group id is updated to become equal to the audio
* device group id. */
TEST(TestGroupId, MatchInput_FullName)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, u
"Cam-Model-GroupId"_ns));
auto mic = MakeMicDevice(u
"Vendor Model"_ns, u
"Mic-Model-GroupId"_ns);
devices.AppendElement(mic);
audios.AppendElement(mic);
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, devices[1]->mRawGroupID)
<<
"Video group id is the same as audio input group id.";
}
/* Verify that when an audio input device name does not contain the video input
* device name the video device group id does not change. */
TEST(TestGroupId, NoMatchInput)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
nsString Cam_Model_GroupId = u
"Cam-Model-GroupId"_ns;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, Cam_Model_GroupId));
audios.AppendElement(
MakeMicDevice(u
"Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, Cam_Model_GroupId)
<<
"Video group id has not been updated.";
EXPECT_NE(devices[0]->mRawGroupID, audios[0]->mRawGroupID)
<<
"Video group id is different than audio input group id.";
}
/* Verify that when more that one audio input and more than one audio output
* device name contain the video input device name the video device group id
* does not change. */
TEST(TestGroupId, NoMatch_TwoIdenticalDevices)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
nsString Cam_Model_GroupId = u
"Cam-Model-GroupId"_ns;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, Cam_Model_GroupId));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, Cam_Model_GroupId)
<<
"Video group id has not been updated.";
EXPECT_NE(devices[0]->mRawGroupID, audios[0]->mRawGroupID)
<<
"Video group id is different from audio input group id.";
EXPECT_NE(devices[0]->mRawGroupID, audios[2]->mRawGroupID)
<<
"Video group id is different from audio output group id.";
}
/* Verify that when more that one audio input device name contain the video
* input device name the video device group id is not updated by audio input
* device group id but it continues looking at audio output devices where it
* finds a match so video input group id is updated by audio output group id. */
TEST(TestGroupId, Match_TwoIdenticalInputsMatchOutput)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
nsString Cam_Model_GroupId = u
"Cam-Model-GroupId"_ns;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, Cam_Model_GroupId));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, audios[2]->mRawGroupID)
<<
"Video group id is the same as audio output group id.";
}
/* Verify that when more that one audio input and more than one audio output
* device names contain the video input device name the video device group id
* does not change. */
TEST(TestGroupId, NoMatch_ThreeIdenticalDevices)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
nsString Cam_Model_GroupId = u
"Cam-Model-GroupId"_ns;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, Cam_Model_GroupId));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, Cam_Model_GroupId)
<<
"Video group id has not been updated.";
EXPECT_NE(devices[0]->mRawGroupID, audios[0]->mRawGroupID)
<<
"Video group id is different from audio input group id.";
EXPECT_NE(devices[0]->mRawGroupID, audios[3]->mRawGroupID)
<<
"Video group id is different from audio output group id.";
}
/* Verify that when an audio output device name contains the video input device
* name the video device group id is updated to become equal to the audio
* device group id. */
TEST(TestGroupId, MatchOutput)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, u
"Cam-Model-GroupId"_ns));
audios.AppendElement(
MakeMicDevice(u
"Mic Analog Stereo"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model Analog Stereo"_ns,
u
"Speaker-Model-GroupId"_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, audios[1]->mRawGroupID)
<<
"Video group id is the same as audio output group id.";
}
/* Verify that when an audio input device name is the same as audio output
* device and video input device name the video device group id is updated to
* become equal to the audio input device group id. */
TEST(TestGroupId, InputOutputSameName)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, u
"Cam-Model-GroupId"_ns));
audios.AppendElement(
MakeMicDevice(u
"Vendor Model"_ns, u
"Mic-Model-GroupId"_ns));
audios.AppendElement(
MakeSpeakerDevice(u
"Vendor Model"_ns, u
"Speaker-Model-GroupId"_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, audios[0]->mRawGroupID)
<<
"Video input group id is the same as audio input group id.";
}
/* Verify that when an audio input device name contains the video input device
* and the audio input group id is an empty string, the video device group id
* is updated to become equal to the audio device group id. */
TEST(TestGroupId, InputEmptyGroupId)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, u
"Cam-Model-GroupId"_ns));
audios.AppendElement(MakeMicDevice(u
"Vendor Model"_ns, u
""_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, audios[0]->mRawGroupID)
<<
"Video input group id is the same as audio input group id.";
}
/* Verify that when an audio output device name contains the video input device
* and the audio output group id is an empty string, the video device group id
* is updated to become equal to the audio output device group id. */
TEST(TestGroupId, OutputEmptyGroupId)
{
MediaManager::MediaDeviceSet devices;
MediaManager::MediaDeviceSet audios;
devices.AppendElement(
MakeCameraDevice(u
"Vendor Model"_ns, u
"Cam-Model-GroupId"_ns));
audios.AppendElement(MakeSpeakerDevice(u
"Vendor Model"_ns, u
""_ns));
MediaManager::GuessVideoDeviceGroupIDs(devices, audios);
EXPECT_EQ(devices[0]->mRawGroupID, audios[0]->mRawGroupID)
<<
"Video input group id is the same as audio output group id.";
}