blob: 181d636dc598264f0cd4a2a026ea02eac4bb5ee4 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <gtest/gtest.h>
#define LOG_TAG "TypeConverter_Test"
#include <log/log.h>
#include <android_audio_policy_configuration_V7_0.h>
#include <media/TypeConverter.h>
#include <system/audio.h>
#include <xsdc/XsdcSupport.h>
using namespace android;
namespace xsd {
using namespace android::audio::policy::configuration::V7_0;
}
TEST(TypeConverter, ParseChannelMasks) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioChannelMask>{}) {
const std::string stringVal = toString(enumVal);
audio_channel_mask_t channelMask = channelMaskFromString(stringVal);
EXPECT_EQ(enumVal != xsd::AudioChannelMask::AUDIO_CHANNEL_NONE,
audio_channel_mask_is_valid(channelMask))
<< "Validity of \"" << stringVal << "\" is not as expected";
}
}
TEST(TypeConverter, ParseInputOutputIndexChannelMask) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioChannelMask>{}) {
const std::string stringVal = toString(enumVal);
audio_channel_mask_t channelMask, channelMaskBack;
std::string stringValBack;
if (stringVal.find("_CHANNEL_IN_") != std::string::npos) {
EXPECT_TRUE(InputChannelConverter::fromString(stringVal, channelMask))
<< "Conversion of \"" << stringVal << "\" failed (as input channel mask)";
EXPECT_TRUE(InputChannelConverter::toString(channelMask, stringValBack))
<< "Conversion of input channel mask " << channelMask << " failed";
// Due to aliased values, the result of 'toString' might not be the same
// as 'stringVal', thus we need to compare the results of parsing instead.
EXPECT_TRUE(InputChannelConverter::fromString(stringValBack, channelMaskBack))
<< "Conversion of \"" << stringValBack << "\" failed (as input channel mask)";
EXPECT_EQ(channelMask, channelMaskBack);
} else if (stringVal.find("_CHANNEL_OUT_") != std::string::npos) {
EXPECT_TRUE(OutputChannelConverter::fromString(stringVal, channelMask))
<< "Conversion of \"" << stringVal << "\" failed (as output channel mask)";
EXPECT_TRUE(OutputChannelConverter::toString(channelMask, stringValBack))
<< "Conversion of output channel mask " << channelMask << " failed";
EXPECT_TRUE(OutputChannelConverter::fromString(stringValBack, channelMaskBack))
<< "Conversion of \"" << stringValBack << "\" failed (as output channel mask)";
EXPECT_EQ(channelMask, channelMaskBack);
} else if (stringVal.find("_CHANNEL_INDEX_") != std::string::npos) {
EXPECT_TRUE(ChannelIndexConverter::fromString(stringVal, channelMask))
<< "Conversion of \"" << stringVal << "\" failed (as indexed channel mask)";
EXPECT_TRUE(ChannelIndexConverter::toString(channelMask, stringValBack))
<< "Conversion of indexed channel mask " << channelMask << " failed";
EXPECT_EQ(stringVal, stringValBack);
} else if (stringVal == toString(xsd::AudioChannelMask::AUDIO_CHANNEL_NONE)) {
EXPECT_FALSE(InputChannelConverter::fromString(stringVal, channelMask))
<< "Conversion of \"" << stringVal << "\" succeeded (as input channel mask)";
EXPECT_FALSE(OutputChannelConverter::fromString(stringVal, channelMask))
<< "Conversion of \"" << stringVal << "\" succeeded (as output channel mask)";
EXPECT_FALSE(ChannelIndexConverter::fromString(stringVal, channelMask))
<< "Conversion of \"" << stringVal << "\" succeeded (as index channel mask)";
// None of Converters could parse this because 'NONE' isn't a 'valid' channel mask.
channelMask = AUDIO_CHANNEL_NONE;
// However they all must succeed in converting it back.
EXPECT_TRUE(InputChannelConverter::toString(channelMask, stringValBack))
<< "Conversion of input channel mask " << channelMask << " failed";
EXPECT_EQ(stringVal, stringValBack);
EXPECT_TRUE(OutputChannelConverter::toString(channelMask, stringValBack))
<< "Conversion of output channel mask " << channelMask << " failed";
EXPECT_EQ(stringVal, stringValBack);
EXPECT_TRUE(ChannelIndexConverter::toString(channelMask, stringValBack))
<< "Conversion of indexed channel mask " << channelMask << " failed";
EXPECT_EQ(stringVal, stringValBack);
} else {
FAIL() << "Unrecognized channel mask \"" << stringVal << "\"";
}
}
}
TEST(TypeConverter, ParseContentTypes) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioContentType>{}) {
const std::string stringVal = toString(enumVal);
audio_content_type_t contentType;
EXPECT_TRUE(AudioContentTypeConverter::fromString(stringVal, contentType))
<< "Conversion of \"" << stringVal << "\" failed";
EXPECT_EQ(stringVal, toString(contentType));
}
}
TEST(TypeConverter, ParseDevices) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioDevice>{}) {
const std::string stringVal = toString(enumVal);
audio_devices_t device, deviceBack;
std::string stringValBack;
EXPECT_TRUE(DeviceConverter::fromString(stringVal, device))
<< "Conversion of \"" << stringVal << "\" failed";
if (enumVal != xsd::AudioDevice::AUDIO_DEVICE_NONE) {
EXPECT_TRUE(audio_is_input_device(device) || audio_is_output_device(device))
<< "Device \"" << stringVal << "\" is neither input, nor output device";
} else {
EXPECT_FALSE(audio_is_input_device(device));
EXPECT_FALSE(audio_is_output_device(device));
}
// Due to aliased values, the result of 'toString' might not be the same
// as 'stringVal', thus we need to compare the results of parsing instead.
stringValBack = toString(device);
EXPECT_TRUE(DeviceConverter::fromString(stringValBack, deviceBack))
<< "Conversion of \"" << stringValBack << "\" failed";
EXPECT_EQ(device, deviceBack);
}
}
TEST(TypeConverter, ParseInOutDevices) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioDevice>{}) {
const std::string stringVal = toString(enumVal);
audio_devices_t device, deviceBack;
std::string stringValBack;
if (stringVal.find("_DEVICE_IN_") != std::string::npos) {
EXPECT_TRUE(InputDeviceConverter::fromString(stringVal, device))
<< "Conversion of \"" << stringVal << "\" failed (as input device)";
// Due to aliased values, the result of 'toString' might not be the same
// as 'stringVal', thus we need to compare the results of parsing instead.
stringValBack = toString(device);
EXPECT_TRUE(InputDeviceConverter::fromString(stringValBack, deviceBack))
<< "Conversion of \"" << stringValBack << "\" failed";
EXPECT_EQ(device, deviceBack);
} else if (stringVal.find("_DEVICE_OUT_") != std::string::npos) {
EXPECT_TRUE(OutputDeviceConverter::fromString(stringVal, device))
<< "Conversion of \"" << stringVal << "\" failed (as output device)";
stringValBack = toString(device);
EXPECT_TRUE(OutputDeviceConverter::fromString(stringValBack, deviceBack))
<< "Conversion of \"" << stringValBack << "\" failed";
EXPECT_EQ(device, deviceBack);
} else if (stringVal == toString(xsd::AudioDevice::AUDIO_DEVICE_NONE)) {
EXPECT_FALSE(InputDeviceConverter::fromString(stringVal, device))
<< "Conversion of \"" << stringVal << "\" succeeded (as input device)";
EXPECT_FALSE(OutputDeviceConverter::fromString(stringVal, device))
<< "Conversion of \"" << stringVal << "\" succeeded (as output device)";
EXPECT_EQ(stringVal, toString(device));
} else {
FAIL() << "Unrecognized audio device \"" << stringVal << "\"";
}
}
}
TEST(TypeConverter, ParseInOutFlags) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioInOutFlag>{}) {
const std::string stringVal = toString(enumVal);
if (stringVal.find("_INPUT_FLAG_") != std::string::npos) {
audio_input_flags_t flag;
EXPECT_TRUE(InputFlagConverter::fromString(stringVal, flag))
<< "Conversion of \"" << stringVal << "\" failed (as input flag)";
EXPECT_EQ(stringVal, toString(flag));
} else {
audio_output_flags_t flag;
EXPECT_TRUE(OutputFlagConverter::fromString(stringVal, flag))
<< "Conversion of \"" << stringVal << "\" failed (as output flag)";
EXPECT_EQ(stringVal, toString(flag));
}
}
}
TEST(TypeConverter, ParseFormats) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioFormat>{}) {
const std::string stringVal = toString(enumVal);
audio_format_t format;
EXPECT_TRUE(FormatConverter::fromString(stringVal, format))
<< "Conversion of \"" << stringVal << "\" failed";
EXPECT_EQ(enumVal != xsd::AudioFormat::AUDIO_FORMAT_DEFAULT,
audio_is_valid_format(format))
<< "Validity of \"" << stringVal << "\" is not as expected";
EXPECT_EQ(stringVal, toString(format));
}
}
TEST(TypeConverter, ParseGainModes) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioGainMode>{}) {
const std::string stringVal = toString(enumVal);
audio_gain_mode_t gainMode;
EXPECT_TRUE(GainModeConverter::fromString(stringVal, gainMode))
<< "Conversion of \"" << stringVal << "\" failed";
EXPECT_EQ(stringVal, toString(gainMode));
}
}
TEST(TypeConverter, ParseSources) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioSource>{}) {
const std::string stringVal = toString(enumVal);
audio_source_t source;
EXPECT_TRUE(SourceTypeConverter::fromString(stringVal, source))
<< "Conversion of \"" << stringVal << "\" failed";
EXPECT_EQ(source != AUDIO_SOURCE_DEFAULT, audio_is_valid_audio_source(source))
<< "Validity of \"" << stringVal << "\" is not as expected";
EXPECT_EQ(stringVal, toString(source));
}
}
TEST(TypeConverter, ParseStreamTypes) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioStreamType>{}) {
const std::string stringVal = toString(enumVal);
audio_stream_type_t streamType;
EXPECT_TRUE(StreamTypeConverter::fromString(stringVal, streamType))
<< "Conversion of \"" << stringVal << "\" failed";
EXPECT_EQ(stringVal, toString(streamType));
}
}
TEST(TypeConverter, ParseUsages) {
for (const auto enumVal : xsdc_enum_range<xsd::AudioUsage>{}) {
const std::string stringVal = toString(enumVal);
audio_usage_t usage;
EXPECT_TRUE(UsageTypeConverter::fromString(stringVal, usage))
<< "Conversion of \"" << stringVal << "\" failed";
EXPECT_EQ(stringVal, toString(usage));
}
}